Commit 8fcabf74 authored by wanglei's avatar wanglei

初始化项目

parent c175ca14
Pipeline #1141 failed with stages
package com.test.basd.smartjunkcleaner
import android.annotation.SuppressLint
import android.app.Activity
import android.app.job.JobInfo
import android.app.job.JobScheduler
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.AppUtils
import com.google.android.gms.ads.MobileAds
import com.google.android.gms.ads.identifier.AdvertisingIdClient
import com.google.firebase.FirebaseApp
import com.test.basd.smartjunkcleaner.activity.splash.NewSplashActivity
import com.test.basd.smartjunkcleaner.display.ActionBroadcast.Companion.initBroadcast
import com.test.basd.smartjunkcleaner.display.fcm.FcmHelper
import com.test.basd.smartjunkcleaner.display.fcm.NotificationJobService
import com.test.basd.smartjunkcleaner.helps.BaseApplication
import com.test.basd.smartjunkcleaner.helps.ComUtils.requestCfg
import com.test.basd.smartjunkcleaner.helps.ConfigHelper
import com.test.basd.smartjunkcleaner.helps.InstallHelps
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
class MyApplication : BaseApplication() {
companion object {
var PAUSED_VALUE = 0
}
override fun init() {
initApp()
}
fun initApp() {
if (ConfigHelper.ifAgreePrivacy) {
MainScope().launch(Dispatchers.IO) {
try {
ConfigHelper.gid = AdvertisingIdClient.getAdvertisingIdInfo(context).id ?: ""
} catch (_: Exception) {
}
}
initNotificationWork()
context.initBroadcast()
MainScope().launch {
requestCfg()
InstallHelps.init()
}
}
MobileAds.initialize(this) { initializationStatus ->
val statusMap =
initializationStatus.adapterStatusMap
for (adapterClass in statusMap.keys) {
val status = statusMap[adapterClass]
Log.d(
"MyApp", String.format(
"Adapter name: %s, Description: %s, Latency: %d",
adapterClass, status!!.description, status.latency
)
)
}
}
initLifeListener()
}
private fun initNotificationWork() {
FirebaseApp.initializeApp(this)
FcmHelper.getToken()
FcmHelper.subscribeToTopic()
FcmHelper.startFCMCheckAlarm(this)
initJob()
}
private fun initJob() {
val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
val job = JobInfo.Builder(0, ComponentName(this, NotificationJobService::class.java))
.setMinimumLatency(0L)
.setOverrideDeadline(0L)
.setPersisted(true)
.build()
jobScheduler.schedule(job)
}
@SuppressLint("UnspecifiedRegisterReceiverFlag")
private fun initLifeListener() {
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
private var count = 0
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
override fun onActivityStarted(activity: Activity) {
// Log.e("onActivityStarted", "activity=$activity")
count++
if (count == 1 && !AppUtils.isAppForeground()) {
val topActivity = ActivityUtils.getTopActivity()
if (ConfigHelper.noLoadingActivities.all {
!topActivity.localClassName.contains(
it, true
)
}) {
if (AdmobUtils.isOpenAdLoaded()) {
AdmobUtils.showAppOpenAd(activity)
} else {
topActivity.startActivity(
Intent(
topActivity,
NewSplashActivity::class.java
).apply {
putExtra("isHotLaunch", true)
})
}
}
}
}
override fun onActivityResumed(activity: Activity) {
PAUSED_VALUE = 1
}
override fun onActivityPaused(activity: Activity) {
PAUSED_VALUE = 2
}
override fun onActivityStopped(activity: Activity) {
count--
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
override fun onActivityDestroyed(activity: Activity) {}
})
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.animation.Animator
import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraManager
import android.location.LocationManager
import android.os.BatteryManager
import android.os.Build
import android.os.SystemClock
import android.provider.Settings
import android.view.View
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.activity.addCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.isVisible
import com.test.basd.smartjunkcleaner.R
import com.test.basd.smartjunkcleaner.databinding.ActivityBatteryInfoBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
import com.test.basd.smartjunkcleaner.view.AFunOb
import java.util.Calendar
import java.util.Date
import kotlin.math.roundToInt
@SuppressLint("SetTextI18n")
class BatteryInfoActivity : BaseActivity<ActivityBatteryInfoBinding>() {
override val isLightMode = true
private lateinit var receiver: BatteryReceiver
private lateinit var cm: CameraManager
private lateinit var cameraId: String
private var isTorchOn = false
override val binding: ActivityBatteryInfoBinding by lazy {
ActivityBatteryInfoBinding.inflate(layoutInflater)
}
override fun initView() {
receiver = BatteryReceiver()
val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
registerReceiver(receiver, filter)
cm = getSystemService(Context.CAMERA_SERVICE) as CameraManager
try {
cameraId = cm.cameraIdList[0]
} catch (e: CameraAccessException) {
e.printStackTrace()
}
setFilter()
binding.idBatteryLottie.imageAssetsFolder = "dian_smax_chi/images/"
binding.idBatteryLottie.setAnimation("dian_smax_chi/data.json")
binding.idBatteryLottie.playAnimation()
binding.root.postDelayed({
playFinish()
}, 5000)
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
AdmobUtils.showInterstitialAd(this@BatteryInfoActivity) {
finishToMain()
}
}
})
binding.switchTwo.setOnClickListener {
turnOnBluetooth()
}
binding.switchThree.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
turnOnFlashLight()
} else {
turnOffFlashLight()
}
}
binding.switchFour.setOnClickListener {
jumpLocationSettings()
}
binding.btOk.setOnClickListener {
binding.btOk.setBackgroundResource(R.drawable.bg_shape_set_click)
startActivity(Intent(this, ResultActivity::class.java).apply {
putExtra("from", AFunOb.BATTERY_INFO)
})
finish()
}
binding.ivBack.setOnClickListener {
AdmobUtils.showInterstitialAd(this@BatteryInfoActivity) {
finishToMain()
}
}
onBackPressedDispatcher.addCallback {
AdmobUtils.showInterstitialAd(this@BatteryInfoActivity) {
finishToMain()
}
}
}
private val result1 =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
}
private val result2 =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
}
private val settingResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
}
private inner class BatteryReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val current = intent?.extras?.getInt("level")?:0
val total = intent?.extras?.getInt("scale")?:0
val percent = current * 100 / total
if (percent >= 30) {
binding.imagePower.setImageResource(R.mipmap.batteryl)
} else {
binding.imagePower.setImageResource(R.mipmap.batteryh)
}
binding.tvLevel.text = "$percent%"
}
}
private fun playFinish() {
binding.idConsOne.isVisible = false
binding.idConsBatteryFinish.isVisible = true
binding.idBatteryFinish.addAnimatorListener(object : Animator.AnimatorListener {
override fun onAnimationStart(p0: Animator) {
}
override fun onAnimationEnd(p0: Animator) {
AdmobUtils.showInterstitialAd(this@BatteryInfoActivity) {
updateUI()
}
}
override fun onAnimationCancel(p0: Animator) {
}
override fun onAnimationRepeat(p0: Animator) {
}
})
}
private fun checkFlashLight() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
cm.registerTorchCallback(object : CameraManager.TorchCallback() {
override fun onTorchModeChanged(cameraId: String, enabled: Boolean) {
super.onTorchModeChanged(cameraId, enabled)
if (cameraId == this@BatteryInfoActivity.cameraId) {
if (enabled && !isTorchOn) {
isTorchOn = true
binding.switchThree.isChecked = true
} else if (!enabled && isTorchOn) {
isTorchOn = false
binding.switchThree.isChecked = false
}
}
}
}, null)
} else {
Toast.makeText(this, "don't support you phone", Toast.LENGTH_SHORT).show()
}
}
private fun turnOnFlashLight() {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
cm.setTorchMode(cameraId, true)
} // 打开手电筒
} catch (e: CameraAccessException) {
e.printStackTrace()
}
}
private fun turnOffFlashLight() {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
cm.setTorchMode(cameraId, false)
} // 打开手电筒
} catch (e: CameraAccessException) {
e.printStackTrace()
}
}
private fun jumpLocationSettings() {
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
settingResult.launch(intent)
}
private fun checkLocation() {
binding.switchFour.isChecked = isLocationEnabled(this)
}
private fun isLocationEnabled(context: Context): Boolean {
val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
}
private fun setFilter() {
val filter1 = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
binding.tvVo.text = "${
(registerReceiver(null, filter1)?.getIntExtra("voltage", 0)
?.toFloat()!!).roundToInt() / 1000.0
}V"
binding.tvTemp.text = "${
(registerReceiver(null, filter1)?.getIntExtra("temperature", 0)
?.toFloat()!!).roundToInt() / 10.0
}°C"
val uptime = SystemClock.elapsedRealtime()
val currantTime = Calendar.getInstance().time
val batteryUseTime = currantTime.time - uptime
val batteryDate = Date(batteryUseTime)
binding.tvTime.text = "${batteryDate.hours} H ${batteryDate.minutes} M"
val bm = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
val chargeCounter = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER)
val pCapacity = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
if (chargeCounter != Int.MIN_VALUE && pCapacity != Int.MIN_VALUE) {
binding.tvMa.text = "${
String.format("%.1f", (chargeCounter / (pCapacity.toFloat() / 100f)) / 1000f)
} mAh"
}
}
private fun updateUI() {
binding.idBatteryLottie.visibility = View.GONE
binding.idConsBatteryFinish.isVisible = false
binding.llContent.isVisible = true
}
override fun onResume() {
super.onResume()
binding.btOk.setBackgroundResource(R.drawable.bg_shape_set)
checkFlashLight()
checkLocation()
}
fun turnOnBluetooth() {
val intent2 = Intent(Settings.ACTION_BLUETOOTH_SETTINGS)
result1.launch(intent2)
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(receiver);
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.content.Intent
import android.graphics.Color
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutCleanGuestBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
/**
* 清理功能引导
*/
class CleanGuestActivity : BaseActivity<ActivityLayoutCleanGuestBinding>() {
override val binding: ActivityLayoutCleanGuestBinding by lazy {
ActivityLayoutCleanGuestBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.root.postDelayed({
binding.idTvSkip.isVisible = true
}, 3000)
binding.idTvSkip.setOnClickListener {
finishToMain()
}
binding.idTvClean.setOnClickListener {
startActivity(Intent(this, PrepareScanActivity::class.java))
finish()
}
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.animation.ValueAnimator
import android.content.Intent
import android.graphics.Color
import android.view.animation.LinearInterpolator
import androidx.core.animation.doOnEnd
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutCleanupingBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.ConfigHelper
import com.test.basd.smartjunkcleaner.helps.FileHelps
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
import com.test.basd.smartjunkcleaner.view.AFunOb
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import java.io.File
import kotlin.random.Random
class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() {
override val isLightMode = true
override val binding: ActivityLayoutCleanupingBinding by lazy {
ActivityLayoutCleanupingBinding.inflate(layoutInflater)
}
private val intentSize by lazy {
intent.getLongExtra("size", -1)
}
private val listPath by lazy {
intent.getStringArrayExtra("list") ?: arrayOf()
}
var isDeleSuc = false
private var size = 0L
override fun initView() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
ConfigHelper.junkSizeClean = ConfigHelper.junkSizeClean+intentSize
MainScope().launch(Dispatchers.IO) {
try {
FileHelps.fileList.clear()
listPath.forEach {
val file = File(it)
if (FileHelps.deleteFile(file)) {
isDeleSuc = true
}
}
} catch (_: Exception) {
} finally {
}
}
playAnm()
}
private fun playAnm() {
ValueAnimator.ofFloat(0f, 360f).run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.idYuan.rotation = it.animatedValue as Float
}
start()
}
ValueAnimator.ofInt(0, 100).run {
duration = Random.nextLong(7000, 8000)
interpolator = LinearInterpolator()
addUpdateListener {
binding.idTvJd.text = "${it.animatedValue as Int}"
}
doOnEnd {
AdmobUtils.showInterstitialAd(this@CleaningActivity) {
startActivity(Intent(this@CleaningActivity, ResultActivity::class.java).putExtra("from", AFunOb.JUNK_CLEANER).putExtra("clean_size", intentSize))
finish()
}
}
start()
}
ValueAnimator.ofFloat(0f, 360f).run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.idView1.rotation = it.animatedValue as Float
}
start()
}
ValueAnimator.ofFloat(0f, 360f).run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.idView2.rotation = it.animatedValue as Float
}
start()
}
ValueAnimator.ofFloat(0f, 360f).run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.idView3.rotation = it.animatedValue as Float
}
start()
}
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.content.Intent
import android.graphics.Color
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutGuestBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.ConfigHelper
import kotlin.random.Random
/**
* 引导动画页面
*/
class GuestActivity : BaseActivity<ActivityLayoutGuestBinding>() {
override val binding: ActivityLayoutGuestBinding by lazy {
ActivityLayoutGuestBinding.inflate(layoutInflater)
}
private var mProgress = 0
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
ConfigHelper.ifGuest = true
binding.idLottie.imageAssetsFolder = "sao_smax_miao/images/"
binding.idLottie.setAnimation("sao_smax_miao/data.json")
binding.idLottie.playAnimation()
loadPro()
}
private fun loadPro() {
if (mProgress >= 100) {
binding.idSJindu.progress = mProgress
startActivity(Intent(this, CleanGuestActivity::class.java))
finish()
return
}
binding.idSJindu.postDelayed({
mProgress += Random.nextInt(5)
binding.idSJindu.progress = mProgress
loadPro()
}, 80)
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.graphics.Color
import android.graphics.Typeface
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.blankj.utilcode.util.AppUtils
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.databinding.ActivityMainBinding
import com.test.basd.smartjunkcleaner.fragment.HomeFragment
import com.test.basd.smartjunkcleaner.fragment.ToolsFragment
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
import com.test.basd.smartjunkcleaner.view.RateStarPop
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class MainActivity : BaseActivity<ActivityMainBinding>() {
override val isLightMode = true
override val binding: ActivityMainBinding by lazy {
ActivityMainBinding.inflate(layoutInflater)
}
private val homeFragment by lazy {
HomeFragment()
}
private val toolsFragment by lazy {
ToolsFragment()
}
private val fragments by lazy {
mutableListOf(homeFragment, toolsFragment)
}
private lateinit var batteryReceiver: BatteryReceiver
override fun initView() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
AdmobUtils.loadNativeAd()
// binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.idVp.run {
adapter = object : FragmentStateAdapter(this@MainActivity) {
override fun getItemCount(): Int {
return fragments.size
}
override fun createFragment(position: Int): Fragment {
return fragments[position]
}
}
}
binding.idVp.registerOnPageChangeCallback(object :
ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
setPage(position)
}
})
binding.idBottom1.setOnClickListener {
binding.idVp.currentItem = 0
}
binding.idBottom2.setOnClickListener {
binding.idVp.currentItem = 1
}
batteryReceiver = BatteryReceiver()
val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
registerReceiver(batteryReceiver, filter)
}
private fun setPage(p: Int) {
binding.idBottom1.isSelected = false
binding.idBottom2.isSelected = false
binding.idTv1.typeface = Typeface.DEFAULT
binding.idTv2.typeface = Typeface.DEFAULT
when (p) {
0 -> {
binding.idBottom1.isSelected = true
binding.idTv1.typeface = Typeface.DEFAULT_BOLD
}
1 -> {
binding.idBottom2.isSelected = true
binding.idTv2.typeface = Typeface.DEFAULT_BOLD
}
}
}
var level = 0
private inner class BatteryReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val current = intent?.extras!!.getInt("level")
val total = intent.extras!!.getInt("scale")
level = current * 100 / total
}
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(batteryReceiver)
}
override fun onResume() {
super.onResume()
if (AppUtils.isAppForeground()) {
lifecycleScope.launch(Dispatchers.Main) {
delay(1000)
RateStarPop.show(this@MainActivity)
}
}
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import androidx.appcompat.app.AppCompatActivity
import com.test.basd.smartjunkcleaner.R
import com.test.basd.smartjunkcleaner.view.PermisonPopWindow
class PermissionTripActivity : AppCompatActivity() {
companion object {
fun launch(activity: Activity) {
activity.startActivity(
Intent(activity, PermissionTripActivity::class.java)
)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_layout_permisson_trip)
initView()
}
private fun initView() {
Handler().postDelayed({
PermisonPopWindow(this) {
finish()
}.show()
}, 500)
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.animation.ValueAnimator
import android.content.Intent
import android.graphics.Color
import android.view.animation.LinearInterpolator
import androidx.activity.OnBackPressedCallback
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutParepreScanBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
/**
* 引导清理扫描页
*/
class PrepareScanActivity : BaseActivity<ActivityLayoutParepreScanBinding>() {
override val binding: ActivityLayoutParepreScanBinding by lazy {
ActivityLayoutParepreScanBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.idBackJunkScan.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finishToMain()
}
})
}
override fun onStart() {
super.onStart()
checkPermission()
}
var isplay = 0
override fun onPermissionsResult(isGranted: Boolean) {
// Log.e("MXL", "权限回调: " + isGranted)
if (isGranted) {
isplay += 1
if (isplay == 1) {
playLottie()
}
} else {
finishToMain()
}
}
private fun playLottie() {
ValueAnimator.ofFloat(0f, 360f).run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.idView1.rotation = it.animatedValue as Float
}
start()
}
ValueAnimator.ofFloat(0f, 360f).run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.idView2.rotation = it.animatedValue as Float
}
start()
}
ValueAnimator.ofFloat(0f, 360f).run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.idView3.rotation = it.animatedValue as Float
}
start()
}
binding.idJunkScan.imageAssetsFolder = "sao_smax_miao/images/"
binding.idJunkScan.setAnimation("sao_smax_miao/data.json")
binding.idJunkScan.playAnimation()
binding.root.postDelayed({
AdmobUtils.showInterstitialAd(this) {
startActivity(Intent(this, CleanJunkActivity::class.java))
finish()
}
}, 6000)
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.annotation.SuppressLint
import android.graphics.Color
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutWebPrivacyBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
class PrivacyWebActivity : BaseActivity<ActivityLayoutWebPrivacyBinding>() {
override val binding: ActivityLayoutWebPrivacyBinding by lazy {
ActivityLayoutWebPrivacyBinding.inflate(layoutInflater)
}
@SuppressLint("SetJavaScriptEnabled")
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.idWeb.settings.setJavaScriptEnabled(true)
binding.idWeb.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
view?.loadUrl(url!!)
return true
}
}
binding.idWeb.loadUrl("https://sites.google.com/view/cleanmastermax/home")
binding.idBack.setOnClickListener {
finishToMain()
}
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.activity.OnBackPressedCallback
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.FileUtils
import com.blankj.utilcode.util.ToastUtils
import com.bumptech.glide.Glide
import com.test.basd.smartjunkcleaner.R
import com.test.basd.smartjunkcleaner.bean.ImageDataBean
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutRepeaterdPhotoBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.BaseApplication
import com.test.basd.smartjunkcleaner.helps.FileHelps
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
class RepeaterdPhotoActivity: BaseActivity<ActivityLayoutRepeaterdPhotoBinding>() {
private var isSelectAll = false
override val binding: ActivityLayoutRepeaterdPhotoBinding by lazy {
ActivityLayoutRepeaterdPhotoBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.idTvDelete.isEnabled = false
initListener()
}
override fun initListener(){
binding.idBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
AdmobUtils.showInterstitialAd(this@RepeaterdPhotoActivity){
finishToMain()
}
}
})
binding.idImgSelect.setOnClickListener {
if (isSelectAll) {
isSelectAll = false
binding.idTvAll.text = "All"
binding.idImgSelect.setImageResource(R.mipmap.xuan_3)
} else {
isSelectAll = true
binding.idTvAll.text = "Cancel"
binding.idImgSelect.setImageResource(R.mipmap.danxuanxe)
}
fileList.forEach { it.isSelect = isSelectAll }
mAdapter.notifyItemRangeChanged(0, fileList.size, 1)
setTvStatus()
}
binding.idTvDelete.setOnClickListener {
AdmobUtils.showInterstitialAd(this){
val list = fileList.toList().filter { it.isSelect }
if (list.isNotEmpty() && list.all { FileUtils.delete(it.path) }) {
fileList.removeAll(list)
FileHelps.similarImageList.removeAll(list)
mAdapter.notifyDataSetChanged()
setTvStatus()
ToastUtils.showShort("Delete Successful")
} else {
ToastUtils.showShort("Delete failed.")
}
}
}
}
private var fileList = mutableListOf<ImageDataBean>()
override fun onStart() {
super.onStart()
checkPermission()
}
override fun onPermissionsResult(isGranted: Boolean) {
if(isGranted){
FileHelps.getImageFiles {
AdmobUtils.showInterstitialAd(this)
binding.idLlScaning.isVisible = false
binding.idLlResult.isVisible = true
fileList = FileHelps.similarImageList
binding.idTvNoData.isVisible = fileList.size == 0
binding.idTvDelete.isVisible = fileList.size > 0
binding.idTvAll.isVisible = fileList.size > 0
binding.idImgSelect.isVisible = fileList.size > 0
binding.idRlList.layoutManager = GridLayoutManager(this, 3)
binding.idRlList.adapter = mAdapter
}
}else{
finishToMain()
}
}
private fun setTvStatus() {
val it = fileList.filter { it.isSelect }
binding.idTvDelete.isEnabled = it.isNotEmpty()
}
private val mAdapter by lazy {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val ivImage: ImageView
val ivSelect: ImageView
init {
ivImage = view.findViewById(R.id.iv_image)
ivSelect = view.findViewById(R.id.id_img_sel)
}
}
object : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(this@RepeaterdPhotoActivity).inflate(
R.layout.item_layout_repeater_photo, parent, false
)
return ViewHolder(view)
}
override fun getItemCount() = fileList.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = fileList[position]
Glide.with(BaseApplication.context).load(item.path).into(holder.ivImage)
holder.ivSelect.isVisible = true
holder.itemView.setOnClickListener {
item.isSelect = !item.isSelect
notifyItemChanged(position, 1)
if (fileList.all { it.isSelect }) {
isSelectAll = true
binding.idTvAll.text = "Cancel"
binding.idImgSelect.setImageResource(R.mipmap.danxuanxe)
} else {
isSelectAll = false
binding.idTvAll.text = "All"
binding.idImgSelect.setImageResource(R.mipmap.xuan_3)
}
setTvStatus()
}
}
override fun onBindViewHolder(
holder: ViewHolder,
position: Int,
payloads: MutableList<Any>
) {
super.onBindViewHolder(holder, position, payloads)
val item = fileList[position]
holder.ivSelect.setImageResource(
if (item.isSelect) {
R.mipmap.danxuanxe
} else {
R.mipmap.xuan_3
}
)
}
}
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.content.Intent
import android.graphics.Color
import androidx.activity.OnBackPressedCallback
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.SPUtils
import com.test.basd.smartjunkcleaner.activity.photocompress.photo.StartCompressionPhotoActivity
import com.test.basd.smartjunkcleaner.adapter.AppFunctionAdapter
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutResultBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.KotlinExt.toFormatSize
import com.test.basd.smartjunkcleaner.notificationclean.NotificationCleanActivity
import com.test.basd.smartjunkcleaner.notificationclean.NotificationGuestActivity
import com.test.basd.smartjunkcleaner.view.AFunOb.APP_MANAGER
import com.test.basd.smartjunkcleaner.view.AFunOb.APP_SPEED
import com.test.basd.smartjunkcleaner.view.AFunOb.BATTERY_INFO
import com.test.basd.smartjunkcleaner.view.AFunOb.BATTERY_OPTIMIZER
import com.test.basd.smartjunkcleaner.view.AFunOb.EMPTY_FILE_CLEANER
import com.test.basd.smartjunkcleaner.view.AFunOb.JUNK_CLEANER
import com.test.basd.smartjunkcleaner.view.AFunOb.LARGE_FILE_CLEANER
import com.test.basd.smartjunkcleaner.view.AFunOb.NETWORK_TRAFFIC
import com.test.basd.smartjunkcleaner.view.AFunOb.NOTIFICATION_CLEANER
import com.test.basd.smartjunkcleaner.view.AFunOb.PHOTO_COMPRESS
import com.test.basd.smartjunkcleaner.view.AFunOb.RECENT_APP_USAGE
import com.test.basd.smartjunkcleaner.view.AFunOb.SIMILAR_PHOTOS
class ResultActivity : BaseActivity<ActivityLayoutResultBinding>() {
override val binding: ActivityLayoutResultBinding by lazy {
ActivityLayoutResultBinding.inflate(layoutInflater)
}
private lateinit var adapter: AppFunctionAdapter
override fun initView() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight())
adapter = AppFunctionAdapter {
when (it) {
JUNK_CLEANER -> {
startActivity(Intent(this, ScanJunkActivity::class.java))
}
// VIRUS_SCAN -> {
// startActivity(Intent(this, VirusActivity::class.java))
// }
RECENT_APP_USAGE -> {
startActivity(Intent(this, RecentAppActivity::class.java))
}
LARGE_FILE_CLEANER -> {
startActivity(Intent(this, LargeFileCleanActivity::class.java))
}
NOTIFICATION_CLEANER -> {
if (SPUtils.getInstance().getBoolean("notification_guest", false)) {
startActivity(
Intent(
this,
NotificationCleanActivity::class.java
)
)
} else {
startActivity(
Intent(
this,
NotificationGuestActivity::class.java
)
)
}
}
NETWORK_TRAFFIC -> {
startActivity(Intent(this, NetWorkActivity::class.java))
}
APP_MANAGER -> {
startActivity(Intent(this, AppManagerActivity::class.java))
}
BATTERY_INFO -> {
startActivity(Intent(this, BatteryInfoActivity::class.java))
}
SIMILAR_PHOTOS -> {
startActivity(Intent(this, RepeaterdPhotoActivity::class.java))
}
PHOTO_COMPRESS -> {
startActivity(Intent(this, StartCompressionPhotoActivity::class.java))
}
}
finish()
}
binding.rvFun.adapter = adapter
adapter.updateListPostion()
adapter.notifyDataSetChanged()
val wenBen = intent.getStringExtra("wenBen")
binding.tvInfo.text = wenBen
val from = intent.getStringExtra("from")
when (from) {
JUNK_CLEANER -> {
if (intent.getLongExtra("clean_size", 0L) > 0) {
binding.tvInfo.text =
"Cleaned up ${
intent.getLongExtra("clean_size", 0L).toFormatSize(1)
}"
} else {
binding.tvInfo.text = "No junk files found."
}
SPUtils.getInstance().put("last_use_junk_cleaner", System.currentTimeMillis())
}
RECENT_APP_USAGE -> {
binding.tvInfo.text = ""
}
LARGE_FILE_CLEANER -> {
binding.tvInfo.text = ""
}
NOTIFICATION_CLEANER -> {
binding.tvInfo.text = ""
}
NETWORK_TRAFFIC -> {
binding.tvInfo.text = ""
}
APP_MANAGER -> {
binding.tvInfo.text = ""
}
BATTERY_INFO -> {
binding.tvInfo.text = "Battery scan completed."
SPUtils.getInstance().put("last_use_battery_info", System.currentTimeMillis())
}
EMPTY_FILE_CLEANER -> {
binding.tvInfo.text = ""
}
PHOTO_COMPRESS -> {
binding.tvInfo.text =
"Compress ${intent.getIntExtra("num", 0)} photo, ${
intent.getLongExtra(
"size",
0L
).toFormatSize(1)
} space freed"
}
BATTERY_OPTIMIZER -> {
binding.tvInfo.text = "Optimization completed"
}
APP_SPEED -> {
binding.tvInfo.text = "Optimization completed"
}
else -> {}
}
from?.let {
binding.tvTitle.text = it
adapter.removeItem(it)
}
//load gif
// Glide.with(this)
// .asGif()
// .load(R.mipmap.success)
// .into(object : ImageViewTarget<GifDrawable>(vb.icSuccess) {
// override fun onResourceReady(
// resource: GifDrawable,
// transition: Transition<in GifDrawable>?
// ) {
// super.onResourceReady(resource, transition)
// resource.setLoopCount(1)
// resource.start()
// }
//
// override fun setResource(resource: GifDrawable?) {
// view.setImageDrawable(resource)
// }
//
// })
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finishToMain()
// AdmobUtils.showInterstitialAd(this@ResultActivity) {
//
// }
}
})
binding.ivBack.setOnClickListener {
finishToMain()
}
}
override fun onResume() {
super.onResume()
}
override fun onDestroy() {
super.onDestroy()
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.animation.ValueAnimator
import android.content.Intent
import android.view.animation.LinearInterpolator
import androidx.activity.OnBackPressedCallback
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutScanJunkBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
override val isLightMode = true
override val binding: ActivityLayoutScanJunkBinding by lazy {
ActivityLayoutScanJunkBinding.inflate(layoutInflater)
}
override fun initView() {
binding.idBackJunkScan.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finishToMain()
}
})
}
override fun onStart() {
super.onStart()
checkPermission()
}
var isplay = 0
override fun onPermissionsResult(isGranted: Boolean) {
if (isGranted) {
isplay += 1
if (isplay == 1) {
playLottie()
}
} else {
finishToMain()
}
}
private fun playLottie() {
ValueAnimator.ofFloat(0f, 360f).run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.idView1.rotation = it.animatedValue as Float
}
start()
}
ValueAnimator.ofFloat(0f, 360f).run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.idView2.rotation = it.animatedValue as Float
}
start()
}
ValueAnimator.ofFloat(0f, 360f).run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.idView3.rotation = it.animatedValue as Float
}
start()
}
binding.idJunkScan.imageAssetsFolder = "sao_smax_miao/images/"
binding.idJunkScan.setAnimation("sao_smax_miao/data.json")
binding.idJunkScan.playAnimation()
binding.root.postDelayed({
AdmobUtils.showInterstitialAd(this) {
startActivity(Intent(this, CleanJunkActivity::class.java))
finish()
}
}, 5000)
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.animation.Animator
import android.graphics.Color
import android.media.AudioManager
import android.media.MediaPlayer
import androidx.activity.OnBackPressedCallback
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.ToastUtils
import com.test.basd.smartjunkcleaner.R
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutSpeakerCleaningBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
class SpeakCleaningActivity : BaseActivity<ActivityLayoutSpeakerCleaningBinding>() {
private val zAudio by lazy {
MediaPlayer.create(this, R.raw.z)
}
override val binding: ActivityLayoutSpeakerCleaningBinding by lazy {
ActivityLayoutSpeakerCleaningBinding.inflate(layoutInflater)
}
override fun initView() {
val audioManager = this.getSystemService(AUDIO_SERVICE) as AudioManager
val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, 0)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.idSpeakCleanLottie.imageAssetsFolder = "speak_smax_clean/images/"
binding.idSpeakCleanLottie.setAnimation("speak_smax_clean/data.json")
binding.idSpeakCleanLottie.playAnimation()
binding.root.postDelayed({
zAudio.stop()
binding.idLlP1.isVisible = false
binding.idLlP2.isVisible = true
playComplete()
}, 30000)
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
ToastUtils.showShort("Cleaning,Please wait a moment")
}
})
}
override fun onStart() {
super.onStart()
zAudio.start()
}
override fun onStop() {
super.onStop()
try {
zAudio.pause()
} catch (e: Exception) {
zAudio.stop()
}
}
override fun onDestroy() {
super.onDestroy()
zAudio.release()
}
private fun playComplete() {
binding.idLottieComplete.playAnimation()
binding.idLottieComplete.addLottieOnCompositionLoadedListener {
}
binding.idLottieComplete.addAnimatorListener(object : Animator.AnimatorListener {
override fun onAnimationStart(p0: Animator) {
}
override fun onAnimationEnd(p0: Animator) {
AdmobUtils.showInterstitialAd(this@SpeakCleaningActivity) {
finish()
}
}
override fun onAnimationCancel(p0: Animator) {
}
override fun onAnimationRepeat(p0: Animator) {
}
})
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity
import android.content.Intent
import android.graphics.Color
import androidx.activity.OnBackPressedCallback
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutSpeakerCleanBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
class SpeakerCleanerActivity : BaseActivity<ActivityLayoutSpeakerCleanBinding>() {
override val binding: ActivityLayoutSpeakerCleanBinding by lazy {
ActivityLayoutSpeakerCleanBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
initListener()
}
override fun initListener() {
binding.idBackSpeakCleaner.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
AdmobUtils.showInterstitialAd(this@SpeakerCleanerActivity){
finishToMain()
}
}
})
binding.idCleanDust.setOnClickListener {
startActivity(Intent(this, SpeakCleaningActivity::class.java))
}
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.browser
import android.app.Activity
import android.graphics.Bitmap
import android.os.Build
import android.webkit.CookieManager
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebViewClient
import com.blankj.utilcode.util.SPUtils
class BrowserView(listener: WebViewListener, val str: String) {
companion object {
private const val DESKTOP_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36"
private var mDefaultUserAgent = ""
}
private val mWebView = WebView(listener.activity)
private val settings = mWebView.settings
var icon: Bitmap? = null
var title = str
var progress = 0
var url = str
var isHome = false
init {
mWebView.drawingCacheBackgroundColor = -1
mWebView.isFocusableInTouchMode = true
mWebView.isFocusable = true
mWebView.isDrawingCacheEnabled = false
mWebView.setWillNotCacheDrawing(true)
if (Build.VERSION.SDK_INT <= 22) {
mWebView.isAnimationCacheEnabled = false
mWebView.isAlwaysDrawnWithCacheEnabled = false
}
mWebView.setBackgroundColor(-1)
mWebView.isScrollbarFadingEnabled = true
mWebView.isSaveEnabled = true
mWebView.setNetworkAvailable(true)
mWebView.webChromeClient = object : WebChromeClient() {
override fun onProgressChanged(view: WebView?, newProgress: Int) {
progress = newProgress
listener.onProgressChanged(newProgress)
}
override fun onReceivedTitle(view: WebView?, title: String?) {
this@BrowserView.title = title?.takeIf { it.isNotBlank() } ?: str
listener.onReceivedTitle(title ?: str)
}
override fun onReceivedIcon(view: WebView?, icon: Bitmap?) {
this@BrowserView.icon = icon
listener.onReceivedIcon(icon)
}
}
mWebView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
this@BrowserView.url = url ?: ""
listener.onPageFinished(view, url ?: "")
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
this@BrowserView.url = url ?: ""
listener.onPageStarted(url ?: "", favicon)
}
}
settings.setGeolocationEnabled(false)
settings.userAgentString = WebSettings.getDefaultUserAgent(listener.activity)
settings.saveFormData = false
settings.javaScriptEnabled = true
settings.javaScriptCanOpenWindowsAutomatically = true
settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.NORMAL
try {
settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING
} catch (_: Exception) {}
settings.loadsImagesAutomatically = true
settings.setSupportMultipleWindows(true)
settings.useWideViewPort = true
settings.loadWithOverviewMode = true
settings.textZoom = 100
mDefaultUserAgent = settings.userAgentString
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true)
if (SPUtils.getInstance().getBoolean("desktop_mode", false)) {
setDesktop()
} else {
setPhone()
}
if (str.trim().isNotEmpty()) {
mWebView.loadUrl(str)
}
}
fun loadUrl(url: String) {
mWebView.loadUrl(url)
}
fun setDesktop() {
settings.userAgentString = DESKTOP_USER_AGENT
}
fun setPhone() {
settings.userAgentString = mDefaultUserAgent
}
fun reload() {
mWebView.reload()
}
fun canGoBack() = mWebView.canGoBack()
fun goBack() = mWebView.goBack()
fun canGoForward() = mWebView.canGoForward()
fun goForward() = mWebView.goForward()
fun getWebView() = mWebView
interface WebViewListener {
val activity: Activity
fun onProgressChanged(progress: Int)
fun onReceivedTitle(title: String)
fun onReceivedIcon(icon: Bitmap?)
fun onPageStarted(url: String, icon: Bitmap?)
fun onPageFinished(view: WebView?, url: String)
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.browser
import android.graphics.Bitmap
import android.graphics.Color
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.webkit.WebView
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.databinding.ActivityLayoutSecureBrowserBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
class SecureBrowserActivity : BaseActivity<ActivityLayoutSecureBrowserBinding>() {
private val tabs = mutableListOf<BrowserView?>(null)
private var currentTab = 0
override val binding: ActivityLayoutSecureBrowserBinding by lazy {
ActivityLayoutSecureBrowserBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
}
override fun initListener() {
binding.idGoogle.setOnClickListener {
}
binding.idYoutube.setOnClickListener {
loadUrl("https://www.youtube.com/")
}
binding.idFacebook.setOnClickListener {
}
binding.idAmazon.setOnClickListener {
}
binding.idInstagram.setOnClickListener {
}
binding.idTwitter.setOnClickListener {
}
binding.idReddit.setOnClickListener {
}
binding.idTiktok.setOnClickListener {
}
}
private fun loadUrl(url: String) {
binding.idContainer.isVisible = true
binding.idContent.isVisible=false
if (tabs[currentTab] == null) {
tabs[currentTab] = BrowserView(
object : BrowserView.WebViewListener {
override val activity = this@SecureBrowserActivity
override fun onProgressChanged(progress: Int) {
}
override fun onReceivedTitle(title: String) {
// binding.idAddressEdit.setText(title)
}
override fun onReceivedIcon(icon: Bitmap?) {
// icon?.let {
// binding.idIcon.setImageBitmap(it)
// }
}
override fun onPageStarted(url: String, icon: Bitmap?) {
}
override fun onPageFinished(view: WebView?, url: String) {
binding.idBack.isSelected = view?.canGoBack() == true
binding.idForward.isSelected = view?.canGoForward() == true
// refreshTabs()
}
},
url
)
} else {
tabs[currentTab]?.loadUrl(url)
}
tabs[currentTab]?.isHome = false
binding.idContainer.removeAllViews()
binding.idContainer.addView(tabs[currentTab]?.getWebView(), 0, MATCH_PARENT)
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
class AlbumBean {
var name: String = ""
var num: Int = 0
var src: String = ""
constructor(name: String, num: Int, src: String) {
this.name = name
this.num = num
this.src = src
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.test.basd.smartjunkcleaner.R
class AlbumListAdapter : RecyclerView.Adapter<AlbumListAdapter.ContentViewHolder> {
private var mList: List<AlbumBean>
private val mListener: OnItemClickListener<AlbumBean>
constructor(mList: List<AlbumBean>, mListener: OnItemClickListener<AlbumBean>) : super() {
this.mList = mList
this.mListener = mListener
}
fun updateData(mList: List<AlbumBean>) {
this.mList = mList
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContentViewHolder {
return ContentViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_album, parent, false)
)
}
override fun onBindViewHolder(holder: ContentViewHolder, position: Int) {
val entity = mList[position]
holder.mName.text = entity.name
holder.mNum.text = entity.num.toString()
Glide.with(holder.itemView.context).load(entity.src).into(holder.mImage)
}
override fun getItemCount(): Int = mList.size
inner class ContentViewHolder : ViewHolder {
val mName: TextView
val mNum: TextView
val mImage: ImageView
constructor(itemView: View) : super(itemView) {
mName = itemView.findViewById(R.id.name)
mNum = itemView.findViewById(R.id.num)
mImage = itemView.findViewById(R.id.image)
itemView.setOnClickListener {
if(position>=0&&position<mList.size){
val entity = mList[position]
mListener.onItemClick(position, entity)
}
}
}
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
interface AlbumsSelectListener {
fun onSelectAlbum(albums: AlbumBean)
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
import android.app.Activity
import android.view.View
import android.view.View.OnClickListener
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.test.basd.smartjunkcleaner.R
class BottomSheetManager : BottomSheetBehavior.BottomSheetCallback, OnClickListener,
OnItemClickListener<AlbumBean> {
private val mContext: Activity
private val mRecycleView: RecyclerView
private val blackOverlay: View
private val mAlbumName: TextView
private val bottomSheetBehavior: BottomSheetBehavior<LinearLayout>
private val listener: AlbumsSelectListener
constructor(mContext: Activity, listener: AlbumsSelectListener) {
this.mContext = mContext
this.listener = listener
mRecycleView = mContext.findViewById(R.id.album_content)
blackOverlay = mContext.findViewById(R.id.black_overlay)
val bottomSheet = mContext.findViewById<LinearLayout>(R.id.bottom_sheet)
bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
mAlbumName = mContext.findViewById(R.id.albumname)
init()
}
private fun init() {
bottomSheetBehavior.addBottomSheetCallback(this)
blackOverlay.setOnClickListener(this)
mAlbumName?.setOnClickListener(this)
mRecycleView.layoutManager = LinearLayoutManager(mContext)
val mList = ImagesMediaUtils.getAlbums(mContext)
val mAdapter = AlbumListAdapter(mList, this)
mRecycleView.adapter = mAdapter
if (mList.isNotEmpty()) {
onItemClick(0, mList[0])
}
}
override fun onStateChanged(bottomSheet: View, newState: Int) {
when (newState) {
BottomSheetBehavior.STATE_HIDDEN -> {
blackOverlay.visibility = View.GONE
}
BottomSheetBehavior.STATE_COLLAPSED -> {
blackOverlay.visibility = View.GONE
}
else -> {
blackOverlay.visibility = View.VISIBLE
}
}
}
override fun onSlide(bottomSheet: View, slideOffset: Float) {
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.albumname -> {
if (bottomSheetBehavior.state != BottomSheetBehavior.STATE_EXPANDED) {
bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
}
}
R.id.black_overlay -> {
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
}
}
}
override fun onUpdateBtn(boolean: Boolean, entity: AlbumBean) {
}
override fun onItemClick(position: Int, entity: AlbumBean) {
mAlbumName.text = entity.name
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
listener.onSelectAlbum(entity)
}
}
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.media.ExifInterface
import android.media.MediaScannerConnection
import android.os.Handler
import android.os.Looper
import android.util.Log
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
private const val s = "temp"
object CompressionImageUtils {
interface BitmapCallback {
fun onBitmapReady(bitmap: Bitmap?, size: Long, position: Int)
}
fun compressImage(filePath: String, mode: Int, position: Int, callback: BitmapCallback) {
Thread {
try {
val quality = when (mode) {
0 -> 95
50 -> 90
else -> 85
}
// 读取照片信息
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeFile(filePath, options)
// 计算缩放比例
val maxWidth = 1080
val maxHeight = 1920
val width = options.outWidth
val height = options.outHeight
var scale = 1
while (width / scale > maxWidth || height / scale > maxHeight) {
scale *= 2
}
// 读取照片数据
options.inJustDecodeBounds = false
options.inSampleSize = scale
val bitmap = BitmapFactory.decodeFile(filePath, options)
if (bitmap == null) {
callback.onBitmapReady(null, 0, position)
return@Thread
}
// 旋转照片
val orientation: Int = getOrientation(filePath)
val matrix = Matrix()
if (orientation == 90) {
matrix.postRotate(90f)
} else if (orientation == 180) {
matrix.postRotate(180f)
} else if (orientation == 270) {
matrix.postRotate(270f)
}
val rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
// 压缩照片
val cacheFile = File.createTempFile(System.currentTimeMillis().toString(), ".jpg")
val outputStream = FileOutputStream(cacheFile)
rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream)
outputStream.flush()
outputStream.close()
val compressedBitmap = BitmapFactory.decodeFile(cacheFile.path)
val cacheSize = cacheFile.length()
if (cacheFile.exists()) {
cacheFile.delete()
}
Log.d("glc","压缩后大小:"+cacheSize)
callback.onBitmapReady(compressedBitmap, cacheSize, position)
} catch (e: IOException) {
callback.onBitmapReady(null, 0, position)
}
}.start()
}
private fun getOrientation(filePath: String): Int {
return try {
val exif = ExifInterface(filePath)
val orientation: Int = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED
)
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
90
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
180
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
270
} else {
0
}
} catch (e: IOException) {
0
}
}
interface OnSaveBitmapListener {
fun onSaveSuccess()
fun onSaveFailed()
}
fun saveBitmapToFile(filePath: String?, mode: Int, bitmap: Bitmap,context: Context, listener: OnSaveBitmapListener) {
Thread {
val file = File(filePath)
if (file.exists()) {
file.delete()
}
try {
val outputStream = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
updateMedia(filePath?:"",context)
outputStream.flush()
outputStream.close()
if (listener != null) {
Handler(Looper.getMainLooper()).post(Runnable { listener.onSaveSuccess() })
}
} catch (e: IOException) {
e.printStackTrace()
if (listener != null) {
Handler(Looper.getMainLooper()).post(Runnable { listener.onSaveFailed() })
}
}
}.start()
}
private fun updateMedia(file:String,context:Context){
MediaScannerConnection.scanFile(context, arrayOf(file), null, null)
}
}
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
import android.graphics.Color
import androidx.activity.OnBackPressedCallback
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.databinding.ActivityCompressionPhotoListBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
class CompressionPhotoListActivity : BaseActivity<ActivityCompressionPhotoListBinding>(),
AlbumsSelectListener {
override val isLightMode =true
private var mPhotoListManager: PhotoListManager? = null
companion object {
var mActivity: CompressionPhotoListActivity? = null
}
override val binding: ActivityCompressionPhotoListBinding by lazy {
ActivityCompressionPhotoListBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.fanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
AdmobUtils.showInterstitialAd(this@CompressionPhotoListActivity){
PhotoCache.getInstance().clearCache()
finishToMain()
}
}
})
mActivity = this
mPhotoListManager = PhotoListManager(this)
BottomSheetManager(this, this)
}
override fun onBackPressed() {
PhotoCache.getInstance().clearCache()
super.onBackPressed()
}
override fun onSelectAlbum(albums: AlbumBean) {
mPhotoListManager?.onSelectAlbum(albums)
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
import android.text.TextUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.makeramen.roundedimageview.RoundedImageView
import com.test.basd.smartjunkcleaner.R
class CompressionPhotoListAdapter : RecyclerView.Adapter<ViewHolder> {
private val HEAD = 10081
private val CONTENT = 10082
private var mList: MutableList<PhotoBean> = ArrayList()
private var mHastMap: HashMap<Int, Boolean> = HashMap()
private val mListener: OnItemClickListener<PhotoBean>
constructor(mListener: OnItemClickListener<PhotoBean>) : super() {
this.mListener = mListener
}
fun updateData(mList: List<PhotoBean>) {
this.mList?.clear()
this.mList?.addAll(mList)
this.mHastMap.clear()
notifyDataSetChanged()
}
fun getData(): List<PhotoBean>? {
return mList
}
fun isSelectAll(): Boolean {
if (mHastMap.count() == itemCount) {
return mHastMap.all { it.value }
}
return false
}
fun setNoOrYesselectAll(boolean: Boolean) {
for (i in 0 until itemCount) {
mHastMap[i] = boolean
val entity = mList[i]
if (entity.type == 0) {
mListener.onUpdateBtn(boolean, entity)
}
}
notifyItemRangeChanged(0, itemCount)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
if (viewType == HEAD) {
return HeadViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_head, parent, false)
)
} else {
return ContentViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_content, parent, false)
)
}
}
override fun getItemViewType(position: Int): Int {
val data = mList[position]
return if (data.type == 0) {
CONTENT
} else {
HEAD
}
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val entity = mList[position]
if (holder is ContentViewHolder) {
holder.mCheck.isChecked = mHastMap[position] ?: false
Glide.with(holder.mImageView.context).load(entity.src)
.into(holder.mImageView)
holder.mRatio.text = entity.whRatio
holder.mSize.text = entity.sizeText
} else if (holder is HeadViewHolder) {
holder.mTitle.text = entity.date
holder.mSelectAll.text = if (mHastMap[position] == true)
"DESELECT ALL" else "SELECT ALL"
}
}
override fun getItemCount(): Int = mList?.size ?: 0
inner class HeadViewHolder : ViewHolder {
val mSelectAll: TextView
val mTitle: TextView
constructor(itemView: View) : super(itemView) {
mSelectAll = itemView.findViewById(R.id.select_all)
mTitle = itemView.findViewById(R.id.title)
mSelectAll.setOnClickListener {
val text = mSelectAll.text
if(position>=0&&position<mList.size){
val data = mList[position]
val date = data?.date
mList?.forEachIndexed { index, photoBean ->
if (TextUtils.equals(photoBean.date, date)) {
val boolean = !TextUtils.equals("DESELECT ALL", text)
mHastMap[index] = boolean
if (photoBean.type == 0) {
mListener.onUpdateBtn(boolean, photoBean)
}
}
}
mSelectAll.text = when (text) {
"DESELECT ALL" -> "SELECT ALL"
else -> "DESELECT ALL"
}
notifyItemRangeChanged(0, mList?.size ?: 0)
}
}
}
}
inner class ContentViewHolder : ViewHolder {
val mCheck: CheckBox
val mImageView: RoundedImageView
val mSize: TextView
val mRatio: TextView
constructor(itemView: View) : super(itemView) {
mCheck = itemView.findViewById(R.id.checkbox)
mImageView = itemView.findViewById(R.id.image)
mSize = itemView.findViewById(R.id.size)
mRatio = itemView.findViewById(R.id.ratio)
val layoutParams = mImageView.layoutParams
layoutParams.height = Utils.calculateImageWidth(itemView.context)
mImageView.layoutParams = layoutParams
itemView.setOnClickListener {
mCheck.performClick()
if(position>=0&&position<mList.size){
val entity = mList[position]
val index =
mList.indexOfFirst { it.type == 1 && TextUtils.equals(entity.date, it.date) }
notifyItemChanged(index)
}
}
mCheck.setOnCheckedChangeListener { buttonView, isChecked ->
if(position>=0&&position<mList.size){
val entity = mList[position]
mHastMap.put(position, isChecked)
mListener.onUpdateBtn(isChecked, entity)
val indexList: MutableList<Int> = ArrayList()
val date = entity?.date ?: ""
mList?.forEachIndexed { index, photoBean ->
if (photoBean.type == 0 && TextUtils.equals(photoBean.date, date)) {
indexList.add(index)
}
}
val allTrue = (indexList.first()..indexList.last()).all { i ->
mHastMap.getOrDefault(
i,
false
)
}
mHastMap.put(indexList.first() - 1, allTrue)
}
}
}
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
import android.annotation.SuppressLint
import android.graphics.Color
import android.widget.TextView
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.R
import com.test.basd.smartjunkcleaner.databinding.ActivityCompressionSuccessBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
class CompressionSuccessActivity : BaseActivity<ActivityCompressionSuccessBinding>() {
override val binding: ActivityCompressionSuccessBinding
get() = ActivityCompressionSuccessBinding.inflate(layoutInflater)
@SuppressLint("SetTextI18n")
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
val num = intent.getIntExtra("num", 0)
val size = intent.getLongExtra("size", 0)
findViewById<TextView>(R.id.tv_text).text =
"$num images compressed " + ImagesMediaUtils.formatFileSize(size)
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Color
import android.widget.ProgressBar
import android.widget.TextView
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.test.basd.smartjunkcleaner.R
import com.test.basd.smartjunkcleaner.activity.ResultActivity
import com.test.basd.smartjunkcleaner.databinding.ActivityCompressioningBinding
import com.test.basd.smartjunkcleaner.helps.BaseActivity
import com.test.basd.smartjunkcleaner.helps.ads.AdmobUtils
import com.test.basd.smartjunkcleaner.view.AFunOb
class CompressioningActivity : BaseActivity<ActivityCompressioningBinding>(), CompressionImageUtils.BitmapCallback,
CompressionImageUtils.OnSaveBitmapListener {
private var mTextProgress: TextView? = null
private var mProgressBar: ProgressBar? = null
private var mNum = 0
private var mode = 50;
override val binding: ActivityCompressioningBinding by lazy {
ActivityCompressioningBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.fanhui.setOnClickListener {
finishToMain()
}
mTextProgress = findViewById(R.id.text_progress)
mProgressBar = findViewById(R.id.compressing_progress)
mode = intent.getIntExtra("mode", 50)
PhotoCache.getInstance().photoList?.forEachIndexed { index, it ->
CompressionImageUtils.compressImage(it.src, mode, index, this@CompressioningActivity)
}
mProgressBar?.max = PhotoCache.getInstance().count
updateProgress()
}
private var mSizeCount: Long = 0L
override fun onBitmapReady(bitmap: Bitmap?, size: Long, position: Int) {
val entity = PhotoCache.getInstance().getPositionData(position)
if (bitmap != null && entity != null) {
mSizeCount += (entity.size - size)
CompressionImageUtils.saveBitmapToFile(entity.src, mode, bitmap, this, this)
}
}
override fun onDestroy() {
super.onDestroy()
PhotoCache.getInstance().clearCache()
}
override fun onSaveFailed() {
}
override fun onSaveSuccess() {
mNum += 1
updateProgress()
}
private fun updateProgress() {
mTextProgress?.text = mNum.toString() + "/" + PhotoCache.getInstance().count
mProgressBar?.progress = mNum
if (mNum == mProgressBar?.max) {
onSuccess()
}
}
private fun onSuccess() {
AdmobUtils.showInterstitialAd(this){
val intent = Intent(this, ResultActivity::class.java)
intent.putExtra("from", AFunOb.PHOTO_COMPRESS)
intent.putExtra("num", mNum)
intent.putExtra("size", mSizeCount)
startActivity(intent)
finish()
}
}
override fun onBackPressed() {
// val dialog = CustomDialog(this, R.layout.dialog_exit)
// dialog.setButtonClickListener(R.id.cancel) {
// dialog.dismiss()
// }
//
// dialog.setButtonClickListener(R.id.btnContinue) {
super.onBackPressed()
// }
// dialog.show()
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
import android.app.Dialog
import android.content.Context
import android.view.Gravity
import android.view.View
import android.widget.TextView
class CustomDialog(context: Context, layoutId: Int) : Dialog(context) {
init {
setContentView(layoutId)
val window = window
window?.apply {
setGravity(Gravity.CENTER)
setBackgroundDrawableResource(android.R.color.transparent)
}
setCancelable(false)
}
fun setButtonClickListener(viewId: Int, listener: () -> Unit) {
val button = findViewById<View>(viewId) as? TextView
button?.setOnClickListener {
listener.invoke()
}
}
}
package com.test.basd.smartjunkcleaner.activity.photocompress.photo;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.test.basd.smartjunkcleaner.R;
import java.util.List;
public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.GalleryViewHolder> {
private Context context;
private int index = 0;
public void setPos(int index) {
this.index = index;
}
private List<PhotoBean> list;
public GalleryAdapter(Context context, List<PhotoBean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public GalleryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_gallery, parent, false);
return new GalleryViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull GalleryViewHolder holder, int position) {
if (position < list.size()) {
PhotoBean bean = list.get(position);
Glide.with(holder.itemView.getContext()).load(bean.getSrc()).into((ImageView) holder.itemView);
}
}
@Override
public int getItemCount() {
return list.size();
}
public static class GalleryViewHolder extends RecyclerView.ViewHolder {
public GalleryViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
interface OnItemClickListener<T> {
fun onUpdateBtn(isChecked :Boolean , entity: T )
fun onItemClick(position:Int , entity : T)
}
\ No newline at end of file
package com.test.basd.smartjunkcleaner.activity.photocompress.photo
import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.RectF
import android.graphics.Shader
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import java.security.MessageDigest
class RoundedCornersTransformation(private val radiusInDp: Float) : BitmapTransformation() {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
}
private val radius: Float = Resources.getSystem().displayMetrics.density * radiusInDp
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
val bitmap = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
val shader = BitmapShader(toTransform, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
paint.shader = shader
val rect = RectF(0f, 0f, outWidth.toFloat(), outHeight.toFloat())
canvas.drawRoundRect(rect, radius, radius, paint)
return bitmap
}
fun getId(): String {
return "RoundedCornersTransformation(radius=$radius)"
}
}
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment