Commit 536500c0 authored by wanglei's avatar wanglei

[拆包]权限弹窗UI,移除无用功能

parent b2e8b470
......@@ -126,11 +126,6 @@
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.malware.MalwareCleanActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<provider
android:name="androidx.core.content.FileProvider"
......
......@@ -25,6 +25,7 @@ import java.util.UUID
import com.base.appzxhy.SpConstObject.appLanguageSp
import com.base.appzxhy.SpConstObject.appLanguageCountrySp
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.business.helper.EventUtils
import com.base.appzxhy.business.helper.NewComUtils.spConfig
import com.base.appzxhy.business.push.fcm.FCMManager
import com.base.appzxhy.business.push.notification.MyNotificationManager
......@@ -98,9 +99,14 @@ class MyApplication : Application() {
}
private fun initGid() = MainScope().launch(Dispatchers.IO) {
val info: AdvertisingIdClient.Info = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)
val advertisingId = info.id
AppPreferences.getInstance().put("gid", advertisingId)
try {
val info: AdvertisingIdClient.Info = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)
val advertisingId = info.id
AppPreferences.getInstance().put("gid", advertisingId)
} catch (e: Exception) {
EventUtils.event("gid_exception")
}
}
override fun attachBaseContext(base: Context?) {
......
......@@ -53,7 +53,6 @@ import com.base.appzxhy.ui.clean.JunkCleanActivity
import com.base.appzxhy.ui.dialog.FunctionBackDialog
import com.base.appzxhy.ui.largefile.LargeFileCleanActivity
import com.base.appzxhy.ui.main.MainActivity
import com.base.appzxhy.ui.malware.MalwareCleanActivity
import com.base.appzxhy.ui.photocompression.PhotoCompressionActivity
import com.base.appzxhy.ui.screenshot.ScreenshotCleanActivity
import com.base.appzxhy.ui.similar.SimilarPhotosActivity
......@@ -456,10 +455,6 @@ fun Activity.jumpAction(key: String) {
PHOTO_COMPRESSION -> {
goToAc(PhotoCompressionActivity::class.java)
}
ANTIVIRUS -> {
goToAc(MalwareCleanActivity::class.java)
}
}
}
......
......@@ -5,6 +5,7 @@ import android.view.LayoutInflater
import android.widget.LinearLayout
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import com.base.appzxhy.R
import com.base.appzxhy.databinding.DialogConfirmBinding
......@@ -23,8 +24,9 @@ class ConfirmDialog(
dialog.show()
val params = dialog.window?.attributes
// params?.width = LinearLayout.LayoutParams.MATCH_PARENT
// params?.height = LinearLayout.LayoutParams.WRAP_CONTENT
// params?.width = ConstraintLayout.LayoutParams.MATCH_PARENT
params?.width = activity.resources.getDimensionPixelSize(R.dimen.dp_300)
params?.height = ConstraintLayout.LayoutParams.WRAP_CONTENT
params?.gravity = Gravity.CENTER
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
......
......@@ -9,7 +9,6 @@ import com.base.appzxhy.databinding.DialogFunctionBackBinding
import com.base.appzxhy.ui.batteryinfo.BatteryInfoActivity
import com.base.appzxhy.ui.clean.JunkCleanActivity
import com.base.appzxhy.ui.largefile.LargeFileCleanActivity
import com.base.appzxhy.ui.malware.MalwareCleanActivity
import com.base.appzxhy.ui.photocompression.PhotoCompressionActivity
import com.base.appzxhy.ui.screenshot.ScreenshotCleanActivity
import com.base.appzxhy.ui.similar.SimilarPhotosActivity
......@@ -64,11 +63,6 @@ class FunctionBackDialog(
binding.tvContent.text = activity.getString(R.string.exit_similar_photos_content)
}
is MalwareCleanActivity -> {
binding.tvTitle.text = activity.getString(R.string.exit_malware_clean)
binding.tvContent.text = activity.getString(R.string.exit_malware_clean_content)
}
else -> {
back.invoke()
return
......
......@@ -10,6 +10,7 @@ import androidx.core.graphics.toColorInt
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.base.jumpAction
import com.base.appzxhy.databinding.DialogStorage2Binding
import com.base.appzxhy.databinding.DialogStorageBinding
import com.base.appzxhy.utils.PermissionUtils.checkStorePermission
import com.base.appzxhy.utils.PermissionUtils.requestStoragePermission
......@@ -43,7 +44,7 @@ class StoragePermissionDialog(
) {
val dialog = AlertDialog.Builder(activity).create()
val binding = DialogStorageBinding.inflate(LayoutInflater.from(activity))
val binding = DialogStorage2Binding.inflate(LayoutInflater.from(activity))
var action: (() -> Unit)? = null
......@@ -54,15 +55,16 @@ class StoragePermissionDialog(
dialog.show()
val params = dialog.window?.attributes
params?.width = activity.resources.getDimensionPixelSize(R.dimen.dp_316)
// params?.width = activity.resources.getDimensionPixelSize(R.dimen.dp_316)
params?.width = ConstraintLayout.LayoutParams.MATCH_PARENT
params?.height = ConstraintLayout.LayoutParams.WRAP_CONTENT
params?.gravity = Gravity.CENTER
params?.gravity = Gravity.BOTTOM
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
val appName = activity.getString(R.string.app_name)
binding.tvContent.text =
highlightText(activity.getString(R.string.storage_permission_content, appName), appName, "#2DD29E".toColorInt())
highlightText(activity.getString(R.string.storage_permission_content, appName), appName, "#0456ed".toColorInt())
// binding.lottieAnimationView.let {
// it.imageAssetsFolder = "permission_sc/images"
......@@ -71,10 +73,10 @@ class StoragePermissionDialog(
// it.playAnimation()
// }
binding.tvDeny.setOnClickListener {
dialog.dismiss()
}
binding.tvAllow.setOnClickListener {
// binding.tvDeny.setOnClickListener {
// dialog.dismiss()
// }
binding.tvOpenSettings.setOnClickListener {
dialog.dismiss()
action?.invoke()
}
......
......@@ -69,6 +69,10 @@ class GuideActivity : BaseActivity<ActivityGuideBinding>(ActivityGuideBinding::i
binding.viewpager2.currentItem = 2
return
}
if (page == 2) {
binding.viewpager2.currentItem = 3
return
}
if (page == 3) {
startActivity(Intent(this, MainActivity::class.java))
finish()
......
......@@ -25,13 +25,13 @@ class GuideFragment : BaseFragment<FragmentGuideBinding>(FragmentGuideBinding::i
}
1 -> {
binding.iv.setImageResource(R.drawable.yingdaoye2)
binding.iv.setImageResource(R.drawable.yindaoye2)
binding.ivDian.setImageResource(R.drawable.dian_2)
binding.tvContent.text = getString(R.string.guide_tip_2)
}
3 -> {
binding.iv.setImageResource(R.drawable.yingdaoye3)
binding.iv.setImageResource(R.drawable.yindaoye3)
binding.ivDian.setImageResource(R.drawable.dian_3)
binding.tvContent.text = getString(R.string.guide_tip_3)
binding.tvBtn.text = getString(R.string.get_started)
......
......@@ -8,6 +8,7 @@ import com.base.appzxhy.ui.guide.GuideActivity
class NativeFullFragment : BaseFragment<FragmentNativeFullBinding>(FragmentNativeFullBinding::inflate) {
var page: Int = 2
override fun onResume() {
super.onResume()
......@@ -23,7 +24,7 @@ class NativeFullFragment : BaseFragment<FragmentNativeFullBinding>(FragmentNativ
binding.ivClose.setOnClickListener {
val activity = requireActivity() as GuideActivity
activity.next(3)
activity.next(page)
}
......
......@@ -24,7 +24,6 @@ import com.base.appzxhy.bean.FeatureBean.Companion.SIMILAR_PHOTOS
import com.base.appzxhy.bean.FeatureBean.Companion.VIDEO_CLEAN
import com.base.appzxhy.databinding.FragmentHome3Binding
import com.base.appzxhy.ui.dialog.permissionStorageJump
import com.base.appzxhy.ui.malware.MalwareDialog
import com.base.appzxhy.ui.set.SettingActivity
import com.base.appzxhy.utils.BarUtils
import com.base.appzxhy.utils.KotlinExt.toFormatSize
......@@ -133,17 +132,6 @@ class HomeFragment : BaseFragment<FragmentHome3Binding>(FragmentHome3Binding::in
(requireActivity() as MainActivity).goToAc(SettingActivity::class.java)
}
ANTIVIRUS -> {
val dialog = MalwareDialog(requireActivity())
dialog.action = {
if (it) {
(requireActivity() as MainActivity).permissionStorageJump(ANTIVIRUS)
}
}
dialog.showDialog()
}
}
}
......
package com.base.appzxhy.ui.malware
import com.base.appzxhy.MyApplication
import com.trustlook.sdk.cloudscan.CloudScanClient
import com.trustlook.sdk.data.Region
/**
*Create by SleepDog on 2025-01-24
*/
object CloudScan {
val scanClient by lazy(LazyThreadSafetyMode.NONE) {
CloudScanClient.Builder(MyApplication.appContext)
// 设置服务地区,
// 海外地区设置:Region.INTL,百度用户设置:Region.BAIDU
.setRegion(Region.INTL)
// 设置连接超时时长,单位为毫秒
.setConnectionTimeout(30000)
//设置传输超时时长,单位为毫秒
.setSocketTimeout(30000)
.build()
}
}
\ No newline at end of file
//package com.base.appzxhy.ui.malware
//
//import com.base.appzxhy.MyApplication
//import com.trustlook.sdk.cloudscan.CloudScanClient
//import com.trustlook.sdk.data.Region
//
///**
// *Create by SleepDog on 2025-01-24
// */
//object CloudScan {
// val scanClient by lazy(LazyThreadSafetyMode.NONE) {
// CloudScanClient.Builder(MyApplication.appContext)
// // 设置服务地区,
//// 海外地区设置:Region.INTL,百度用户设置:Region.BAIDU
// .setRegion(Region.INTL)
// // 设置连接超时时长,单位为毫秒
// .setConnectionTimeout(30000)
// //设置传输超时时长,单位为毫秒
// .setSocketTimeout(30000)
// .build()
// }
//}
\ No newline at end of file
package com.base.appzxhy.ui.malware
import android.app.Activity
import android.view.LayoutInflater
import androidx.appcompat.app.AlertDialog
import androidx.constraintlayout.widget.ConstraintLayout
import com.base.appzxhy.R
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.databinding.DialogErrBinding
class ErrorScanDialog(
val activity: Activity
) {
val dialog = AlertDialog.Builder(activity).create()
val binding = DialogErrBinding.inflate(LayoutInflater.from(activity))
var action: (() -> Unit)? = null
fun showDialog() {
dialog.setView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
val params = dialog.window?.attributes
// params?.width = ConstraintLayout.LayoutParams.MATCH_PARENT
params?.width = activity.resources.getDimensionPixelSize(R.dimen.dp_295)
params?.height = ConstraintLayout.LayoutParams.WRAP_CONTENT
// params?.gravity = Gravity.BOTTOM
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
binding.tvSure.setOnClickListener {
dialog.dismiss()
action?.invoke()
}
}
}
\ No newline at end of file
//package com.base.appzxhy.ui.malware
//
//import android.app.Activity
//import android.view.LayoutInflater
//import androidx.appcompat.app.AlertDialog
//import androidx.constraintlayout.widget.ConstraintLayout
//import com.base.appzxhy.R
//import com.base.appzxhy.business.ads.AdsMgr
//import com.base.appzxhy.databinding.DialogErrBinding
//
//class ErrorScanDialog(
// val activity: Activity
//) {
// val dialog = AlertDialog.Builder(activity).create()
// val binding = DialogErrBinding.inflate(LayoutInflater.from(activity))
//
// var action: (() -> Unit)? = null
//
// fun showDialog() {
// dialog.setView(binding.root)
// dialog.setCanceledOnTouchOutside(false)
// dialog.show()
//
// val params = dialog.window?.attributes
//// params?.width = ConstraintLayout.LayoutParams.MATCH_PARENT
// params?.width = activity.resources.getDimensionPixelSize(R.dimen.dp_295)
// params?.height = ConstraintLayout.LayoutParams.WRAP_CONTENT
//// params?.gravity = Gravity.BOTTOM
// dialog.window?.attributes = params
// dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
//
// AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
// binding.tvSure.setOnClickListener {
// dialog.dismiss()
// action?.invoke()
// }
// }
//}
\ No newline at end of file
package com.base.appzxhy.ui.malware
import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.PackageManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.bean.AppInfoBean
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.business.ads.AdsShowCallBack
import com.base.appzxhy.databinding.ActivityMalwareCleanBinding
import com.base.appzxhy.databinding.ItemMalwareCleanBinding
import com.base.appzxhy.utils.FileUtils
import com.trustlook.sdk.cloudscan.CloudScanListener
import com.trustlook.sdk.data.AppInfo
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlin.random.Random
import androidx.core.net.toUri
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.base.appzxhy.BuildConfig
import com.base.appzxhy.base.LottieEnum
import com.base.appzxhy.bean.FeatureBean.Companion.ANTIVIRUS
import com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN
import com.base.appzxhy.bean.FeatureBean.Companion.setFunctionTodayUsed
import com.base.appzxhy.ui.cleanresult.CleanResultActivity
import com.base.appzxhy.utils.LogEx
class MalwareCleanActivity : BaseActivity<ActivityMalwareCleanBinding>(ActivityMalwareCleanBinding::inflate) {
private var appList = mutableListOf<AppInfoBean>()
private val adapter by lazy(LazyThreadSafetyMode.NONE) {
class ViewHolder(val binding: ItemMalwareCleanBinding) :
RecyclerView.ViewHolder(binding.root)
object : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemMalwareCleanBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
return ViewHolder(binding)
}
override fun getItemCount(): Int = appList.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = appList[position]
holder.binding.ivIcon.setImageDrawable(item.icon)
holder.binding.tvName.text = item.appName
holder.binding.tvLevel.text = getLevel(item.score ?: 0)
holder.binding.viewLine.visibility =
if (position == itemCount - 1) View.GONE else View.VISIBLE
holder.itemView.setOnClickListener {
item.isSelected = !item.isSelected
AdsMgr.showInsert(this@MalwareCleanActivity, showCallBack = object : AdsShowCallBack() {
override fun next() {
uninstall(0, listOf(item))
}
})
}
}
}
}
private fun getLevel(score: Int): String {
return if (score <= 5) {
"safe"
} else if (score in 6..7) {
"Risk"
} else {
"malware"
}
}
@SuppressLint("NotifyDataSetChanged")
private fun uninstall(position: Int, list: List<AppInfoBean>) {
val packageName = list[position].packageName
val intent = Intent(Intent.ACTION_DELETE, "package:$packageName".toUri())
launcher.launch(intent) {
if (isUninstall(packageName)) {
appList.removeIf {
it.packageName == packageName
}
runOnUiThread {
adapter.notifyDataSetChanged()
updateUninstall()
}
}
if (position < list.size - 1) uninstall(position + 1, list)
else {
updateView(false)
}
}
}
private fun isUninstall(packageName: String): Boolean {
val intent = packageManager.getLaunchIntentForPackage(packageName)
return intent == null
}
@SuppressLint("SetTextI18n")
private fun updateUninstall() {
val list = appList.filter { it.isSelected }
val size = if (list.isEmpty()) "" else " ${list.size} ${getString(R.string.apps)}"
}
@SuppressLint("NotifyDataSetChanged")
private fun malwareClean(list: List<AppInfoBean>) {
lifecycleScope.launch(Dispatchers.Default) {
val installApps = mutableListOf<AppInfoBean>()
list.forEach {
if (it.isInstall == true) installApps.add(it)
else {
it.apkPath?.also {
launch(Dispatchers.IO) {
FileUtils.deleteFile(it)
}
}
appList.remove(it)
}
}
if (installApps.isNotEmpty()) {
uninstall(0, installApps)
} else {
withContext(Dispatchers.Main) {
adapter.notifyDataSetChanged()
updateUninstall()
}
}
}
}
private var isScanning = false
private fun initData(isScan: Boolean = isScanning) {
if (isScan) return
isScanning = true
CloudScan.scanClient.startQuickScan(object : CloudScanListener() {
override fun onScanStarted() {
LogEx.logDebug(TAG, "onScanStarted")
}
override fun onScanCanceled() {
LogEx.logDebug(TAG, "onScanCanceled")
scanFinish()
}
override fun onScanProgress(p0: Int, p1: Int, p2: AppInfo?) {
LogEx.logDebug(TAG, "onScanProgress")
}
@SuppressLint("NotifyDataSetChanged")
override fun onScanFinished(dataList: MutableList<AppInfo>?) {
//Log.e("CloudScan", "onScanFinished")
scanFinishData(dataList)
}
override fun onScanError(p0: Int, p1: String?) {
LogEx.logDebug(TAG, "onScanError")
isScanning = false
scanError()
}
override fun onScanInterrupt() {
isScanning = false
scanError()
}
})
}
fun scanError() {
if (BuildConfig.DEBUG) return
val dialog = ErrorScanDialog(this@MalwareCleanActivity)
dialog.action = {
finish()
}
dialog.showDialog()
}
@SuppressLint("NotifyDataSetChanged")
fun scanFinishData(dataList: MutableList<AppInfo>?) {
lifecycleScope.launch(Dispatchers.Default) {
val realList = mutableListOf<AppInfoBean>()
dataList?.forEach {
if (!it.isSystemApp && (it.score > 5 || BuildConfig.DEBUG)) {
var isInstall: Boolean
// Log.e("CloudScan", "${it.source} ${it.apkPath} ${it.toJSON(this@MalwareCleanActivity)}")
val icon = try {
val res = packageManager.getApplicationIcon(it.packageName)
isInstall = true
res
} catch (e: PackageManager.NameNotFoundException) {
isInstall = false
val info = packageManager.getPackageArchiveInfo(
it.apkPath,
PackageManager.GET_ACTIVITIES
)
if (info != null) {
info.applicationInfo?.let { packageManager.getApplicationIcon(it) }
} else {
AppCompatResources.getDrawable(this@MalwareCleanActivity, R.drawable.icon_apk)
}
}
realList.add(
AppInfoBean(
it.appName,
icon!!,
it.packageName,
false,
isInstall,
it.score,
it.apkPath
)
)
// withContext(Dispatchers.Main) {
// adapter.notifyItemInserted(appList.size)
// }
}
}
if (BuildConfig.DEBUG) {
realList.add(
AppInfoBean(
"AntiVirus Phone Manager",
AppCompatResources.getDrawable(this@MalwareCleanActivity, R.drawable.icon_apk)!!,
"com.tool.fast.phone",
false,
true,
5,
"apkPath/apkPath/apkPath"
)
)
}
withContext(Dispatchers.Main) {
val durationTime = Random.nextLong(3000, 3500)
delay(durationTime)
appList.clear()
appList.addAll(realList)
scanFinish()
adapter.notifyDataSetChanged()
updateView(true)
}
}
}
private fun scanFinish() {
isScanning = false
stopAnimation()
}
fun stopAnimation() {
binding.layoutAnimation.lottieAnimation.clearAnimation()
binding.layoutAnimation.root.visibility = View.GONE
isBackDisable = false
}
@SuppressLint("SetTextI18n")
private fun updateView(jump: Boolean) {
binding.ivLogo.visibility = if (appList.isEmpty()) View.GONE else View.VISIBLE
binding.tvCount.visibility = if (appList.isEmpty()) View.GONE else {
binding.tvCount.text = getString(R.string.issue, appList.size.toString())
View.VISIBLE
}
binding.tvUnit.visibility = if (appList.isEmpty()) View.GONE else View.VISIBLE
binding.rvMalware.visibility = if (appList.isEmpty()) View.GONE else View.VISIBLE
binding.ivEmpty.visibility = if (appList.isEmpty()) View.VISIBLE else View.GONE
if (appList.isEmpty()) {
if (jump) {
CleanResultActivity.functionKey = ANTIVIRUS
CleanResultActivity.titleName = getString(R.string.malware_scan)
goToAc(CleanResultActivity::class.java)
}
} else {
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
}
}
override fun useDefaultImmersive() {
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, 0, systemBars.right, systemBars.bottom)
binding.clTop.setPadding(0, systemBars.top, 0, 0)
insets
}
}
override fun initView() {
super.initView()
showAdAnimation(LottieEnum.MALWARE_SCAN)
binding.rvMalware.adapter = adapter
binding.rvMalware.layoutManager = LinearLayoutManager(this)
initData()
if (BuildConfig.DEBUG) {
scanFinishData(null)
}
setFunctionTodayUsed(ANTIVIRUS)
}
override fun initListener() {
super.initListener()
binding.flBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() }
}
override fun handleBackCallBack() {
super.handleBackCallBack()
}
}
\ No newline at end of file
//package com.base.appzxhy.ui.malware
//
//import android.annotation.SuppressLint
//import android.content.Intent
//import android.content.pm.PackageManager
//import android.view.LayoutInflater
//import android.view.View
//import android.view.ViewGroup
//import androidx.appcompat.content.res.AppCompatResources
//import androidx.core.content.ContextCompat
//import androidx.lifecycle.lifecycleScope
//import androidx.recyclerview.widget.LinearLayoutManager
//import androidx.recyclerview.widget.RecyclerView
//import com.base.appzxhy.R
//import com.base.appzxhy.base.BaseActivity
//import com.base.appzxhy.bean.AppInfoBean
//import com.base.appzxhy.business.ads.AdsMgr
//import com.base.appzxhy.business.ads.AdsShowCallBack
//import com.base.appzxhy.databinding.ActivityMalwareCleanBinding
//import com.base.appzxhy.databinding.ItemMalwareCleanBinding
//import com.base.appzxhy.utils.FileUtils
//import com.trustlook.sdk.cloudscan.CloudScanListener
//import com.trustlook.sdk.data.AppInfo
//import kotlinx.coroutines.Dispatchers
//import kotlinx.coroutines.delay
//import kotlinx.coroutines.launch
//import kotlinx.coroutines.withContext
//import kotlin.random.Random
//import androidx.core.net.toUri
//import androidx.core.view.ViewCompat
//import androidx.core.view.WindowInsetsCompat
//import com.base.appzxhy.BuildConfig
//import com.base.appzxhy.base.LottieEnum
//import com.base.appzxhy.bean.FeatureBean.Companion.ANTIVIRUS
//import com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN
//import com.base.appzxhy.bean.FeatureBean.Companion.setFunctionTodayUsed
//import com.base.appzxhy.ui.cleanresult.CleanResultActivity
//import com.base.appzxhy.utils.LogEx
//
//
//class MalwareCleanActivity : BaseActivity<ActivityMalwareCleanBinding>(ActivityMalwareCleanBinding::inflate) {
//
// private var appList = mutableListOf<AppInfoBean>()
// private val adapter by lazy(LazyThreadSafetyMode.NONE) {
// class ViewHolder(val binding: ItemMalwareCleanBinding) :
// RecyclerView.ViewHolder(binding.root)
//
// object : RecyclerView.Adapter<ViewHolder>() {
// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
// val binding = ItemMalwareCleanBinding.inflate(
// LayoutInflater.from(parent.context),
// parent,
// false
// )
// return ViewHolder(binding)
// }
//
// override fun getItemCount(): Int = appList.size
//
// override fun onBindViewHolder(holder: ViewHolder, position: Int) {
// val item = appList[position]
// holder.binding.ivIcon.setImageDrawable(item.icon)
// holder.binding.tvName.text = item.appName
// holder.binding.tvLevel.text = getLevel(item.score ?: 0)
// holder.binding.viewLine.visibility =
// if (position == itemCount - 1) View.GONE else View.VISIBLE
// holder.itemView.setOnClickListener {
// item.isSelected = !item.isSelected
// AdsMgr.showInsert(this@MalwareCleanActivity, showCallBack = object : AdsShowCallBack() {
// override fun next() {
// uninstall(0, listOf(item))
// }
// })
// }
// }
// }
//
// }
//
// private fun getLevel(score: Int): String {
// return if (score <= 5) {
// "safe"
// } else if (score in 6..7) {
// "Risk"
// } else {
// "malware"
// }
// }
//
// @SuppressLint("NotifyDataSetChanged")
// private fun uninstall(position: Int, list: List<AppInfoBean>) {
// val packageName = list[position].packageName
// val intent = Intent(Intent.ACTION_DELETE, "package:$packageName".toUri())
// launcher.launch(intent) {
// if (isUninstall(packageName)) {
// appList.removeIf {
// it.packageName == packageName
// }
// runOnUiThread {
// adapter.notifyDataSetChanged()
// updateUninstall()
// }
// }
// if (position < list.size - 1) uninstall(position + 1, list)
// else {
// updateView(false)
// }
// }
// }
//
// private fun isUninstall(packageName: String): Boolean {
// val intent = packageManager.getLaunchIntentForPackage(packageName)
// return intent == null
// }
//
// @SuppressLint("SetTextI18n")
// private fun updateUninstall() {
// val list = appList.filter { it.isSelected }
// val size = if (list.isEmpty()) "" else " ${list.size} ${getString(R.string.apps)}"
// }
//
// @SuppressLint("NotifyDataSetChanged")
// private fun malwareClean(list: List<AppInfoBean>) {
// lifecycleScope.launch(Dispatchers.Default) {
// val installApps = mutableListOf<AppInfoBean>()
// list.forEach {
// if (it.isInstall == true) installApps.add(it)
// else {
// it.apkPath?.also {
// launch(Dispatchers.IO) {
// FileUtils.deleteFile(it)
// }
// }
// appList.remove(it)
// }
// }
//
// if (installApps.isNotEmpty()) {
// uninstall(0, installApps)
// } else {
// withContext(Dispatchers.Main) {
// adapter.notifyDataSetChanged()
// updateUninstall()
// }
// }
// }
// }
//
// private var isScanning = false
// private fun initData(isScan: Boolean = isScanning) {
// if (isScan) return
// isScanning = true
// CloudScan.scanClient.startQuickScan(object : CloudScanListener() {
// override fun onScanStarted() {
// LogEx.logDebug(TAG, "onScanStarted")
// }
//
// override fun onScanCanceled() {
// LogEx.logDebug(TAG, "onScanCanceled")
// scanFinish()
// }
//
// override fun onScanProgress(p0: Int, p1: Int, p2: AppInfo?) {
// LogEx.logDebug(TAG, "onScanProgress")
// }
//
// @SuppressLint("NotifyDataSetChanged")
// override fun onScanFinished(dataList: MutableList<AppInfo>?) {
//
// //Log.e("CloudScan", "onScanFinished")
// scanFinishData(dataList)
// }
//
// override fun onScanError(p0: Int, p1: String?) {
// LogEx.logDebug(TAG, "onScanError")
// isScanning = false
// scanError()
// }
//
// override fun onScanInterrupt() {
// isScanning = false
// scanError()
// }
// })
// }
//
// fun scanError() {
// if (BuildConfig.DEBUG) return
// val dialog = ErrorScanDialog(this@MalwareCleanActivity)
// dialog.action = {
// finish()
// }
// dialog.showDialog()
// }
//
// @SuppressLint("NotifyDataSetChanged")
// fun scanFinishData(dataList: MutableList<AppInfo>?) {
//
//
// lifecycleScope.launch(Dispatchers.Default) {
// val realList = mutableListOf<AppInfoBean>()
// dataList?.forEach {
// if (!it.isSystemApp && (it.score > 5 || BuildConfig.DEBUG)) {
// var isInstall: Boolean
// // Log.e("CloudScan", "${it.source} ${it.apkPath} ${it.toJSON(this@MalwareCleanActivity)}")
// val icon = try {
// val res = packageManager.getApplicationIcon(it.packageName)
// isInstall = true
// res
// } catch (e: PackageManager.NameNotFoundException) {
// isInstall = false
// val info = packageManager.getPackageArchiveInfo(
// it.apkPath,
// PackageManager.GET_ACTIVITIES
// )
// if (info != null) {
// info.applicationInfo?.let { packageManager.getApplicationIcon(it) }
// } else {
// AppCompatResources.getDrawable(this@MalwareCleanActivity, R.drawable.icon_apk)
// }
// }
// realList.add(
// AppInfoBean(
// it.appName,
// icon!!,
// it.packageName,
// false,
// isInstall,
// it.score,
// it.apkPath
// )
// )
//// withContext(Dispatchers.Main) {
//// adapter.notifyItemInserted(appList.size)
//// }
// }
// }
//
// if (BuildConfig.DEBUG) {
// realList.add(
// AppInfoBean(
// "AntiVirus Phone Manager",
// AppCompatResources.getDrawable(this@MalwareCleanActivity, R.drawable.icon_apk)!!,
// "com.tool.fast.phone",
// false,
// true,
// 5,
// "apkPath/apkPath/apkPath"
// )
// )
// }
//
// withContext(Dispatchers.Main) {
// val durationTime = Random.nextLong(3000, 3500)
// delay(durationTime)
// appList.clear()
// appList.addAll(realList)
// scanFinish()
// adapter.notifyDataSetChanged()
// updateView(true)
//
// }
// }
// }
//
// private fun scanFinish() {
// isScanning = false
// stopAnimation()
// }
//
// fun stopAnimation() {
// binding.layoutAnimation.lottieAnimation.clearAnimation()
// binding.layoutAnimation.root.visibility = View.GONE
// isBackDisable = false
// }
//
// @SuppressLint("SetTextI18n")
// private fun updateView(jump: Boolean) {
// binding.ivLogo.visibility = if (appList.isEmpty()) View.GONE else View.VISIBLE
// binding.tvCount.visibility = if (appList.isEmpty()) View.GONE else {
// binding.tvCount.text = getString(R.string.issue, appList.size.toString())
// View.VISIBLE
// }
// binding.tvUnit.visibility = if (appList.isEmpty()) View.GONE else View.VISIBLE
// binding.rvMalware.visibility = if (appList.isEmpty()) View.GONE else View.VISIBLE
// binding.ivEmpty.visibility = if (appList.isEmpty()) View.VISIBLE else View.GONE
//
// if (appList.isEmpty()) {
// if (jump) {
// CleanResultActivity.functionKey = ANTIVIRUS
// CleanResultActivity.titleName = getString(R.string.malware_scan)
// goToAc(CleanResultActivity::class.java)
// }
// } else {
// AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
// }
// }
//
// override fun useDefaultImmersive() {
// ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
// val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
// v.setPadding(systemBars.left, 0, systemBars.right, systemBars.bottom)
// binding.clTop.setPadding(0, systemBars.top, 0, 0)
// insets
// }
// }
//
// override fun initView() {
// super.initView()
// showAdAnimation(LottieEnum.MALWARE_SCAN)
// binding.rvMalware.adapter = adapter
// binding.rvMalware.layoutManager = LinearLayoutManager(this)
//
// initData()
//
// if (BuildConfig.DEBUG) {
// scanFinishData(null)
// }
//
// setFunctionTodayUsed(ANTIVIRUS)
//
// }
//
// override fun initListener() {
// super.initListener()
// binding.flBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() }
// }
//
// override fun handleBackCallBack() {
// super.handleBackCallBack()
// }
//}
\ No newline at end of file
package com.base.appzxhy.ui.malware
import android.app.Activity
import android.view.LayoutInflater
import androidx.appcompat.app.AlertDialog
import com.base.appzxhy.databinding.DialogMalwareTipBinding
import com.base.appzxhy.utils.AppPreferences
//是否已经同意
var malwareTipAgree = false
get() {
return AppPreferences.getInstance().getBoolean("malwareTipAgree", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("malwareTipAgree", value, true)
}
class MalwareDialog(
val activity: Activity
) {
val dialog = AlertDialog.Builder(activity).create()
val binding = DialogMalwareTipBinding.inflate(LayoutInflater.from(activity))
var action: ((flag: Boolean) -> Unit)? = null
fun showDialog() {
if (malwareTipAgree) {
action?.invoke(true)
return
}
dialog.setView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
val params = dialog.window?.attributes
// params?.width = ConstraintLayout.LayoutParams.MATCH_PARENT
// params?.width = activity.resources.getDimensionPixelSize(R.dimen.dp_295)
// params?.height = ConstraintLayout.LayoutParams.WRAP_CONTENT
// params?.gravity = Gravity.BOTTOM
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
var flag = false
binding.tvCancel.setOnClickListener {
dialog.dismiss()
}
binding.tvSure.setOnClickListener {
dialog.dismiss()
flag = true
malwareTipAgree = true
action?.invoke(true)
}
dialog.setOnDismissListener {
action?.invoke(flag)
}
}
}
\ No newline at end of file
//package com.base.appzxhy.ui.malware
//
//import android.app.Activity
//import android.view.LayoutInflater
//import androidx.appcompat.app.AlertDialog
//import com.base.appzxhy.databinding.DialogMalwareTipBinding
//import com.base.appzxhy.utils.AppPreferences
//
////是否已经同意
//var malwareTipAgree = false
// get() {
// return AppPreferences.getInstance().getBoolean("malwareTipAgree", field)
// }
// set(value) {
// field = value
// AppPreferences.getInstance().put("malwareTipAgree", value, true)
// }
//
//class MalwareDialog(
// val activity: Activity
//) {
//
// val dialog = AlertDialog.Builder(activity).create()
// val binding = DialogMalwareTipBinding.inflate(LayoutInflater.from(activity))
//
// var action: ((flag: Boolean) -> Unit)? = null
//
// fun showDialog() {
//
// if (malwareTipAgree) {
// action?.invoke(true)
// return
// }
//
// dialog.setView(binding.root)
// dialog.setCanceledOnTouchOutside(false)
// dialog.show()
//
// val params = dialog.window?.attributes
//// params?.width = ConstraintLayout.LayoutParams.MATCH_PARENT
//// params?.width = activity.resources.getDimensionPixelSize(R.dimen.dp_295)
//// params?.height = ConstraintLayout.LayoutParams.WRAP_CONTENT
//// params?.gravity = Gravity.BOTTOM
// dialog.window?.attributes = params
// dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
//
// var flag = false
//
// binding.tvCancel.setOnClickListener {
// dialog.dismiss()
// }
// binding.tvSure.setOnClickListener {
// dialog.dismiss()
// flag = true
// malwareTipAgree = true
// action?.invoke(true)
// }
//
// dialog.setOnDismissListener {
// action?.invoke(flag)
// }
// }
//}
\ No newline at end of file
......@@ -38,9 +38,7 @@ import com.base.appzxhy.business.service.StayJobService.Companion.startStayJobSe
import com.base.appzxhy.databinding.ActivitySplashBinding
import com.base.appzxhy.ui.dialog.StoragePermissionDialog
import com.base.appzxhy.ui.guide.GuideCleanActivity
import com.base.appzxhy.ui.language.LanguageActivity
import com.base.appzxhy.ui.main.MainActivity
import com.base.appzxhy.ui.malware.MalwareDialog
import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.PermissionUtils.checkStorePermission
import com.base.appzxhy.utils.PermissionUtils.requestStoragePermission
......@@ -283,21 +281,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding
}
}
if (actionId == ANTIVIRUS) {
val dialog = MalwareDialog(this)
dialog.action = {
if (it) {
actionStorage.invoke()
} else {
goToAc(MainActivity::class.java)
finish()
}
}
dialog.showDialog()
} else {
actionStorage.invoke()
}
actionStorage.invoke()
}
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="@dimen/dp_1"
android:color="#AEB4BD" />
<corners android:radius="@dimen/dp_4" />
</shape>
\ No newline at end of file
......@@ -11,7 +11,7 @@
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%">
<shape>
<solid android:color="#2DD29E" /> <!-- 进度条颜色 -->
<solid android:color="@color/colorPrimary" /> <!-- 进度条颜色 -->
<corners android:radius="@dimen/dp_10" />
</shape>
</scale>
......
......@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/white_background">
android:background="@drawable/bg_ffffff_10">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_title"
......@@ -41,18 +41,17 @@
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_cancel"
android:layout_width="0dp"
android:layout_height="@dimen/dp_50"
android:layout_height="@dimen/dp_40"
android:layout_marginStart="32dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="24dp"
android:background="@drawable/bg_enable_no_50"
android:background="@drawable/bg_stroke_aeb4bd_4"
android:foreground="?attr/selectableItemBackground"
android:gravity="center"
android:paddingVertical="8dp"
android:text="@string/cancel"
android:textColor="@color/colorPrimary"
android:textSize="14sp"
android:textColor="#AEB4BD"
android:textSize="@dimen/sp_14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/tv_confirm"
app:layout_constraintStart_toStartOf="parent"
......@@ -61,18 +60,17 @@
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_confirm"
android:layout_width="0dp"
android:layout_height="@dimen/dp_50"
android:layout_height="@dimen/dp_40"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="32dp"
android:layout_marginBottom="24dp"
android:background="@drawable/bg_enable_50"
android:background="@drawable/bg_enable_4"
android:foreground="?attr/selectableItemBackground"
android:gravity="center"
android:paddingVertical="8dp"
android:text="@string/confirm"
android:textColor="@color/white"
android:textSize="14sp"
android:textSize="@dimen/sp_14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_cancel"
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/white_background_top"
android:paddingTop="24dp"
android:paddingBottom="40dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp"
android:text="@string/storage_permission_title"
android:textColor="@color/color_1a1a1a"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp"
android:layout_marginTop="8dp"
android:text="@string/storage_permission_content"
android:textColor="@color/color_666666"
android:textSize="16sp"
app:layout_constraintTop_toBottomOf="@id/tv_title" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_permission"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="12dp"
android:adjustViewBounds="true"
android:src="@drawable/img_quanxian_pop"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvContent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvOpenSettings"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="30dp"
android:layout_marginTop="30dp"
android:background="@drawable/bg_btn_50"
android:gravity="center"
android:paddingVertical="12dp"
android:text="@string/open_settings"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintTop_toBottomOf="@id/iv_permission" />
</androidx.constraintlayout.widget.ConstraintLayout>
......@@ -51,7 +51,7 @@
android:layout_width="@dimen/dp_250"
android:layout_height="@dimen/dp_250"
android:layout_gravity="center_horizontal"
android:layout_marginTop="-10dp">
android:layout_marginTop="-20dp">
<View
android:layout_width="match_parent"
......@@ -121,6 +121,7 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_marginTop="-10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
......
......@@ -70,4 +70,5 @@
<dimen name="dp_250">250dp</dimen>
<dimen name="dp_28">28dp</dimen>
<dimen name="dp_54">54dp</dimen>
<dimen name="dp_32">32dp</dimen>
</resources>
\ No newline at end of file
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