Commit 8881a7c0 authored by Your Name's avatar Your Name

新增引导页前加多选刷新广告+max广告切换+引流sdk+价值回传+salor的归因+去除appprcess、appmanager、whatsapp功能

parent e8114bd2
...@@ -11,7 +11,7 @@ android { ...@@ -11,7 +11,7 @@ android {
defaultConfig { defaultConfig {
applicationId = "com.a.s" applicationId = "com.asdqwe.ada.aaa"
minSdk = 28 minSdk = 28
targetSdk = 34 targetSdk = 34
versionCode = 19 versionCode = 19
...@@ -97,6 +97,7 @@ dependencies { ...@@ -97,6 +97,7 @@ dependencies {
implementation(libs.okhttp) implementation(libs.okhttp)
implementation(libs.logging.interceptor) implementation(libs.logging.interceptor)
implementation(libs.solar.engine) implementation(libs.solar.engine)
implementation(libs.vungle) implementation(libs.vungle)
implementation(libs.facebook) implementation(libs.facebook)
implementation(libs.mintegral) implementation(libs.mintegral)
...@@ -122,4 +123,5 @@ dependencies { ...@@ -122,4 +123,5 @@ dependencies {
// debugApi ("com.squareup.leakcanary:leakcanary-android:2.12")//leakcanary // debugApi ("com.squareup.leakcanary:leakcanary-android:2.12")//leakcanary
implementation ("com.facebook.shimmer:shimmer:0.5.0") implementation ("com.facebook.shimmer:shimmer:0.5.0")
implementation(files("../app/libs/linkplayad_v1.0.0-release.aar"))
} }
\ No newline at end of file
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
"client_info": { "client_info": {
"mobilesdk_app_id": "1:136978743377:android:7127da27894a4e56137870", "mobilesdk_app_id": "1:136978743377:android:7127da27894a4e56137870",
"android_client_info": { "android_client_info": {
"package_name": "com.a.s" "package_name": "com.asdqwe.ada.aaa"
} }
}, },
"oauth_client": [], "oauth_client": [],
......
...@@ -38,6 +38,9 @@ ...@@ -38,6 +38,9 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.SwiftCleanerPhoneHelper" android:theme="@style/Theme.SwiftCleanerPhoneHelper"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name=".view.activity.ClooseFunActivity"
android:exported="false" />
<activity <activity
android:name=".view.activity.AnimatorActivity" android:name=".view.activity.AnimatorActivity"
android:exported="false" /> android:exported="false" />
...@@ -81,24 +84,15 @@ ...@@ -81,24 +84,15 @@
<activity <activity
android:name=".view.activity.SimilarPhotosActivity" android:name=".view.activity.SimilarPhotosActivity"
android:exported="false" /> android:exported="false" />
<activity
android:name=".view.activity.WhatsAppActivity"
android:exported="false" />
<activity <activity
android:name=".view.activity.ScreenShotActivity" android:name=".view.activity.ScreenShotActivity"
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".view.activity.LargeFileActivity" android:name=".view.activity.LargeFileActivity"
android:exported="false" /> android:exported="false" />
<activity
android:name=".view.activity.AppProcessActivity"
android:exported="false" />
<activity <activity
android:name=".view.activity.InfoActivity" android:name=".view.activity.InfoActivity"
android:exported="false" /> android:exported="false" />
<activity
android:name=".view.activity.BatteryInfoActivity"
android:exported="false" />
<activity <activity
android:name=".view.activity.EndCleanJunkActivity" android:name=".view.activity.EndCleanJunkActivity"
android:exported="false" /> android:exported="false" />
......
...@@ -5,6 +5,7 @@ import android.app.AlarmManager ...@@ -5,6 +5,7 @@ import android.app.AlarmManager
import android.app.Application import android.app.Application
import android.app.PendingIntent import android.app.PendingIntent
import android.app.job.JobService import android.app.job.JobService
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Bundle import android.os.Bundle
...@@ -15,6 +16,8 @@ import androidx.work.NetworkType ...@@ -15,6 +16,8 @@ import androidx.work.NetworkType
import androidx.work.PeriodicWorkRequestBuilder import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager import androidx.work.WorkManager
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.clean.file.b.business.newAdmob.AdmobHelps
import com.link.play.ad.LinkPlaySdk
import com.reyun.solar.engine.OnAttributionListener import com.reyun.solar.engine.OnAttributionListener
import com.reyun.solar.engine.SolarEngineConfig import com.reyun.solar.engine.SolarEngineConfig
import com.reyun.solar.engine.SolarEngineManager import com.reyun.solar.engine.SolarEngineManager
...@@ -55,12 +58,10 @@ class CleanApplication : Application() { ...@@ -55,12 +58,10 @@ class CleanApplication : Application() {
fun init() { fun init() {
context.init() context.init()
} }
fun startNotification() { fun startNotification() {
context.startNotification() context.startNotification()
} }
} }
private var guideSharedPreferences: SharedPreferences? = null private var guideSharedPreferences: SharedPreferences? = null
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
...@@ -78,6 +79,12 @@ class CleanApplication : Application() { ...@@ -78,6 +79,12 @@ class CleanApplication : Application() {
if (SPUtils.getInstance().getBoolean(KEY_INIT)) init() if (SPUtils.getInstance().getBoolean(KEY_INIT)) init()
Thread { Glide.get(this).clearDiskCache() }.start() Thread { Glide.get(this).clearDiskCache() }.start()
//日志
LinkPlaySdk.isDebug(true)
//接口配置
// LinkPlaySdk.init(this,GlobalConfig.URL_API,GlobalConfig.PACKAGE_NAME,GlobalConfig.KEY_AES)
LinkPlaySdk.init(this,"https://feedapihk.zhangxinhulian.com","com.unamzo.pdfreader.badcc","1qd6f41dgpjsep9t")
guideSharedPreferences = getSharedPreferences("ButtonSP", MODE_PRIVATE) guideSharedPreferences = getSharedPreferences("ButtonSP", MODE_PRIVATE)
} }
...@@ -87,7 +94,8 @@ class CleanApplication : Application() { ...@@ -87,7 +94,8 @@ class CleanApplication : Application() {
private fun init() { private fun init() {
startNotification() startNotification()
InstallReferrerUtils.init() InstallReferrerUtils.init()
BlacklistUtils.requestBlacklist { AdmobManager.blacklist = it } // BlacklistUtils.requestBlacklist { AdmobManager.blacklist = it }
BlacklistUtils.requestBlacklist { AdmobHelps.blacklist = it }
initSolar() initSolar()
initFirebase() initFirebase()
initAlarm(1, 1800000, AlarmReceiver::class.java) initAlarm(1, 1800000, AlarmReceiver::class.java)
...@@ -95,8 +103,8 @@ class CleanApplication : Application() { ...@@ -95,8 +103,8 @@ class CleanApplication : Application() {
initAlarm(3, 1800000 * 2 * 72, Alarm2Receiver::class.java) initAlarm(3, 1800000 * 2 * 72, Alarm2Receiver::class.java)
initWorkManager() initWorkManager()
// BatteryReceiver.register(this) // BatteryReceiver.register(this)
PackageReceiver.register(this) PackageReceiver.register(context)
UnlockReceiver.register(this) UnlockReceiver.register(context)
} }
private fun initSolar() { private fun initSolar() {
...@@ -221,7 +229,7 @@ class CleanApplication : Application() { ...@@ -221,7 +229,7 @@ class CleanApplication : Application() {
override fun onActivityStopped(activity: Activity) { override fun onActivityStopped(activity: Activity) {
count-- count--
if (count == 0) { if (count == 0) {
BadgeUtils.setBadgeNum(context, 1) // BadgeUtils.setBadgeNum(context, 1)
} }
} }
......
...@@ -47,10 +47,10 @@ object GlobalConfig { ...@@ -47,10 +47,10 @@ object GlobalConfig {
// max广告位id // max广告位id
inline val ID_MAX_OPEN get() = "None" inline val ID_MAX_OPEN get() = "d1d943cdd3127c90"
inline val ID_MAX_INTER get() = "None" inline val ID_MAX_INTER get() = "b31e7f6d11ee659e"
inline val ID_MAX_NATIVE get() = "None" inline val ID_MAX_NATIVE get() = "96e8fe78b0efc5d1"
inline val ID_MAX_BANNER get() = "None" inline val ID_MAX_BANNER get() = "ca-app-pub-3940256099942544/9214589741"
inline val ID_MAX_REWARD get() = "None" inline val ID_MAX_REWARD get() = "None"
/** /**
...@@ -81,6 +81,7 @@ object GlobalConfig { ...@@ -81,6 +81,7 @@ object GlobalConfig {
// "GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW" // "GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
// //
const val KEY_AD = "sAds"
const val KEY_INIT = "key_init" const val KEY_INIT = "key_init"
const val KEY_CLEANUP_SIZE = "key_cleanup_size" const val KEY_CLEANUP_SIZE = "key_cleanup_size"
const val KEY_SCORE = "key_score" const val KEY_SCORE = "key_score"
...@@ -97,8 +98,6 @@ object GlobalConfig { ...@@ -97,8 +98,6 @@ object GlobalConfig {
const val KEY_MALWARE_SCAN = "malware_scan_agree" const val KEY_MALWARE_SCAN = "malware_scan_agree"
const val ID_CLEAN_JUNK = 12000 const val ID_CLEAN_JUNK = 12000
const val ID_WHATSAPP = 12010
const val ID_APPMANAGER = 12010
const val ID_BATTERY_INFO = 12020 const val ID_BATTERY_INFO = 12020
const val ID_LARGE_FILE_CLEANER = 12030 const val ID_LARGE_FILE_CLEANER = 12030
const val ID_SIMILAR_PHOTOS = 12040 const val ID_SIMILAR_PHOTOS = 12040
...@@ -107,7 +106,6 @@ object GlobalConfig { ...@@ -107,7 +106,6 @@ object GlobalConfig {
const val ID_APP_UNINSTALL = 12070 const val ID_APP_UNINSTALL = 12070
const val ID_NOT_CLEANED = 12080 const val ID_NOT_CLEANED = 12080
const val ID_BATTERY_LEVEL = 12090 const val ID_BATTERY_LEVEL = 12090
const val ID_APP_PROCESS = 12100
const val ID_WHEATHER = 12087 const val ID_WHEATHER = 12087
const val ID_XINGZUO = 12088 const val ID_XINGZUO = 12088
const val ID_MALWARE_CLEAN= 12089 const val ID_MALWARE_CLEAN= 12089
......
...@@ -109,6 +109,7 @@ object AdmobManager { ...@@ -109,6 +109,7 @@ object AdmobManager {
get() = SPUtils.getInstance().getBoolean("sAd", true) get() = SPUtils.getInstance().getBoolean("sAd", true)
set(value) = SPUtils.getInstance().putBoolean("sAd", value) set(value) = SPUtils.getInstance().putBoolean("sAd", value)
fun init( fun init(
context: Context, context: Context,
loaded: (Int) -> Unit, loaded: (Int) -> Unit,
...@@ -748,12 +749,12 @@ object AdmobManager { ...@@ -748,12 +749,12 @@ object AdmobManager {
return dateDifference < numMilliSecondsPerHour * numHours return dateDifference < numMilliSecondsPerHour * numHours
} }
// private fun isBlacklist(): Boolean { private fun isBlacklist(): Boolean {
// return blacklist != 1 return blacklist != 1
// }
private fun isBlacklist(): Boolean {
return false
} }
// private fun isBlacklist(): Boolean {
// return false
// }
private fun checkAvailable(adUnit: String, checkIntervalTime: Boolean = false): Boolean { private fun checkAvailable(adUnit: String, checkIntervalTime: Boolean = false): Boolean {
if (isBlacklist()) { if (isBlacklist()) {
......
...@@ -126,6 +126,7 @@ object ReportAdUtils { ...@@ -126,6 +126,7 @@ object ReportAdUtils {
) )
roasbundle.putString(FirebaseAnalytics.Param.CURRENCY, "USD") roasbundle.putString(FirebaseAnalytics.Param.CURRENCY, "USD")
Firebase.analytics.logEvent("Total_Ads_Revenue_001", roasbundle) Firebase.analytics.logEvent("Total_Ads_Revenue_001", roasbundle)
SolarEngineEvent.eventSolar(ad, valueMicros)
taichiSharedPreferencesEditor.putFloat("TaichiTroasCache", 0f)//重新清零,开始计算 taichiSharedPreferencesEditor.putFloat("TaichiTroasCache", 0f)//重新清零,开始计算
val logger = AppEventsLogger.newLogger(CleanApplication.context) val logger = AppEventsLogger.newLogger(CleanApplication.context)
......
package com.swiftcleaner.chovey.business.admob
import com.google.android.gms.ads.appopen.AppOpenAd
import com.google.android.gms.ads.interstitial.InterstitialAd
import com.google.android.gms.ads.nativead.NativeAd
import com.google.android.gms.ads.rewarded.RewardedAd
import com.reyun.solar.engine.SolarEngineManager
import com.reyun.solar.engine.infos.SEAdImpEventModel
import com.swiftcleaner.chovey.GlobalConfig
import org.json.JSONObject
/**
* 作者:马海钊
* 时间:2025/3/12 14:13
* 功能:
*/
object SolarEngineEvent {
fun eventSolar(ad: Any?, valueMicros: Long) = Thread {
val json = JSONObject()
//变现平台
val adNetworkPlatform = "AdMob"
//聚合平台标识
val mediationPlatform = "admob"
//广告的类型
// adType 为激励视频时,只需要传入 1
// 1:激励视频
// 2:开屏
// 3:插屏
// 4:全屏视频
// 5:Banner
// 6:信息流
// 7:短视频信息流
// 8:大横幅
// 9:视频贴片
// 10:中等尺寸横幅
// 0:其它
var adType = -1
//变现平台的应用 ID
val adNetworkAppID = "ca-app-pub-3640696756167444~1506657395"
//变现平台的变现广告位 ID
var adNetworkADID = ""
//广告 ecpm,单位:元(广告千次展现的变现收入,0或负值表示没传,单位为元)
val ecpm = valueMicros / 1000.0
//货币种类
val currencyType = "USD"
when (ad) {
is AppOpenAd -> {
adType = 2
adNetworkADID = ad.adUnitId
}
is InterstitialAd -> {
adType = 3
adNetworkADID = ad.adUnitId
}
is NativeAd -> {
adType = 6
adNetworkADID = GlobalConfig.ID_ADMOB_NATIVE
}
is RewardedAd -> {
adType = 1
adNetworkADID = ad.adUnitId
}
else -> {//banner
adType = 5
adNetworkADID = GlobalConfig.ID_ADMOB_BANNER
}
}
try {
} catch (e: Exception) {
//
}
val seAdImpEventModel = SEAdImpEventModel(
adNetworkPlatform,
mediationPlatform,
adType,
adNetworkAppID,
adNetworkADID,
ecpm,
currencyType,
true,
json
)
SolarEngineManager.getInstance().trackAdImpression(seAdImpEventModel)
}.start()
}
\ No newline at end of file
...@@ -49,6 +49,7 @@ import com.swiftcleaner.chovey.GlobalConfig.ID_MAX_BANNER ...@@ -49,6 +49,7 @@ import com.swiftcleaner.chovey.GlobalConfig.ID_MAX_BANNER
import com.swiftcleaner.chovey.GlobalConfig.ID_MAX_INTER import com.swiftcleaner.chovey.GlobalConfig.ID_MAX_INTER
import com.swiftcleaner.chovey.GlobalConfig.ID_MAX_NATIVE import com.swiftcleaner.chovey.GlobalConfig.ID_MAX_NATIVE
import com.swiftcleaner.chovey.GlobalConfig.ID_MAX_OPEN import com.swiftcleaner.chovey.GlobalConfig.ID_MAX_OPEN
import com.swiftcleaner.chovey.GlobalConfig.KEY_AD
import com.swiftcleaner.chovey.GlobalConfig.KEY_MAX import com.swiftcleaner.chovey.GlobalConfig.KEY_MAX
import com.swiftcleaner.chovey.R import com.swiftcleaner.chovey.R
import com.swiftcleaner.chovey.business.admob.AdmobManager import com.swiftcleaner.chovey.business.admob.AdmobManager
...@@ -82,6 +83,8 @@ object AdmobHelps { ...@@ -82,6 +83,8 @@ object AdmobHelps {
private const val KEY_IS_SHOW_AD_BANNER = "isShowAdBanner" private const val KEY_IS_SHOW_AD_BANNER = "isShowAdBanner"
private const val KEY_IS_SHOW_AD_NATIVE = "isShowAdNative" private const val KEY_IS_SHOW_AD_NATIVE = "isShowAdNative"
private const val KEY_IS_SHOW_AD_NATIVE_BOTTOM = "isShowAdNativeBottom" private const val KEY_IS_SHOW_AD_NATIVE_BOTTOM = "isShowAdNativeBottom"
private const val KEY_IS_SHOW_AD_CLOOSE_NATIVE = "isShowAdClooseNative"
private const val KEY_IS_SHOW_AD_NATIVE_EXITFUNCTION = "isShowAdNativeExitFunction"
private const val KEY_IS_SHOW_AD_NATIVE_ANIMATOR = "isShowAdNativeAnimator" private const val KEY_IS_SHOW_AD_NATIVE_ANIMATOR = "isShowAdNativeAnimator"
private const val KEY_IS_SHOW_AD_INTER = "isShowAdInter" private const val KEY_IS_SHOW_AD_INTER = "isShowAdInter"
private const val KEY_IS_SHOW_AD_BACK_INTER = "isShowAdBackInter" private const val KEY_IS_SHOW_AD_BACK_INTER = "isShowAdBackInter"
...@@ -120,15 +123,17 @@ object AdmobHelps { ...@@ -120,15 +123,17 @@ object AdmobHelps {
private var nativeAdLoadTime: Long = 0 private var nativeAdLoadTime: Long = 0
private var isLoadingNativeAd = false private var isLoadingNativeAd = false
private val nativeCacheItems = ConcurrentLinkedDeque<NativeAd>() private val nativeCacheItems = ConcurrentLinkedDeque<NativeAd>()
private var maxAdCacheItems = ConcurrentLinkedDeque<MaxAd>()
private var maxNativeAdLoaderCacheItems = ConcurrentLinkedDeque<MaxNativeAdLoader>()
private var lastShowTime: Long = 0 private var lastShowTime: Long = 0
var blacklist = 1 var blacklist = 1
private var showTime private var showTime
get() = SPUtils.getInstance().getLong(KEY_LAST_DISPLAY_TIME) get() = SPUtils.getInstance().getLong(KEY_LAST_DISPLAY_TIME)
set(value) = SPUtils.getInstance().putLong(KEY_LAST_DISPLAY_TIME, value) set(value) = SPUtils.getInstance().putLong(KEY_LAST_DISPLAY_TIME, value)
inline var useAdmob inline var useAdmob
get() = SPUtils.getInstance().getBoolean("sAd", true) get() = SPUtils.getInstance().getInt(KEY_AD, 1)
set(value) = SPUtils.getInstance().putBoolean("sAd", value) set(value) = SPUtils.getInstance().putInt(KEY_AD, value)
fun init( fun init(
context: Context, context: Context,
...@@ -139,7 +144,7 @@ object AdmobHelps { ...@@ -139,7 +144,7 @@ object AdmobHelps {
failed.invoke() failed.invoke()
return return
} }
if (AdmobManager.useAdmob) { if (isAdmob()) {
if (isAppOpenAdAvailable()) { if (isAppOpenAdAvailable()) {
loaded.invoke(0) loaded.invoke(0)
return return
...@@ -201,7 +206,7 @@ object AdmobHelps { ...@@ -201,7 +206,7 @@ object AdmobHelps {
APP_OPEN_AD_UNIT, APP_OPEN_AD_UNIT,
(context as Activity).javaClass.simpleName (context as Activity).javaClass.simpleName
) )
if (useAdmob) { if (isAdmob()) {
val adRequest = AdRequest.Builder().build() val adRequest = AdRequest.Builder().build()
AppOpenAd.load( AppOpenAd.load(
context, context,
...@@ -286,7 +291,7 @@ object AdmobHelps { ...@@ -286,7 +291,7 @@ object AdmobHelps {
INTERSTITIAL_AD_UNIT, INTERSTITIAL_AD_UNIT,
(context as Activity).javaClass.simpleName (context as Activity).javaClass.simpleName
) )
if (useAdmob) { if (isAdmob()) {
val adRequest = AdRequest.Builder().build() val adRequest = AdRequest.Builder().build()
InterstitialAd.load( InterstitialAd.load(
context, context,
...@@ -360,7 +365,7 @@ object AdmobHelps { ...@@ -360,7 +365,7 @@ object AdmobHelps {
Log.d(TAG, "native Ad load.") Log.d(TAG, "native Ad load.")
val reqId = UUID.randomUUID().toString() val reqId = UUID.randomUUID().toString()
ReportAdUtils.pullStartAd(reqId, NATIVE_AD_UNIT, activity.javaClass.simpleName) ReportAdUtils.pullStartAd(reqId, NATIVE_AD_UNIT, activity.javaClass.simpleName)
if (useAdmob) { if (isAdmob()) {
val adLoader = AdLoader.Builder( val adLoader = AdLoader.Builder(
activity, activity,
ID_ADMOB_NATIVE ID_ADMOB_NATIVE
...@@ -401,6 +406,10 @@ object AdmobHelps { ...@@ -401,6 +406,10 @@ object AdmobHelps {
val nativeAdLoader = MaxNativeAdLoader(ID_MAX_NATIVE, activity) val nativeAdLoader = MaxNativeAdLoader(ID_MAX_NATIVE, activity)
nativeAdLoader.setNativeAdListener(object : MaxNativeAdListener() { nativeAdLoader.setNativeAdListener(object : MaxNativeAdListener() {
override fun onNativeAdLoaded(nativeAdView: MaxNativeAdView?, ad: MaxAd) { override fun onNativeAdLoaded(nativeAdView: MaxNativeAdView?, ad: MaxAd) {
nativeAdLoadTime = System.currentTimeMillis()
maxAdCacheItems.offer(ad)
maxNativeAdLoaderCacheItems.offer(nativeAdLoader)
loaded?.invoke()
Log.d(TAG, "native Ad Max loaded.") Log.d(TAG, "native Ad Max loaded.")
} }
...@@ -442,7 +451,7 @@ object AdmobHelps { ...@@ -442,7 +451,7 @@ object AdmobHelps {
return return
} }
if (useAdmob) { if (isAdmob()) {
appOpenAd?.fullScreenContentCallback = object : FullScreenContentCallback() { appOpenAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() { override fun onAdClicked() {
Log.d(TAG, "app open Ad was clicked") Log.d(TAG, "app open Ad was clicked")
...@@ -520,7 +529,8 @@ object AdmobHelps { ...@@ -520,7 +529,8 @@ object AdmobHelps {
dismissed: (() -> Unit)? = null, dismissed: (() -> Unit)? = null,
completed: (() -> Unit)? = null, completed: (() -> Unit)? = null,
failed: (() -> Unit)? = null, failed: (() -> Unit)? = null,
isRetry: Boolean = false isRetry: Boolean = false,
isOpenDialog:Boolean=false
) { ) {
if (activity.isFinishing || activity.isDestroyed) return if (activity.isFinishing || activity.isDestroyed) return
...@@ -532,30 +542,36 @@ object AdmobHelps { ...@@ -532,30 +542,36 @@ object AdmobHelps {
if (!isRetry) ReportAdUtils.showPrepareAd(INTERSTITIAL_AD_UNIT) if (!isRetry) ReportAdUtils.showPrepareAd(INTERSTITIAL_AD_UNIT)
var dialog: Dialog? = null var dialog: Dialog? = null
// 每次调用都展示对话框
if (!activity.isFinishing && !activity.isDestroyed) {
dialog = activity.showAdLoadingDialog()
dialog?.show()
}
// 标记广告加载是否成功的标志 // 标记广告加载是否成功的标志
var adLoadedSuccessfully = false var adLoadedSuccessfully = false
// 每次调用都展示对话框
// 启动一个三秒的倒计时 if (!activity.isFinishing && !activity.isDestroyed) {
Handler(Looper.getMainLooper()).postDelayed({ if (!isOpenDialog){
if (dialog != null && dialog?.isShowing == true) { dialog = activity.showAdLoadingDialog()
dialog?.dismiss() dialog?.show()
if (adLoadedSuccessfully) { // 启动一个三秒的倒计时
// 如果广告加载成功,则展示广告 Handler(Looper.getMainLooper()).postDelayed({
showInterAd(activity, dismissed, completed, failed) if (dialog != null && dialog?.isShowing == true) {
} else { dialog?.dismiss()
// 如果广告加载失败,则调用失败回调 if (adLoadedSuccessfully) {
failed?.invoke() // 如果广告加载成功,则展示广告
} showInterAd(activity, dismissed, completed, failed)
} else {
// 如果广告加载失败,则调用失败回调
failed?.invoke()
}
}
}, 3000)
} }
}, 3000) }else{
if (adLoadedSuccessfully) {
// 如果广告加载成功,则展示广告
showInterAd(activity, dismissed, completed, failed)
} else {
// 如果广告加载失败,则调用失败回调
failed?.invoke()
}
}
// 检查是否有缓存的插屏广告 // 检查是否有缓存的插屏广告
if (isInterstitialAdAvailable()) { if (isInterstitialAdAvailable()) {
// 如果有缓存的广告,标记加载成功 // 如果有缓存的广告,标记加载成功
...@@ -567,7 +583,6 @@ object AdmobHelps { ...@@ -567,7 +583,6 @@ object AdmobHelps {
adLoadedSuccessfully.let { adLoadedSuccessfully.let {
adLoadedSuccessfully = true adLoadedSuccessfully = true
} }
}, { }, {
// 广告加载失败 // 广告加载失败
adLoadedSuccessfully = false adLoadedSuccessfully = false
...@@ -585,7 +600,7 @@ object AdmobHelps { ...@@ -585,7 +600,7 @@ object AdmobHelps {
completed: (() -> Unit)? = null, completed: (() -> Unit)? = null,
failed: (() -> Unit?)? = null, failed: (() -> Unit?)? = null,
) { ) {
if (useAdmob) { if (isAdmob()) {
interstitialAd?.fullScreenContentCallback = object : FullScreenContentCallback() { interstitialAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() { override fun onAdClicked() {
Log.d(TAG, "interstitial Ad was clicked") Log.d(TAG, "interstitial Ad was clicked")
...@@ -662,6 +677,7 @@ object AdmobHelps { ...@@ -662,6 +677,7 @@ object AdmobHelps {
interstitialMaxAd?.showAd(activity) interstitialMaxAd?.showAd(activity)
} }
} }
fun showNativeAd( fun showNativeAd(
activity: Activity, activity: Activity,
parent: ViewGroup, parent: ViewGroup,
...@@ -676,7 +692,7 @@ object AdmobHelps { ...@@ -676,7 +692,7 @@ object AdmobHelps {
} }
if (!isRetry) ReportAdUtils.showPrepareAd(NATIVE_AD_UNIT) if (!isRetry) ReportAdUtils.showPrepareAd(NATIVE_AD_UNIT)
if (useAdmob) { if (isAdmob()) {
val nativeAd = getNativeAd() val nativeAd = getNativeAd()
if (nativeAd == null) { if (nativeAd == null) {
Log.d(TAG, "The native ad is not ready yet.") Log.d(TAG, "The native ad is not ready yet.")
...@@ -700,9 +716,43 @@ object AdmobHelps { ...@@ -700,9 +716,43 @@ object AdmobHelps {
ReportAdUtils.showAd(nativeAd.responseInfo, NATIVE_AD_UNIT, activity) ReportAdUtils.showAd(nativeAd.responseInfo, NATIVE_AD_UNIT, activity)
} }
loadNativeAd(activity) loadNativeAd(activity)
} else {
val max = getMaxAd()
if (max == null) {
Log.d(TAG, "The native Ad Max is not ready yet.")
if (isRetry) return
loadNativeAd(activity) {
showNativeAd(
activity,
parent,
layout,
isShowAdNative,
true
)
}
return
}
NativeView1(parent.context, layout).run {
parent.removeAllViews()
setNativeAd(max.second, max.first)
parent.addView(this)
parent.isVisible = true
}
if (maxAdCacheItems.size == 0)
loadNativeAd(activity)
} }
} }
private fun getMaxAd(): Pair<MaxAd, MaxNativeAdLoader>? {
val maxAd = maxAdCacheItems.poll()
val maxNativeAdLoader = maxNativeAdLoaderCacheItems.poll()
if (maxAd == null || maxNativeAdLoader == null) return null
if (!isNativeAdAvailable()) {
return getMaxAd()
}
return Pair(maxAd, maxNativeAdLoader)
}
private fun getNativeAd(): NativeAd? { private fun getNativeAd(): NativeAd? {
val nativeAd = nativeCacheItems.poll() ?: return null val nativeAd = nativeCacheItems.poll() ?: return null
if (!wasLoadTimeLessThanNHoursAgo(1, nativeAdLoadTime)) { if (!wasLoadTimeLessThanNHoursAgo(1, nativeAdLoadTime)) {
...@@ -710,23 +760,33 @@ object AdmobHelps { ...@@ -710,23 +760,33 @@ object AdmobHelps {
} }
return nativeAd return nativeAd
} }
private fun initShimmerFrameLayout( private fun initShimmerFrameLayout(
activity: Activity, activity: Activity,
parent: ViewGroup, parent: ViewGroup,
layout: Int, layout: Int,
) { ) {
val shimmerFrameLayout = activity.layoutInflater.inflate(R.layout.shimmer_layout, parent, false) as ShimmerFrameLayout val shimmerFrameLayout = activity.layoutInflater.inflate(
R.layout.shimmer_layout,
parent,
false
) as ShimmerFrameLayout
parent.addView(shimmerFrameLayout) parent.addView(shimmerFrameLayout)
// 根据不同的布局文件设置占位动画的内容 // 根据不同的布局文件设置占位动画的内容
if (layout == R.layout.layout_ad_native1) { if (layout == R.layout.layout_ad_native1) {
val binding = LayoutAdNative1Binding.inflate(activity.layoutInflater, shimmerFrameLayout, false) val binding =
LayoutAdNative1Binding.inflate(activity.layoutInflater, shimmerFrameLayout, false)
shimmerFrameLayout.addView(binding.root) shimmerFrameLayout.addView(binding.root)
// binding.secondContainer.isInvisible = true // binding.secondContainer.isInvisible = true
// binding.bgContainer.background = null // binding.bgContainer.background = null
} }
if (layout == R.layout.layout_ad_native_small) { if (layout == R.layout.layout_ad_native_small) {
val binding = LayoutAdNativeSmallBinding.inflate(activity.layoutInflater, shimmerFrameLayout, false) val binding = LayoutAdNativeSmallBinding.inflate(
activity.layoutInflater,
shimmerFrameLayout,
false
)
shimmerFrameLayout.addView(binding.root) shimmerFrameLayout.addView(binding.root)
binding.adCallToAction.isInvisible = true binding.adCallToAction.isInvisible = true
// binding.bgContainer.background = null // binding.bgContainer.background = null
...@@ -744,6 +804,7 @@ object AdmobHelps { ...@@ -744,6 +804,7 @@ object AdmobHelps {
completed: (() -> Unit?)? = null, completed: (() -> Unit?)? = null,
failed: (() -> Unit?)? = null failed: (() -> Unit?)? = null
) { ) {
if (!isAdmob()) return
adViewContainer.viewTreeObserver.addOnGlobalLayoutListener(object : adViewContainer.viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener { ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() { override fun onGlobalLayout() {
...@@ -800,6 +861,7 @@ object AdmobHelps { ...@@ -800,6 +861,7 @@ object AdmobHelps {
} }
} }
} }
private fun showBannerAd( private fun showBannerAd(
context: Context, context: Context,
adViewContainer: ViewGroup, adViewContainer: ViewGroup,
...@@ -868,6 +930,14 @@ object AdmobHelps { ...@@ -868,6 +930,14 @@ object AdmobHelps {
val isShowAdNative = SPUtils.getInstance().getInt(KEY_IS_SHOW_AD_NATIVE_BOTTOM) val isShowAdNative = SPUtils.getInstance().getInt(KEY_IS_SHOW_AD_NATIVE_BOTTOM)
return isShowAdNative == 1 return isShowAdNative == 1
} }
fun isShowAdClooseNative(): Boolean {
val isShowAdClooseNative = SPUtils.getInstance().getInt(KEY_IS_SHOW_AD_CLOOSE_NATIVE)
return isShowAdClooseNative == 1
}
fun isShowAdNativeExitFunction(): Boolean {
val isShowAdNative = SPUtils.getInstance().getInt(KEY_IS_SHOW_AD_NATIVE_EXITFUNCTION)
return isShowAdNative == 1
}
fun isShowAdNativeAnimator(): Boolean { fun isShowAdNativeAnimator(): Boolean {
val isShowAdNative = SPUtils.getInstance().getInt(KEY_IS_SHOW_AD_NATIVE_ANIMATOR) val isShowAdNative = SPUtils.getInstance().getInt(KEY_IS_SHOW_AD_NATIVE_ANIMATOR)
return isShowAdNative == 1 return isShowAdNative == 1
...@@ -889,19 +959,23 @@ object AdmobHelps { ...@@ -889,19 +959,23 @@ object AdmobHelps {
} }
fun isAppOpenAdAvailable(): Boolean { fun isAppOpenAdAvailable(): Boolean {
return (if (useAdmob) appOpenAd != null else appOpenMaxAd?.isReady == true) && wasLoadTimeLessThanNHoursAgo( return (if (isAdmob()) appOpenAd != null else appOpenMaxAd?.isReady == true) && wasLoadTimeLessThanNHoursAgo(
1, 1,
appOpenAdLoadTime appOpenAdLoadTime
) )
} }
fun isInterstitialAdAvailable(): Boolean { fun isInterstitialAdAvailable(): Boolean {
return (if (useAdmob) interstitialAd != null else interstitialMaxAd?.isReady == true) && wasLoadTimeLessThanNHoursAgo( return (if (isAdmob()) interstitialAd != null else interstitialMaxAd?.isReady == true) && wasLoadTimeLessThanNHoursAgo(
1, 1,
interstitialAdLoadTime interstitialAdLoadTime
) )
} }
fun isNativeAdAvailable(): Boolean {
return wasLoadTimeLessThanNHoursAgo(1, nativeAdLoadTime)
}
private fun wasLoadTimeLessThanNHoursAgo(numHours: Long, time: Long): Boolean { private fun wasLoadTimeLessThanNHoursAgo(numHours: Long, time: Long): Boolean {
val dateDifference: Long = System.currentTimeMillis() - time val dateDifference: Long = System.currentTimeMillis() - time
val numMilliSecondsPerHour: Long = 3600000 val numMilliSecondsPerHour: Long = 3600000
...@@ -912,6 +986,10 @@ object AdmobHelps { ...@@ -912,6 +986,10 @@ object AdmobHelps {
return blacklist != 1 return blacklist != 1
} }
private fun isAdmob(): Boolean {
return useAdmob == 1
}
private fun checkAvailable(adUnit: String, checkIntervalTime: Boolean = false): Boolean { private fun checkAvailable(adUnit: String, checkIntervalTime: Boolean = false): Boolean {
if (isBlacklist()) { if (isBlacklist()) {
ReportAdUtils.limitErrorAd(EVENT_BLACKLIST, adUnit) ReportAdUtils.limitErrorAd(EVENT_BLACKLIST, adUnit)
......
...@@ -9,6 +9,10 @@ import android.widget.Button ...@@ -9,6 +9,10 @@ import android.widget.Button
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import com.applovin.mediation.MaxAd
import com.applovin.mediation.nativeAds.MaxNativeAdLoader
import com.applovin.mediation.nativeAds.MaxNativeAdView
import com.applovin.mediation.nativeAds.MaxNativeAdViewBinder
import com.google.android.gms.ads.nativead.NativeAd import com.google.android.gms.ads.nativead.NativeAd
import com.google.android.gms.ads.nativead.NativeAdView import com.google.android.gms.ads.nativead.NativeAdView
import com.swiftcleaner.chovey.R import com.swiftcleaner.chovey.R
...@@ -63,4 +67,25 @@ class NativeView1 @JvmOverloads constructor( ...@@ -63,4 +67,25 @@ class NativeView1 @JvmOverloads constructor(
removeAllViews() removeAllViews()
addView(adView) addView(adView)
} }
fun setNativeAd(
nativeAdLoader: MaxNativeAdLoader,
nativeAd: MaxAd,
) {
// val layout = resource ?: R.layout.native_custom_ad_view
val binder: MaxNativeAdViewBinder =
MaxNativeAdViewBinder.Builder(layout)
.setTitleTextViewId(R.id.ad_headline)
// .setBodyTextViewId(R.id.body_text_view)
// .setAdvertiserTextViewId(R.id.advertiser_text_view)
.setIconImageViewId(R.id.ad_icon)
.setMediaContentViewGroupId(R.id.ad_media)
// .setOptionsContentViewGroupId(R.id.options_view)
// .setStarRatingContentViewGroupId(R.id.star_rating_view)
.setCallToActionButtonId(R.id.ad_call_to_action)
.build()
val adView = MaxNativeAdView(binder, context)
nativeAdLoader.render(adView, nativeAd)
removeAllViews()
addView(adView)
}
} }
\ No newline at end of file
...@@ -18,19 +18,16 @@ import android.util.Log ...@@ -18,19 +18,16 @@ import android.util.Log
import android.widget.RemoteViews import android.widget.RemoteViews
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.work.Configuration import androidx.work.Configuration
import com.swiftcleaner.chovey.GlobalConfig.ID_APP_INSTALL
import com.swiftcleaner.chovey.GlobalConfig.ID_APP_PROCESS
import com.swiftcleaner.chovey.GlobalConfig.ID_BATTERY_INFO import com.swiftcleaner.chovey.GlobalConfig.ID_BATTERY_INFO
import com.swiftcleaner.chovey.GlobalConfig.ID_CLEAN_JUNK import com.swiftcleaner.chovey.GlobalConfig.ID_CLEAN_JUNK
import com.swiftcleaner.chovey.GlobalConfig.ID_LARGE_FILE_CLEANER import com.swiftcleaner.chovey.GlobalConfig.ID_LARGE_FILE_CLEANER
import com.swiftcleaner.chovey.GlobalConfig.ID_SCREENSHOT_CLEAN
import com.swiftcleaner.chovey.GlobalConfig.KEY_NOTIFICATION_ID import com.swiftcleaner.chovey.GlobalConfig.KEY_NOTIFICATION_ID
import com.swiftcleaner.chovey.R import com.swiftcleaner.chovey.R
import com.swiftcleaner.chovey.business.admob.AdmobManager
import com.swiftcleaner.chovey.view.activity.AppProcessActivity
import com.swiftcleaner.chovey.view.activity.BatteryInfoActivity
import com.swiftcleaner.chovey.view.activity.CleanJunkActivity import com.swiftcleaner.chovey.view.activity.CleanJunkActivity
import com.swiftcleaner.chovey.view.activity.InfoActivity import com.swiftcleaner.chovey.view.activity.InfoActivity
import com.swiftcleaner.chovey.view.activity.LargeFileActivity import com.swiftcleaner.chovey.view.activity.LargeFileActivity
import com.swiftcleaner.chovey.view.activity.ScreenShotActivity
import com.swiftcleaner.chovey.view.activity.StartActivity import com.swiftcleaner.chovey.view.activity.StartActivity
import kotlin.random.Random import kotlin.random.Random
...@@ -123,7 +120,7 @@ class NotificationJobService : JobService() { ...@@ -123,7 +120,7 @@ class NotificationJobService : JobService() {
notificationLayout.setOnClickPendingIntent(R.id.id_battery, batteryPendingIntent) notificationLayout.setOnClickPendingIntent(R.id.id_battery, batteryPendingIntent)
notificationLayoutExpanded.setOnClickPendingIntent(R.id.id_battery, batteryPendingIntent) notificationLayoutExpanded.setOnClickPendingIntent(R.id.id_battery, batteryPendingIntent)
val appPendingIntent = createPendingIntent(context, ID_APP_PROCESS, AppProcessActivity::class.java) val appPendingIntent = createPendingIntent(context, ID_SCREENSHOT_CLEAN, ScreenShotActivity::class.java)
notificationLayout.setOnClickPendingIntent(R.id.id_app_manager, appPendingIntent) notificationLayout.setOnClickPendingIntent(R.id.id_app_manager, appPendingIntent)
notificationLayoutExpanded.setOnClickPendingIntent(R.id.id_app_manager, appPendingIntent) notificationLayoutExpanded.setOnClickPendingIntent(R.id.id_app_manager, appPendingIntent)
......
...@@ -13,8 +13,6 @@ import android.widget.RemoteViews ...@@ -13,8 +13,6 @@ import android.widget.RemoteViews
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import com.tool.elite.battery.business.push.BadgeUtils import com.tool.elite.battery.business.push.BadgeUtils
import com.swiftcleaner.chovey.CleanApplication import com.swiftcleaner.chovey.CleanApplication
import com.swiftcleaner.chovey.GlobalConfig.ID_APPMANAGER
import com.swiftcleaner.chovey.GlobalConfig.ID_APP_PROCESS
import com.swiftcleaner.chovey.GlobalConfig.ID_BATTERY_INFO import com.swiftcleaner.chovey.GlobalConfig.ID_BATTERY_INFO
import com.swiftcleaner.chovey.GlobalConfig.ID_CLEAN_JUNK import com.swiftcleaner.chovey.GlobalConfig.ID_CLEAN_JUNK
import com.swiftcleaner.chovey.GlobalConfig.ID_LARGE_FILE_CLEANER import com.swiftcleaner.chovey.GlobalConfig.ID_LARGE_FILE_CLEANER
...@@ -22,7 +20,6 @@ import com.swiftcleaner.chovey.GlobalConfig.ID_MALWARE_CLEAN ...@@ -22,7 +20,6 @@ import com.swiftcleaner.chovey.GlobalConfig.ID_MALWARE_CLEAN
import com.swiftcleaner.chovey.GlobalConfig.ID_SCREENSHOT_CLEAN import com.swiftcleaner.chovey.GlobalConfig.ID_SCREENSHOT_CLEAN
import com.swiftcleaner.chovey.GlobalConfig.ID_SIMILAR_PHOTOS import com.swiftcleaner.chovey.GlobalConfig.ID_SIMILAR_PHOTOS
import com.swiftcleaner.chovey.GlobalConfig.ID_WHATSAPP
import com.swiftcleaner.chovey.GlobalConfig.ID_WHEATHER import com.swiftcleaner.chovey.GlobalConfig.ID_WHEATHER
import com.swiftcleaner.chovey.GlobalConfig.ID_XINGZUO import com.swiftcleaner.chovey.GlobalConfig.ID_XINGZUO
import com.swiftcleaner.chovey.GlobalConfig.KEY_NOTIFICATION_ID import com.swiftcleaner.chovey.GlobalConfig.KEY_NOTIFICATION_ID
...@@ -46,12 +43,9 @@ object NotificationUtils { ...@@ -46,12 +43,9 @@ object NotificationUtils {
private val notificationIds = intArrayOf( private val notificationIds = intArrayOf(
ID_CLEAN_JUNK, ID_CLEAN_JUNK,
ID_APPMANAGER,
ID_WHATSAPP,
ID_BATTERY_INFO, ID_BATTERY_INFO,
ID_LARGE_FILE_CLEANER, ID_LARGE_FILE_CLEANER,
ID_SIMILAR_PHOTOS, ID_SIMILAR_PHOTOS,
ID_APP_PROCESS,
ID_SCREENSHOT_CLEAN, ID_SCREENSHOT_CLEAN,
ID_XINGZUO, ID_XINGZUO,
ID_WHEATHER, ID_WHEATHER,
...@@ -249,11 +243,8 @@ object NotificationUtils { ...@@ -249,11 +243,8 @@ object NotificationUtils {
private fun getNotificationDetails(id: Int): Pair<Int, Int> { private fun getNotificationDetails(id: Int): Pair<Int, Int> {
return when (id) { return when (id) {
ID_CLEAN_JUNK -> Pair(R.mipmap.h_cleanjunk, R.string.notification_clean) ID_CLEAN_JUNK -> Pair(R.mipmap.h_cleanjunk, R.string.notification_clean)
ID_WHATSAPP -> Pair(R.mipmap.h_whatsapp, R.string.notification_whatsapp)
ID_BATTERY_INFO -> Pair(R.mipmap.h_batteryinfo, R.string.notification_battery) ID_BATTERY_INFO -> Pair(R.mipmap.h_batteryinfo, R.string.notification_battery)
ID_APPMANAGER -> Pair(R.mipmap.h_appmanager, R.string.notification_manager)
ID_LARGE_FILE_CLEANER -> Pair(R.mipmap.h_large, R.string.notification_large_file) ID_LARGE_FILE_CLEANER -> Pair(R.mipmap.h_large, R.string.notification_large_file)
ID_APP_PROCESS -> Pair(R.mipmap.jg__appprocss, R.string.notification_app_process)
ID_SIMILAR_PHOTOS -> Pair(R.mipmap.h_simiar, R.string.notification_similar_photos) ID_SIMILAR_PHOTOS -> Pair(R.mipmap.h_simiar, R.string.notification_similar_photos)
ID_SCREENSHOT_CLEAN -> Pair(R.mipmap.h_screenshot, R.string.notification_screenshot) ID_SCREENSHOT_CLEAN -> Pair(R.mipmap.h_screenshot, R.string.notification_screenshot)
ID_MALWARE_CLEAN -> { ID_MALWARE_CLEAN -> {
...@@ -397,17 +388,20 @@ object NotificationUtils { ...@@ -397,17 +388,20 @@ object NotificationUtils {
val channel = val channel =
NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH) NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH)
channel.lockscreenVisibility = NotificationCompat.VISIBILITY_PUBLIC channel.lockscreenVisibility = NotificationCompat.VISIBILITY_PUBLIC
channel.setShowBadge(true) //设置ture可以开启应用消息
channel.setShowBadge(false)
notificationManager.createNotificationChannel(channel) notificationManager.createNotificationChannel(channel)
} }
if (type.startsWith("fcm", true)) { // if (type.startsWith("fcm", true)) {
val num = Random.nextInt(1, 10) // val num = Random.nextInt(1, 10)
val notification = builder.setNumber(num).build() // val notification = builder.setNumber(num).build()
notificationManager.notify(notifyId, notification) // notificationManager.notify(notifyId, notification)
BadgeUtils.setBadgeNum(context, num, notification) // BadgeUtils.setBadgeNum(context, num, notification)
} else { // } else {
notificationManager.notify(notifyId, builder.build()) // notificationManager.notify(notifyId, builder.build())
} // }
notificationManager.notify(notifyId, builder.build())
} }
fun setSuspensionRetention( fun setSuspensionRetention(
......
...@@ -35,28 +35,20 @@ import android.widget.Toast; ...@@ -35,28 +35,20 @@ import android.widget.Toast;
import com.clean.file.b.business.newAdmob.AdmobHelps; import com.clean.file.b.business.newAdmob.AdmobHelps;
import com.gyf.immersionbar.ImmersionBar; import com.gyf.immersionbar.ImmersionBar;
import com.link.play.ad.LinkPlaySdk;
import com.swiftcleaner.chovey.CleanApplication;
import com.swiftcleaner.chovey.GlobalConfig;
import com.swiftcleaner.chovey.R; import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.business.admob.AdmobManager; import com.swiftcleaner.chovey.business.admob.AdmobManager;
import com.swiftcleaner.chovey.business.push.NotificationUtils;
import com.swiftcleaner.chovey.databinding.ActivityMainBinding; import com.swiftcleaner.chovey.databinding.ActivityMainBinding;
import com.swiftcleaner.chovey.databinding.DialogMalwareTipsBinding; import com.swiftcleaner.chovey.databinding.DialogMalwareTipsBinding;
import com.swiftcleaner.chovey.model.tool.MemoryUtils; import com.swiftcleaner.chovey.model.tool.MemoryUtils;
import com.swiftcleaner.chovey.model.util.NetWork; import com.swiftcleaner.chovey.model.util.NetWork;
import com.swiftcleaner.chovey.model.util.PermissionUtils; import com.swiftcleaner.chovey.model.util.PermissionUtils;
import com.swiftcleaner.chovey.view.activity.AnimatorActivity; import com.swiftcleaner.chovey.view.activity.AnimatorActivity;
import com.swiftcleaner.chovey.view.activity.AppProcessActivity;
import com.swiftcleaner.chovey.view.activity.BatteryInfoActivity;
import com.swiftcleaner.chovey.view.activity.CleanJunkActivity; import com.swiftcleaner.chovey.view.activity.CleanJunkActivity;
import com.swiftcleaner.chovey.view.activity.InfoActivity; import com.swiftcleaner.chovey.view.activity.ClooseFunActivity;
import com.swiftcleaner.chovey.view.activity.LargeFileActivity;
import com.swiftcleaner.chovey.view.activity.MalwareCleanActivity; import com.swiftcleaner.chovey.view.activity.MalwareCleanActivity;
import com.swiftcleaner.chovey.view.activity.ScreenShotActivity;
import com.swiftcleaner.chovey.view.activity.SettingActivity; import com.swiftcleaner.chovey.view.activity.SettingActivity;
import com.swiftcleaner.chovey.view.activity.SimilarPhotosActivity; import com.swiftcleaner.chovey.view.activity.SimilarPhotosActivity;
import com.swiftcleaner.chovey.view.activity.WhatsAppActivity;
import com.swiftcleaner.chovey.view.dialog.AppExitDialog; import com.swiftcleaner.chovey.view.dialog.AppExitDialog;
import com.swiftcleaner.chovey.view.dialog.CustomBottomSheetDialog; import com.swiftcleaner.chovey.view.dialog.CustomBottomSheetDialog;
import com.swiftcleaner.chovey.view.dialog.FullscreenDialog; import com.swiftcleaner.chovey.view.dialog.FullscreenDialog;
...@@ -267,21 +259,11 @@ public class MainActivity extends AppCompatActivity { ...@@ -267,21 +259,11 @@ public class MainActivity extends AppCompatActivity {
binding.cl3CleanJunk.setOnClickListener(v -> { binding.cl3CleanJunk.setOnClickListener(v -> {
initStart(); initStart();
}); });
binding.cl3AppManager.setOnClickListener(v -> {
Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",7);
startActivity(intent);
});
binding.cl3BatteryInfo.setOnClickListener(v -> { binding.cl3BatteryInfo.setOnClickListener(v -> {
Intent intent = new Intent(this, AnimatorActivity.class); Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",2); intent.putExtra("animator",2);
startActivity(intent); startActivity(intent);
}); });
binding.appProcess.setOnClickListener(v -> {
Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",6);
startActivity(intent);
});
binding.largeFileCleaner.setOnClickListener(v -> { binding.largeFileCleaner.setOnClickListener(v -> {
Intent intent = new Intent(this, AnimatorActivity.class); Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",3); intent.putExtra("animator",3);
...@@ -292,11 +274,6 @@ public class MainActivity extends AppCompatActivity { ...@@ -292,11 +274,6 @@ public class MainActivity extends AppCompatActivity {
intent.putExtra("animator",4); intent.putExtra("animator",4);
startActivity(intent); startActivity(intent);
}); });
binding.whatsApp.setOnClickListener(v -> {
Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",8);
startActivity(intent);
});
binding.similarPhotos.setOnClickListener(v -> { binding.similarPhotos.setOnClickListener(v -> {
startActivity(new Intent(MainActivity.this, SimilarPhotosActivity.class)); startActivity(new Intent(MainActivity.this, SimilarPhotosActivity.class));
}); });
...@@ -483,6 +460,7 @@ public class MainActivity extends AppCompatActivity { ...@@ -483,6 +460,7 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
LinkPlaySdk.showView(this);
if (isCleaned() && fullscreenDialog != null) { if (isCleaned() && fullscreenDialog != null) {
Log.d("isCleaned", isCleaned() + "222"); Log.d("isCleaned", isCleaned() + "222");
fullscreenDialog.dismiss(); fullscreenDialog.dismiss();
...@@ -496,7 +474,7 @@ public class MainActivity extends AppCompatActivity { ...@@ -496,7 +474,7 @@ public class MainActivity extends AppCompatActivity {
if (bannerShowed.get()) return; if (bannerShowed.get()) return;
bannerShowed.set(true); bannerShowed.set(true);
if (AdmobManager.INSTANCE.isShowAdBanner()){ if (AdmobHelps.INSTANCE.isShowAdBanner()){
AdmobHelps.INSTANCE.showBannerAd(this, binding.flBanner, "bottom", null, null); AdmobHelps.INSTANCE.showBannerAd(this, binding.flBanner, "bottom", null, null);
} }
......
...@@ -58,18 +58,6 @@ public class AnimatorActivity extends BaseActivity<ActivityAnimatorBinding> { ...@@ -58,18 +58,6 @@ public class AnimatorActivity extends BaseActivity<ActivityAnimatorBinding> {
startIntent.putExtra("cleanstr", stringExtra); startIntent.putExtra("cleanstr", stringExtra);
startIntent.putExtra("title",title); startIntent.putExtra("title",title);
break; break;
case 6:
binding.tupian.setBackgroundResource(R.mipmap.appprocess_img);
startIntent = new Intent(this, AppProcessActivity.class);
break;
case 7:
binding.tupian.setBackgroundResource(R.mipmap.app_manager_img);
startIntent = new Intent(this, BatteryInfoActivity.class);
break;
case 8:
binding.tupian.setBackgroundResource(R.mipmap.whatsapp_img);
startIntent = new Intent(this, WhatsAppActivity.class);
break;
default: default:
Log.e("AnimatorActivity", "Invalid animator intent value: " + animatorIntent); Log.e("AnimatorActivity", "Invalid animator intent value: " + animatorIntent);
} }
...@@ -110,7 +98,7 @@ public class AnimatorActivity extends BaseActivity<ActivityAnimatorBinding> { ...@@ -110,7 +98,7 @@ public class AnimatorActivity extends BaseActivity<ActivityAnimatorBinding> {
Log.d("AdmobHelps", "Interstitial Ad failed to load."); Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null; return null;
}, },
false false,false
); );
}else { }else {
startInt(); startInt();
......
package com.swiftcleaner.chovey.view.activity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.Manifest;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.CountDownTimer;
import android.os.Environment;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.clean.file.b.business.newAdmob.AdmobHelps;
import com.gyf.immersionbar.ImmersionBar;
import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.business.EventUtils;
import com.swiftcleaner.chovey.business.admob.AdmobManager;
import com.swiftcleaner.chovey.databinding.ActivityAppProcessBinding;
import com.swiftcleaner.chovey.model.bean.AppInfoBean;
import com.swiftcleaner.chovey.model.tool.MemoryUtils;
import com.swiftcleaner.chovey.model.util.FinishMain;
import com.swiftcleaner.chovey.view.BaseActivity;
import com.swiftcleaner.chovey.view.BaseActivityKotlin;
import com.swiftcleaner.chovey.view.MainActivity;
import com.swiftcleaner.chovey.view.adapter.AppProcessAdapter;
import com.swiftcleaner.chovey.view.dialog.CustomScoreDialog;
import java.util.ArrayList;
import java.util.List;
public class AppProcessActivity extends BaseActivity<ActivityAppProcessBinding> {
private AppProcessAdapter adapter;
private static final int REQUEST_ALL_FILES_ACCESS_PERMISSION = 100;
private static final int REQUEST_PERMISSION_CODE = 101;
@Override
protected ActivityAppProcessBinding getViewBinding() {
return ActivityAppProcessBinding.inflate(getLayoutInflater());
}
@Override
protected void initView() {
initBar();
}
@Override
protected void onResume() {
super.onResume();
AdmobHelps.INSTANCE.showNativeAd(this,binding.flAd,R.layout.layout_ad_native_small,AdmobHelps.INSTANCE.isShowAdNativeBottom(),false);
}
@Override
protected void initData() {
EventUtils.INSTANCE.event("page_AppProcessActivity", "", null);
checkAndRequestPermissions();
initShow();
}
private void initShow() {
binding.ivReturn.setOnClickListener(v -> {
initCustDialog();
});
binding.appProcessButtonOk.setOnClickListener(v -> {
initCustDialog();
});
binding.appProcessRecy.setLayoutManager(new LinearLayoutManager(this));
// 将耗时操作放到子线程中执行
new Thread(() -> {
List<AppInfoBean> appInfoList = getNonSystemAppInfos();
runOnUiThread(() -> {
adapter = new AppProcessAdapter(appInfoList, this);
binding.appProcessRecy.setAdapter(adapter);
initProcess();
});
}).start();
}
private void checkAndRequestPermissions() {
if (!checkFilesAccessPermission(this)) {
// 没有权限,请求权限
requestFilesAccessPermission();
}
}
private boolean checkFilesAccessPermission(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
return Environment.isExternalStorageManager();
} else {
int readPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
int writePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
return readPermission == PackageManager.PERMISSION_GRANTED && writePermission == PackageManager.PERMISSION_GRANTED;
}
}
private void requestFilesAccessPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
try {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_ALL_FILES_ACCESS_PERMISSION);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "Unable to request permission, please grant manually", Toast.LENGTH_SHORT).show();
}
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_ALL_FILES_ACCESS_PERMISSION) {
if (!checkFilesAccessPermission(this)) {
// 权限未授予,直接关闭页面
Toast.makeText(this, "Unauthorized permission, the page is about to close", Toast.LENGTH_SHORT).show();
finish();
}
} else if (requestCode == REQUEST_PERMISSION_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
// 权限已授予,可以继续操作
} else {
// 权限未授予,直接关闭页面
Toast.makeText(this, "Unauthorized permission, the page is about to close", Toast.LENGTH_SHORT).show();
finish();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_ALL_FILES_ACCESS_PERMISSION) {
// 检查权限是否已经授予
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
// 权限已授予,刷新页面或执行相关操作
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
} else {
// 权限未授予,提示用户
Toast.makeText(this, "Permission not granted, please grant manually", Toast.LENGTH_SHORT).show();
}
}
}
}
private void initProcess() {
// 获取总内存
String totalMemory = MemoryUtils.getUsedDiskMemory(this);
// 获取当前使用内存
String usedMemory = MemoryUtils.getTotalDiskMemory(this);
String usedDiskMemoryPercent = MemoryUtils.getUsedDiskMemoryPercent(this);
binding.memoryInfoText.setText(totalMemory + "/" + usedMemory);
binding.appProcessNum.setText(usedDiskMemoryPercent);
try {
int percent = Integer.parseInt(usedDiskMemoryPercent.replaceAll("%", ""));
binding.progressBar.setProgress(percent);
} catch (NumberFormatException e) {
e.printStackTrace();
Log.e("AppProcessActivity", "Error parsing used disk memory percent: " + e.getMessage());
binding.progressBar.setProgress(0);
}
}
private List<AppInfoBean> getNonSystemAppInfos() {
PackageManager packageManager = getPackageManager();
List<ApplicationInfo> installedApps = packageManager.getInstalledApplications(0);
// 过滤掉系统应用
List<ApplicationInfo> nonSystemApps = new ArrayList<>();
for (ApplicationInfo appInfo : installedApps) {
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
nonSystemApps.add(appInfo);
}
}
// 过滤掉当前应用
List<ApplicationInfo> nonSystemAppsFiltered = new ArrayList<>();
String currentPackageName = getPackageName();
for (ApplicationInfo appInfo : nonSystemApps) {
if (!currentPackageName.equals(appInfo.packageName)) {
nonSystemAppsFiltered.add(appInfo);
}
}
// 将ApplicationInfo对象转换为AppInfoBean对象
List<AppInfoBean> apps = new ArrayList<>();
for (ApplicationInfo packageInfo : nonSystemAppsFiltered) {
String appName = packageManager.getApplicationLabel(packageInfo).toString();
Drawable appIcon = packageInfo.loadIcon(packageManager);
AppInfoBean appInfoBean = new AppInfoBean(appName, appIcon, packageInfo.packageName);
apps.add(appInfoBean);
}
return apps;
}
private void initBar() {
ImmersionBar.with(this)
.transparentStatusBar() // 透明状态栏
.statusBarDarkFont(false) // 状态栏字体颜色为浅色
.navigationBarDarkIcon(true) // 导航栏图标颜色为浅色
.init();
}
@Override
public void onBackPressed() {
initCustDialog();
}
private void initCustDialog() {
Activity activity = this;
CustomScoreDialog customScoreDialog = new CustomScoreDialog(this);
customScoreDialog.setOnDialogClickListener(new CustomScoreDialog.OnDialogClickListener() {
@Override
public void onCancel() {
customScoreDialog.dismiss();
}
@Override
public void onSubmit() {
if (AdmobHelps.INSTANCE.isShowAdBackInter()){
AdmobHelps.INSTANCE.showInterstitialAd(
AppProcessActivity.this,
() -> {
FinishMain.INSTANCE.finishToMain(activity);
// 当广告被关闭时的逻辑
Log.d("AdmobHelps", "Interstitial Ad was dismissed.");
return null;
},
() -> {
// 当广告展示完成时的逻辑
Log.d("AdmobHelps", "Interstitial Ad was shown.");
return null;
},
() -> {
FinishMain.INSTANCE.finishToMain(activity);
// 当广告加载失败时的逻辑
Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null;
},
false
);
}else {
FinishMain.INSTANCE.finishToMain(activity);
}
}
});
customScoreDialog.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
\ No newline at end of file
package com.swiftcleaner.chovey.view.activity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.Manifest;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.CountDownTimer;
import android.os.Environment;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.clean.file.b.business.newAdmob.AdmobHelps;
import com.gyf.immersionbar.ImmersionBar;
import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.business.EventUtils;
import com.swiftcleaner.chovey.business.admob.AdmobManager;
import com.swiftcleaner.chovey.databinding.ActivityBatteryInfoBinding;
import com.swiftcleaner.chovey.model.bean.AppInfoBean;
import com.swiftcleaner.chovey.model.util.AppSchedulers;
import com.swiftcleaner.chovey.model.util.FinishMain;
import com.swiftcleaner.chovey.view.BaseActivity;
import com.swiftcleaner.chovey.view.BaseActivityKotlin;
import com.swiftcleaner.chovey.view.MainActivity;
import com.swiftcleaner.chovey.view.adapter.AppInfoAdapter;
import com.swiftcleaner.chovey.view.dialog.CustomScoreDialog;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.disposables.Disposable;
public class BatteryInfoActivity extends BaseActivity<ActivityBatteryInfoBinding> {
private AppInfoAdapter adapter;
private Disposable disposable;
private static final int REQUEST_ALL_FILES_ACCESS_PERMISSION = 100;
private static final int REQUEST_PERMISSION_CODE = 101;
@Override
protected ActivityBatteryInfoBinding getViewBinding() {
return ActivityBatteryInfoBinding.inflate(getLayoutInflater());
}
@Override
protected void initView() {
initBar();
}
@Override
protected void onResume() {
super.onResume();
AdmobHelps.INSTANCE.showNativeAd(this,binding.flAd,R.layout.layout_ad_native_small,AdmobHelps.INSTANCE.isShowAdNativeBottom(),false);
}
@Override
protected void initData() {
EventUtils.INSTANCE.event("page_BatteryInfoActivity", "", null);
checkAndRequestPermissions();
initShow();
}
private void checkAndRequestPermissions() {
if (!checkFilesAccessPermission(this)) {
// 没有权限,请求权限
requestFilesAccessPermission();
}
}
private boolean checkFilesAccessPermission(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
return Environment.isExternalStorageManager();
} else {
int readPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
int writePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
return readPermission == PackageManager.PERMISSION_GRANTED && writePermission == PackageManager.PERMISSION_GRANTED;
}
}
private void requestFilesAccessPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
try {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_ALL_FILES_ACCESS_PERMISSION);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "Unable to request permission, please grant manually", Toast.LENGTH_SHORT).show();
}
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_ALL_FILES_ACCESS_PERMISSION) {
// 检查权限是否已经授予
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
// 权限已授予,刷新页面或执行相关操作
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
} else {
// 权限未授予,提示用户
Toast.makeText(this, "Permission not granted, please grant manually", Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_ALL_FILES_ACCESS_PERMISSION) {
if (!checkFilesAccessPermission(this)) {
// 权限未授予,直接关闭页面
Toast.makeText(this, "Unauthorized permission, the page is about to close", Toast.LENGTH_SHORT).show();
finish();
}
} else if (requestCode == REQUEST_PERMISSION_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
// 权限已授予,可以继续操作
} else {
// 权限未授予,直接关闭页面
Toast.makeText(this, "Unauthorized permission, the page is about to close", Toast.LENGTH_SHORT).show();
finish();
}
}
}
private void initShow() {
binding.idActivityAppmanagerLoading.setVisibility(View.VISIBLE);
disposable = Observable.fromCallable(() -> {
PackageManager packageManager = getPackageManager();
List<ApplicationInfo> installedApps = packageManager.getInstalledApplications(0);
// 过滤掉系统应用
List<ApplicationInfo> nonSystemApps = new ArrayList<>();
for (ApplicationInfo appInfo : installedApps) {
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
nonSystemApps.add(appInfo);
}
}
// 过滤掉当前应用
List<ApplicationInfo> nonSystemAppsFiltered = new ArrayList<>();
String currentPackageName = getPackageName();
for (ApplicationInfo appInfo : nonSystemApps) {
if (!currentPackageName.equals(appInfo.packageName)) {
nonSystemAppsFiltered.add(appInfo);
}
}
// 将ApplicationInfo对象转换为AppInfoBean对象
List<AppInfoBean> apps = new ArrayList<>();
for (ApplicationInfo packageInfo : nonSystemAppsFiltered) {
String appName = packageManager.getApplicationLabel(packageInfo).toString();
Drawable appIcon = packageInfo.loadIcon(packageManager);
AppInfoBean appInfoBean = new AppInfoBean(appName, appIcon, packageInfo.packageName);
apps.add(appInfoBean);
}
return apps;
}).subscribeOn(AppSchedulers.io())
.observeOn(AppSchedulers.mainThread())
.subscribe(apps -> {
binding.tvBatteryInfoNum.setText("(" + apps.size() + " in total)");
binding.batteryRecy.setLayoutManager(new LinearLayoutManager(BatteryInfoActivity.this));
adapter = new AppInfoAdapter(apps, BatteryInfoActivity.this);
binding.batteryRecy.setAdapter(adapter);
binding.ivReturn.setOnClickListener(v -> {
initCustDialog();
});
binding.idActivityAppmanagerLoading.setVisibility(View.GONE);
}, throwable -> {
// 处理错误
throwable.printStackTrace();
});
}
private void initBar() {
ImmersionBar.with(this)
.transparentStatusBar() // 透明状态栏
.statusBarDarkFont(false) // 状态栏字体颜色为深色
.navigationBarDarkIcon(true) // 导航栏图标颜色为浅色
.init();
}
@Override
public void onBackPressed() {
initCustDialog();
}
private void initCustDialog() {
Activity activity = this;
CustomScoreDialog customScoreDialog = new CustomScoreDialog(this);
customScoreDialog.setOnDialogClickListener(new CustomScoreDialog.OnDialogClickListener() {
@Override
public void onCancel() {
customScoreDialog.dismiss();
}
@Override
public void onSubmit() {
if (AdmobHelps.INSTANCE.isShowAdBackInter()){
AdmobHelps.INSTANCE.showInterstitialAd(
BatteryInfoActivity.this,
() -> {
FinishMain.INSTANCE.finishToMain(activity);
// 当广告被关闭时的逻辑
Log.d("AdmobHelps", "Interstitial Ad was dismissed.");
return null;
},
() -> {
// 当广告展示完成时的逻辑
Log.d("AdmobHelps", "Interstitial Ad was shown.");
return null;
},
() -> {
FinishMain.INSTANCE.finishToMain(activity);
// 当广告加载失败时的逻辑
Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null;
},
false
);
}else {
FinishMain.INSTANCE.finishToMain(activity);
}
}
});
customScoreDialog.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
}
}
\ No newline at end of file
...@@ -615,7 +615,7 @@ public class CleanJunkActivity extends BaseActivity<ActivityCleanJunkBinding> { ...@@ -615,7 +615,7 @@ public class CleanJunkActivity extends BaseActivity<ActivityCleanJunkBinding> {
Log.d("AdmobHelps", "Interstitial Ad failed to load."); Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null; return null;
}, },
false false,false
); );
}else { }else {
FinishMain.INSTANCE.finishToMain(activity); FinishMain.INSTANCE.finishToMain(activity);
......
package com.swiftcleaner.chovey.view.activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.clean.file.b.business.newAdmob.AdmobHelps;
import com.gyf.immersionbar.ImmersionBar;
import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.business.EventUtils;
import com.swiftcleaner.chovey.databinding.ActivityClooseFunBinding;
import com.swiftcleaner.chovey.databinding.ActivityGuideBinding;
import com.swiftcleaner.chovey.model.util.FinishMain;
import com.swiftcleaner.chovey.view.adapter.ViewPagerAdapter;
public class ClooseFunActivity extends AppCompatActivity {
ActivityClooseFunBinding binding;
private long lastClickTime = 0; // 记录上次点击的时间
private static final long MIN_CLICK_INTERVAL = 300; // 设置最小点击间隔
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityClooseFunBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
initBar();
EventUtils.INSTANCE.event("page_ClooseFunActivity", "", null);
initView();
}
private void adMob() {
new Thread(() -> {
runOnUiThread(() -> {
AdmobHelps.INSTANCE.showNativeAd(this, binding.flAd, R.layout.layout_ad_native_small, AdmobHelps.INSTANCE.isShowAdNativeBottom(), false);
});
}).start();
}
private void handleItemClick(Runnable action) {
long currentTime = System.currentTimeMillis();
if (currentTime - lastClickTime >= MIN_CLICK_INTERVAL) {
lastClickTime = currentTime;
action.run();
}
}
private void initView() {
adMob();
binding.tvText.setOnClickListener(v->{
FinishMain.INSTANCE.finishToMain(this);
});
binding.cl1.setOnClickListener(v->{
handleItemClick(() -> {
boolean isChecked = binding.checkPhoto.isChecked();
binding.checkPhoto.setChecked(!isChecked);
if (AdmobHelps.INSTANCE.isShowAdClooseNative() && !isChecked) {
adMob();
}
});
});
binding.cl2.setOnClickListener(v->{
handleItemClick(() -> {
boolean isChecked = binding.checkVideo.isChecked();
binding.checkVideo.setChecked(!isChecked);
if (AdmobHelps.INSTANCE.isShowAdClooseNative() && !isChecked) {
adMob();
}
});
});
binding.cl3.setOnClickListener(v->{
handleItemClick(() -> {
boolean isChecked = binding.checkAudio.isChecked();
binding.checkAudio.setChecked(!isChecked);
if (AdmobHelps.INSTANCE.isShowAdClooseNative() && !isChecked) {
adMob();
}
});
});
binding.cl4.setOnClickListener(v->{
handleItemClick(() -> {
boolean isChecked = binding.checkDocument.isChecked();
binding.checkDocument.setChecked(!isChecked);
if (AdmobHelps.INSTANCE.isShowAdClooseNative() && !isChecked) {
adMob();
}
});
});
binding.tvContinue.setOnClickListener(v->{
handleItemClick(() -> {
startActivity(new Intent(this,GuideActivity.class));
finish();
});
});
}
private void initBar() {
ImmersionBar.with(this)
.transparentStatusBar() // 透明状态栏
.statusBarDarkFont(true) // 状态栏字体颜色为深色
.navigationBarDarkIcon(false) // 导航栏图标颜色为浅色
.init();
}
}
\ No newline at end of file
...@@ -66,7 +66,8 @@ public class CollectActivity extends AppCompatActivity { ...@@ -66,7 +66,8 @@ public class CollectActivity extends AppCompatActivity {
checkAndRequestPermissions(); checkAndRequestPermissions();
}); });
binding.scanSkip.setOnClickListener(v->{ binding.scanSkip.setOnClickListener(v->{
initStart(); startActivity(new Intent(this, MainActivity.class));
finish();
}); });
} }
......
...@@ -61,24 +61,6 @@ public class EndCleanJunkActivity extends BaseActivity<ActivityEndCleanJunkBindi ...@@ -61,24 +61,6 @@ public class EndCleanJunkActivity extends BaseActivity<ActivityEndCleanJunkBindi
startActivity(intent1); startActivity(intent1);
finish(); finish();
}); });
binding.buttonAppManagerCheckNo.setOnClickListener(v -> {
Intent intent1 = new Intent(this, AnimatorActivity.class);
intent1.putExtra("animator",7);
startActivity(intent1);
finish();
});
binding.buttonWhatsappCheckNo.setOnClickListener(v -> {
Intent intent1 = new Intent(this, AnimatorActivity.class);
intent1.putExtra("animator",8);
startActivity(intent1);
finish();
});
binding.buttonAppProcessCheckNo.setOnClickListener(v -> {
Intent intent1 = new Intent(this, AnimatorActivity.class);
intent1.putExtra("animator",6);
startActivity(intent1);
finish();
});
binding.buttonCleanJunkCleanNo.setOnClickListener(v -> { binding.buttonCleanJunkCleanNo.setOnClickListener(v -> {
Intent intent1 = new Intent(this, AnimatorActivity.class); Intent intent1 = new Intent(this, AnimatorActivity.class);
intent1.putExtra("animator",1); intent1.putExtra("animator",1);
...@@ -146,7 +128,7 @@ public class EndCleanJunkActivity extends BaseActivity<ActivityEndCleanJunkBindi ...@@ -146,7 +128,7 @@ public class EndCleanJunkActivity extends BaseActivity<ActivityEndCleanJunkBindi
Log.d("AdmobHelps", "Interstitial Ad failed to load."); Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null; return null;
}, },
false false,false
); );
}else { }else {
FinishMain.INSTANCE.finishToMain(EndCleanJunkActivity.this); FinishMain.INSTANCE.finishToMain(EndCleanJunkActivity.this);
......
...@@ -49,7 +49,8 @@ public class GuideActivity extends AppCompatActivity { ...@@ -49,7 +49,8 @@ public class GuideActivity extends AppCompatActivity {
EventUtils.INSTANCE.event("page_GuideActivity", "", null); EventUtils.INSTANCE.event("page_GuideActivity", "", null);
adapter = new ViewPagerAdapter(getSupportFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); adapter = new ViewPagerAdapter(getSupportFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
binding.viewPager.setAdapter(adapter); binding.viewPager.setAdapter(adapter);
binding.viewPager.setPagingEnabled(false); binding.viewPager.setPagingEnabled(true
);
binding.viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { binding.viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override @Override
public void onPageSelected(int position) { public void onPageSelected(int position) {
...@@ -101,7 +102,7 @@ public class GuideActivity extends AppCompatActivity { ...@@ -101,7 +102,7 @@ public class GuideActivity extends AppCompatActivity {
Log.d("AdmobHelps", "Interstitial Ad failed to load."); Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null; return null;
}, },
false false,false
); );
}else { }else {
startIntent(); startIntent();
......
...@@ -198,7 +198,7 @@ public class InfoActivity extends BaseActivity<ActivityInfoBinding> { ...@@ -198,7 +198,7 @@ public class InfoActivity extends BaseActivity<ActivityInfoBinding> {
Log.d("AdmobHelps", "Interstitial Ad failed to load."); Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null; return null;
}, },
false false,false
); );
}else { }else {
FinishMain.INSTANCE.finishToMain(activity); FinishMain.INSTANCE.finishToMain(activity);
......
...@@ -304,7 +304,7 @@ public class LargeFileActivity extends BaseActivity<ActivityLargeFileBinding> { ...@@ -304,7 +304,7 @@ public class LargeFileActivity extends BaseActivity<ActivityLargeFileBinding> {
Log.d("AdmobHelps", "Interstitial Ad failed to load."); Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null; return null;
}, },
false false,false
); );
}else { }else {
FinishMain.INSTANCE.finishToMain(activity); FinishMain.INSTANCE.finishToMain(activity);
......
...@@ -319,7 +319,7 @@ public class ScreenShotActivity extends BaseActivity<ActivityScreenShotBinding> ...@@ -319,7 +319,7 @@ public class ScreenShotActivity extends BaseActivity<ActivityScreenShotBinding>
Log.d("AdmobHelps", "Interstitial Ad failed to load."); Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null; return null;
}, },
false false,false
); );
}else { }else {
FinishMain.INSTANCE.finishToMain(activity); FinishMain.INSTANCE.finishToMain(activity);
......
package com.swiftcleaner.chovey.view.activity; package com.swiftcleaner.chovey.view.activity;
import static com.swiftcleaner.chovey.GlobalConfig.ID_APPMANAGER;
import static com.swiftcleaner.chovey.GlobalConfig.ID_APP_PROCESS;
import static com.swiftcleaner.chovey.GlobalConfig.ID_BATTERY_INFO;
import static com.swiftcleaner.chovey.GlobalConfig.ID_CLEAN_JUNK;
import static com.swiftcleaner.chovey.GlobalConfig.ID_LARGE_FILE_CLEANER;
import static com.swiftcleaner.chovey.GlobalConfig.ID_MALWARE_CLEAN;
import static com.swiftcleaner.chovey.GlobalConfig.ID_SCREENSHOT_CLEAN;
import static com.swiftcleaner.chovey.GlobalConfig.ID_SIMILAR_PHOTOS;
import static com.swiftcleaner.chovey.GlobalConfig.ID_WHATSAPP;
import static com.swiftcleaner.chovey.GlobalConfig.ID_WHEATHER;
import static com.swiftcleaner.chovey.GlobalConfig.ID_XINGZUO;
import static com.swiftcleaner.chovey.GlobalConfig.URL_PRIVACY; import static com.swiftcleaner.chovey.GlobalConfig.URL_PRIVACY;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
...@@ -32,13 +21,10 @@ import android.widget.ImageView; ...@@ -32,13 +21,10 @@ import android.widget.ImageView;
import android.widget.Toast; import android.widget.Toast;
import com.gyf.immersionbar.ImmersionBar; import com.gyf.immersionbar.ImmersionBar;
import com.swiftcleaner.chovey.CleanApplication;
import com.swiftcleaner.chovey.GlobalConfig; import com.swiftcleaner.chovey.GlobalConfig;
import com.swiftcleaner.chovey.R; import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.business.EventUtils; import com.swiftcleaner.chovey.business.EventUtils;
import com.swiftcleaner.chovey.business.admob.AdmobManager; import com.swiftcleaner.chovey.business.admob.AdmobManager;
import com.swiftcleaner.chovey.business.push.NotificationUtils;
import com.swiftcleaner.chovey.databinding.ActivityMainBinding;
import com.swiftcleaner.chovey.databinding.ActivitySettingBinding; import com.swiftcleaner.chovey.databinding.ActivitySettingBinding;
import com.swiftcleaner.chovey.util.SPUtils; import com.swiftcleaner.chovey.util.SPUtils;
import com.swiftcleaner.chovey.view.dialog.CustomScoreDialog; import com.swiftcleaner.chovey.view.dialog.CustomScoreDialog;
......
package com.swiftcleaner.chovey.view.activity; package com.swiftcleaner.chovey.view.activity;
import static com.swiftcleaner.chovey.GlobalConfig.ID_APPMANAGER;
import static com.swiftcleaner.chovey.GlobalConfig.ID_APP_PROCESS;
import static com.swiftcleaner.chovey.GlobalConfig.ID_BATTERY_INFO;
import static com.swiftcleaner.chovey.GlobalConfig.ID_CLEAN_JUNK;
import static com.swiftcleaner.chovey.GlobalConfig.ID_LARGE_FILE_CLEANER;
import static com.swiftcleaner.chovey.GlobalConfig.ID_MALWARE_CLEAN; import static com.swiftcleaner.chovey.GlobalConfig.ID_MALWARE_CLEAN;
import static com.swiftcleaner.chovey.GlobalConfig.ID_SCREENSHOT_CLEAN;
import static com.swiftcleaner.chovey.GlobalConfig.ID_SIMILAR_PHOTOS;
import static com.swiftcleaner.chovey.GlobalConfig.ID_WHATSAPP;
import static com.swiftcleaner.chovey.GlobalConfig.ID_WHEATHER; import static com.swiftcleaner.chovey.GlobalConfig.ID_WHEATHER;
import static com.swiftcleaner.chovey.GlobalConfig.ID_XINGZUO; import static com.swiftcleaner.chovey.GlobalConfig.ID_XINGZUO;
import static com.swiftcleaner.chovey.GlobalConfig.KEY_NOTIFICATION_ID; import static com.swiftcleaner.chovey.GlobalConfig.KEY_NOTIFICATION_ID;
import static com.swiftcleaner.chovey.GlobalConfig.URL_PRIVACY; import static com.swiftcleaner.chovey.GlobalConfig.URL_PRIVACY;
import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_APP_MANAGER;
import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_APP_PROCESS;
import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_BATTERY;
import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_CLEAN;
import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_LARGE_FILE;
import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_SCREENSHOT;
//import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_SIMILAR_PHOTOS; //import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_SIMILAR_PHOTOS;
import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_SIMILAR_PHOTOS; import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_SIMILAR_PHOTOS;
import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_WHATS_APP; import static com.swiftcleaner.chovey.model.bean.Global.FUNCTION_WHATS_APP;
...@@ -32,7 +18,10 @@ import androidx.core.content.ContextCompat; ...@@ -32,7 +18,10 @@ import androidx.core.content.ContextCompat;
import android.Manifest; import android.Manifest;
import android.animation.Animator; import android.animation.Animator;
import android.app.ActivityManager;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
...@@ -40,6 +29,8 @@ import android.net.Uri; ...@@ -40,6 +29,8 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.CountDownTimer; import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Looper;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
...@@ -50,25 +41,16 @@ import com.swiftcleaner.chovey.CleanApplication; ...@@ -50,25 +41,16 @@ import com.swiftcleaner.chovey.CleanApplication;
import com.swiftcleaner.chovey.GlobalConfig; import com.swiftcleaner.chovey.GlobalConfig;
import com.swiftcleaner.chovey.R; import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.business.EventUtils; import com.swiftcleaner.chovey.business.EventUtils;
import com.swiftcleaner.chovey.business.admob.AdmobManager;
import com.swiftcleaner.chovey.databinding.ActivityStartBinding; import com.swiftcleaner.chovey.databinding.ActivityStartBinding;
import com.swiftcleaner.chovey.model.util.PermissionUtils; import com.swiftcleaner.chovey.model.util.PermissionUtils;
import com.swiftcleaner.chovey.util.ActivityLauncher; import com.swiftcleaner.chovey.util.ActivityLauncher;
import com.swiftcleaner.chovey.util.NonBlockingCountdown; import com.swiftcleaner.chovey.util.NonBlockingCountdown;
import com.swiftcleaner.chovey.util.SPUtils; import com.swiftcleaner.chovey.util.SPUtils;
import com.swiftcleaner.chovey.view.MainActivity; import com.swiftcleaner.chovey.view.MainActivity;
import com.swiftcleaner.chovey.view.activity.AppProcessActivity;
import com.swiftcleaner.chovey.view.activity.BatteryInfoActivity;
import com.swiftcleaner.chovey.view.activity.CleanJunkActivity;
import com.swiftcleaner.chovey.view.activity.InfoActivity;
import com.swiftcleaner.chovey.view.activity.LargeFileActivity;
import com.swiftcleaner.chovey.view.activity.ScreenShotActivity;
import com.swiftcleaner.chovey.view.activity.SimilarPhotosActivity;
import com.swiftcleaner.chovey.view.activity.WhatsAppActivity;
import com.swiftcleaner.chovey.view.dialog.NoticeDialog;
import com.swiftcleaner.chovey.view.function.constellation.XzLoadingActivity; import com.swiftcleaner.chovey.view.function.constellation.XzLoadingActivity;
import com.swiftcleaner.chovey.view.function.weather.WeatherInterface; import com.swiftcleaner.chovey.view.function.weather.WeatherInterface;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
...@@ -84,6 +66,7 @@ public class StartActivity extends AppCompatActivity { ...@@ -84,6 +66,7 @@ public class StartActivity extends AppCompatActivity {
private int outJumpTime = SPUtils.Companion.getInstance().getInt(OpenLoadTime, 15); private int outJumpTime = SPUtils.Companion.getInstance().getInt(OpenLoadTime, 15);
public AtomicBoolean jumped = new AtomicBoolean(false); public AtomicBoolean jumped = new AtomicBoolean(false);
private ActivityLauncher launcher; private ActivityLauncher launcher;
private Handler handler = new Handler(Looper.getMainLooper());
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
...@@ -103,17 +86,19 @@ public class StartActivity extends AppCompatActivity { ...@@ -103,17 +86,19 @@ public class StartActivity extends AppCompatActivity {
// String[] stringArray = {Manifest.permission.POST_NOTIFICATIONS}; // String[] stringArray = {Manifest.permission.POST_NOTIFICATIONS};
// launcher.launch(stringArray, null); // launcher.launch(stringArray, null);
// } // }
//点击过start
if (GlobalConfig.INSTANCE.isInit()) { if (GlobalConfig.INSTANCE.isInit()) {
showOpenAd(); showOpenAd();
//点击过start
binding.startId.setVisibility(View.GONE); binding.startId.setVisibility(View.GONE);
binding.llAgreement.setVisibility(View.GONE); binding.llAgreement.setVisibility(View.GONE);
binding.lottieAnimattionView.setVisibility(View.VISIBLE); binding.lottieAnimattionView.setVisibility(View.VISIBLE);
binding.tvLottieTextview.setVisibility(View.VISIBLE); binding.tvLottieTextview.setVisibility(View.VISIBLE);
startAnimation(); startAnimation();
} else { } else {
//未点击start //未点击start
binding.clEe.setVisibility(View.VISIBLE);
setupStartButton(); setupStartButton();
//协议 //协议
setupAgreementTextView(); setupAgreementTextView();
...@@ -124,21 +109,7 @@ public class StartActivity extends AppCompatActivity { ...@@ -124,21 +109,7 @@ public class StartActivity extends AppCompatActivity {
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (!adShowing && GlobalConfig.INSTANCE.isInit()) { if (!adShowing && GlobalConfig.INSTANCE.isInit()) {
// 启动3秒倒计时 nonBlockingCountdown.start(outJumpTime);
new CountDownTimer(3000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
// 倒计时过程中可以更新UI,比如显示剩余时间
}
@Override
public void onFinish() {
// 3秒倒计时结束,展示动画并加载广告
startAnimation();
showOpenAd();
nonBlockingCountdown.start(outJumpTime);
}
}.start();
} }
} }
...@@ -197,7 +168,6 @@ public class StartActivity extends AppCompatActivity { ...@@ -197,7 +168,6 @@ public class StartActivity extends AppCompatActivity {
@Override @Override
public void onAnimationEnd(@NonNull Animator animator) { public void onAnimationEnd(@NonNull Animator animator) {
// 动画结束时调用 动画结束后跳转首页 // 动画结束时调用 动画结束后跳转首页
// goToMainActivity();
} }
@Override @Override
...@@ -224,6 +194,7 @@ public class StartActivity extends AppCompatActivity { ...@@ -224,6 +194,7 @@ public class StartActivity extends AppCompatActivity {
binding.startId.setOnClickListener(new View.OnClickListener() { binding.startId.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
binding.clEe.setVisibility(View.GONE);
GlobalConfig.INSTANCE.setInit(true); GlobalConfig.INSTANCE.setInit(true);
EventUtils.INSTANCE.event("app_start", "", null); EventUtils.INSTANCE.event("app_start", "", null);
nonBlockingCountdown.start(outJumpTime); nonBlockingCountdown.start(outJumpTime);
...@@ -247,57 +218,119 @@ public class StartActivity extends AppCompatActivity { ...@@ -247,57 +218,119 @@ public class StartActivity extends AppCompatActivity {
// } // }
private void showOpenAd() { private void showOpenAd() {
AdmobManager.INSTANCE.init(this, (ret) -> { AdmobHelps.INSTANCE.init(this, (ret) -> {
Log.d("showAppOpenAd", "111"); // Log.d("showAppOpenAd", "111");
if (isFinishing() || isDestroyed()) return null; if (isFinishing() || isDestroyed()) return null;
if (ret == 0) { int notificationId = getIntent().getIntExtra(GlobalConfig.KEY_NOTIFICATION_ID, -1);
Log.d("showAppOpenAd", "222"); int appBackground = getIntent().getIntExtra(GlobalConfig.KEY_APP_BACKGROUND, -1);
if (notificationId != -1 || appBackground == 1) {
Log.d("showAppOpenAd11", "111");
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (ret == 0) {
Log.d("showAppOpenAd", "222");
AdmobHelps.INSTANCE.showAppOpenAd(StartActivity.this,
() -> {
jumpNext("showAppOpenAd 1");
Log.d("showAppOpenAd", "333");
return null;
},
() -> {
adShowing = true;
nonBlockingCountdown.cancel();
Log.d("showAppOpenAd", "444");
return null;
},
() -> {
jumpNext("showAppOpenAd 2");
Log.d("showAppOpenAd", "555");
return null;
}, false
);
} else if (ret == 1) {
if (AdmobHelps.INSTANCE.isShowAdInter()) {
AdmobHelps.INSTANCE.showInterstitialAd(
StartActivity.this,
() -> {
jumpNext("showInterstitialAd 1");
// 当广告被关闭时的逻辑
Log.d("AdmobHelps", "Interstitial Ad was dismissed.");
return null;
},
() -> {
// 当广告展示完成时的逻辑
adShowing = true;
nonBlockingCountdown.cancel();
Log.d("AdmobHelps", "Interstitial Ad was shown.");
return null;
},
() -> {
jumpNext("showInterstitialAd 2");
// 当广告加载失败时的逻辑
Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null;
},
false,true
);
} else {
jumpNext("showInterstitialAd 1");
}
}
}
}, 3000);
} else {
if (ret == 0) {
Log.d("showAppOpenAd11", "222");
AdmobManager.INSTANCE.showAppOpenAd(this, AdmobHelps.INSTANCE.showAppOpenAd(this,
() -> {
jumpNext("showAppOpenAd 1");
Log.d("showAppOpenAd", "333");
return null;
},
() -> {
adShowing = true;
nonBlockingCountdown.cancel();
Log.d("showAppOpenAd", "444");
return null;
},
() -> {
jumpNext("showAppOpenAd 2");
Log.d("showAppOpenAd", "555");
return null;
}, false
);
} else if (ret == 1) {
if (AdmobHelps.INSTANCE.isShowAdInter()) {
AdmobHelps.INSTANCE.showInterstitialAd(
StartActivity.this,
() -> { () -> {
jumpNext("showInterstitialAd 1"); jumpNext("showAppOpenAd 1");
// 当广告被关闭时的逻辑 Log.d("showAppOpenAd", "333");
Log.d("AdmobHelps", "Interstitial Ad was dismissed.");
return null; return null;
}, },
() -> { () -> {
// 当广告展示完成时的逻辑
adShowing = true; adShowing = true;
nonBlockingCountdown.cancel(); nonBlockingCountdown.cancel();
Log.d("AdmobHelps", "Interstitial Ad was shown."); Log.d("showAppOpenAd", "444");
return null; return null;
}, },
() -> { () -> {
jumpNext("showInterstitialAd 2"); jumpNext("showAppOpenAd 2");
// 当广告加载失败时的逻辑 Log.d("showAppOpenAd", "555");
Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null; return null;
}, }, false
false
); );
}else { } else if (ret == 1) {
jumpNext("showInterstitialAd 1"); if (AdmobHelps.INSTANCE.isShowAdInter()) {
AdmobHelps.INSTANCE.showInterstitialAd(
StartActivity.this,
() -> {
jumpNext("showInterstitialAd 1");
// 当广告被关闭时的逻辑
Log.d("AdmobHelps", "Interstitial Ad was dismissed.");
return null;
},
() -> {
// 当广告展示完成时的逻辑
adShowing = true;
nonBlockingCountdown.cancel();
Log.d("AdmobHelps", "Interstitial Ad was shown.");
return null;
},
() -> {
jumpNext("showInterstitialAd 2");
// 当广告加载失败时的逻辑
Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null;
},
false,
true
);
} else {
jumpNext("showInterstitialAd 1");
}
} }
} }
return null; return null;
...@@ -309,13 +342,13 @@ public class StartActivity extends AppCompatActivity { ...@@ -309,13 +342,13 @@ public class StartActivity extends AppCompatActivity {
} }
private void showOpenAdFlase() { private void showOpenAdFlase() {
AdmobManager.INSTANCE.init(this, (ret) -> { AdmobHelps.INSTANCE.init(this, (ret) -> {
Log.d("showAppOpenAd", "111"); Log.d("showAppOpenAd", "111");
if (isFinishing() || isDestroyed()) return null; if (isFinishing() || isDestroyed()) return null;
if (ret == 0) { if (ret == 0) {
Log.d("showAppOpenAd", "222"); Log.d("showAppOpenAd", "222");
AdmobManager.INSTANCE.showAppOpenAd(this, AdmobHelps.INSTANCE.showAppOpenAd(this,
() -> { () -> {
startIntent(); startIntent();
Log.d("showAppOpenAd", "333"); Log.d("showAppOpenAd", "333");
...@@ -356,9 +389,10 @@ public class StartActivity extends AppCompatActivity { ...@@ -356,9 +389,10 @@ public class StartActivity extends AppCompatActivity {
Log.d("AdmobHelps", "Interstitial Ad failed to load."); Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null; return null;
}, },
false false,
true
); );
}else { } else {
startIntent(); startIntent();
} }
} }
...@@ -371,7 +405,7 @@ public class StartActivity extends AppCompatActivity { ...@@ -371,7 +405,7 @@ public class StartActivity extends AppCompatActivity {
} }
private void startIntent() { private void startIntent() {
startActivity(new Intent(this, GuideActivity.class)); startActivity(new Intent(this, ClooseFunActivity.class));
finish(); finish();
} }
...@@ -420,40 +454,21 @@ public class StartActivity extends AppCompatActivity { ...@@ -420,40 +454,21 @@ public class StartActivity extends AppCompatActivity {
if (Objects.equals(actionId, GlobalConfig.ID_CLEAN_JUNK)) { if (Objects.equals(actionId, GlobalConfig.ID_CLEAN_JUNK)) {
Intent intent = new Intent(this, AnimatorActivity.class); Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",1); intent.putExtra("animator", 1);
startActivity(intent);
return;
}
if (Objects.equals(actionId, GlobalConfig.ID_APPMANAGER)) {
Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",7);
startActivity(intent); startActivity(intent);
return; return;
} }
if (Objects.equals(actionId, GlobalConfig.ID_BATTERY_INFO)) { if (Objects.equals(actionId, GlobalConfig.ID_BATTERY_INFO)) {
Intent intent = new Intent(this, AnimatorActivity.class); Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",2); intent.putExtra("animator", 2);
startActivity(intent); startActivity(intent);
return; return;
} }
if (Objects.equals(actionId, GlobalConfig.ID_LARGE_FILE_CLEANER)) { if (Objects.equals(actionId, GlobalConfig.ID_LARGE_FILE_CLEANER)) {
Intent intent = new Intent(this, AnimatorActivity.class); Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",3); intent.putExtra("animator", 3);
startActivity(intent);
return;
}
if (Objects.equals(actionId, GlobalConfig.ID_WHATSAPP)) {
Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",8);
startActivity(intent);
return;
}
if (Objects.equals(actionId, GlobalConfig.ID_APP_PROCESS)) {
Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",6);
startActivity(intent); startActivity(intent);
return; return;
} }
...@@ -464,24 +479,24 @@ public class StartActivity extends AppCompatActivity { ...@@ -464,24 +479,24 @@ public class StartActivity extends AppCompatActivity {
} }
if (Objects.equals(actionId, GlobalConfig.ID_SCREENSHOT_CLEAN)) { if (Objects.equals(actionId, GlobalConfig.ID_SCREENSHOT_CLEAN)) {
Intent intent = new Intent(this, AnimatorActivity.class); Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("animator",4); intent.putExtra("animator", 4);
startActivity(intent); startActivity(intent);
return; return;
} }
if (Objects.equals(actionId, ID_WHEATHER)) { if (Objects.equals(actionId, ID_WHEATHER)) {
AdmobManager.INSTANCE.isShowAdInter(); AdmobHelps.INSTANCE.isShowAdInter();
startActivity(new Intent(this, WeatherInterface.class)); startActivity(new Intent(this, WeatherInterface.class));
finish(); finish();
return; return;
} }
if (Objects.equals(actionId, ID_XINGZUO)) { if (Objects.equals(actionId, ID_XINGZUO)) {
AdmobManager.INSTANCE.isShowAdInter(); AdmobHelps.INSTANCE.isShowAdInter();
startActivity(new Intent(this, XzLoadingActivity.class)); startActivity(new Intent(this, XzLoadingActivity.class));
finish(); finish();
return; return;
} }
if (Objects.equals(actionId, ID_MALWARE_CLEAN)) { if (Objects.equals(actionId, ID_MALWARE_CLEAN)) {
AdmobManager.INSTANCE.isShowAdInter(); AdmobHelps.INSTANCE.isShowAdInter();
startActivity(new Intent(this, MalwareCleanActivity.class)); startActivity(new Intent(this, MalwareCleanActivity.class));
finish(); finish();
return; return;
...@@ -492,7 +507,7 @@ public class StartActivity extends AppCompatActivity { ...@@ -492,7 +507,7 @@ public class StartActivity extends AppCompatActivity {
startActivity(new Intent(this, MainActivity.class)); startActivity(new Intent(this, MainActivity.class));
finish(); finish();
} else { } else {
startActivity(new Intent(this, GuideActivity.class)); startActivity(new Intent(this, ClooseFunActivity.class));
finish(); finish();
} }
} }
...@@ -509,5 +524,8 @@ public class StartActivity extends AppCompatActivity { ...@@ -509,5 +524,8 @@ public class StartActivity extends AppCompatActivity {
nonBlockingCountdown.cancel(); nonBlockingCountdown.cancel();
multiplePermissionsLauncher = null; multiplePermissionsLauncher = null;
notificationSettingsLauncher = null; notificationSettingsLauncher = null;
if (handler != null) {
handler.removeCallbacksAndMessages(null);
}
} }
} }
\ No newline at end of file
package com.swiftcleaner.chovey.view.activity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.Manifest;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.CountDownTimer;
import android.os.Environment;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.clean.file.b.business.newAdmob.AdmobHelps;
import com.gyf.immersionbar.ImmersionBar;
import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.business.EventUtils;
import com.swiftcleaner.chovey.business.admob.AdmobManager;
import com.swiftcleaner.chovey.databinding.ActivityWhatsAppBinding;
import com.swiftcleaner.chovey.model.bean.CleanFileBean;
import com.swiftcleaner.chovey.model.tool.FileHelps;
import com.swiftcleaner.chovey.model.tool.FileTypes;
import com.swiftcleaner.chovey.model.tool.MediaHelps;
import com.swiftcleaner.chovey.model.tool.ToastUtil;
import com.swiftcleaner.chovey.model.util.AppSchedulers;
import com.swiftcleaner.chovey.model.util.FinishMain;
import com.swiftcleaner.chovey.view.BaseActivity;
import com.swiftcleaner.chovey.view.BaseActivityKotlin;
import com.swiftcleaner.chovey.view.MainActivity;
import com.swiftcleaner.chovey.view.adapter.WhatsAppCleanAudioAdapter;
import com.swiftcleaner.chovey.view.adapter.WhatsAppCleanImageAdapter;
import com.swiftcleaner.chovey.view.adapter.WhatsAppCleanVideoAdapter;
import com.swiftcleaner.chovey.view.dialog.CustomScoreDialog;
import com.swiftcleaner.chovey.view.dialog.LoadingDialog;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
public class WhatsAppActivity extends BaseActivity<ActivityWhatsAppBinding> {
private static final int REQUEST_CODE = 1;
WhatsAppCleanImageAdapter appCleanImageAdapter;
WhatsAppCleanAudioAdapter appCleanAudioAdapter;
WhatsAppCleanVideoAdapter appCleanVideoAdapter;
private long totalSelectedSize = 0;
private long selectedSize = 0;
List<CleanFileBean> videoList;
List<CleanFileBean> imageList;
List<CleanFileBean> audioList;
List<CleanFileBean> files;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
private static final int REQUEST_ALL_FILES_ACCESS_PERMISSION = 100;
private static final int REQUEST_PERMISSION_CODE = 101;
@Override
protected ActivityWhatsAppBinding getViewBinding() {
return ActivityWhatsAppBinding.inflate(getLayoutInflater());
}
@Override
protected void initView() {
initBar();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
}
}
@Override
protected void initData() {
EventUtils.INSTANCE.event("page_WhatsAppActivity", "", null);
checkAndRequestPermissions();
initShow();
}
@Override
protected void onResume() {
super.onResume();
AdmobHelps.INSTANCE.showNativeAd(this,binding.flAd,R.layout.layout_ad_native_small,AdmobHelps.INSTANCE.isShowAdNativeBottom(),false);
}
private void checkAndRequestPermissions() {
if (!checkFilesAccessPermission(this)) {
// 没有权限,请求权限
requestFilesAccessPermission();
}
}
private boolean checkFilesAccessPermission(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
return Environment.isExternalStorageManager();
} else {
int readPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
int writePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
return readPermission == PackageManager.PERMISSION_GRANTED && writePermission == PackageManager.PERMISSION_GRANTED;
}
}
private void requestFilesAccessPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
try {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_ALL_FILES_ACCESS_PERMISSION);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "Unable to request permission, please grant manually", Toast.LENGTH_SHORT).show();
}
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_ALL_FILES_ACCESS_PERMISSION) {
// 检查权限是否已经授予
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
// 权限已授予,刷新页面或执行相关操作
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
} else {
// 权限未授予,提示用户
Toast.makeText(this, "Permission not granted, please grant manually", Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_ALL_FILES_ACCESS_PERMISSION) {
if (!checkFilesAccessPermission(this)) {
// 权限未授予,直接关闭页面
Toast.makeText(this, "Unauthorized permission, the page is about to close", Toast.LENGTH_SHORT).show();
finish();
}
} else if (requestCode == REQUEST_PERMISSION_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
// 权限已授予,可以继续操作
} else {
// 权限未授予,直接关闭页面
Toast.makeText(this, "Unauthorized permission, the page is about to close", Toast.LENGTH_SHORT).show();
finish();
}
}
}
private void initShow() {
binding.ivReturn.setOnClickListener(v -> {
initCustDialog();
});
binding.imageFilesRecy.setVisibility(View.VISIBLE);
binding.videoFilesRecy.setVisibility(View.VISIBLE);
binding.audioFilesRecy.setVisibility(View.VISIBLE);
binding.imageFilesAllCl.setOnClickListener(v -> {
if (binding.imageFilesRecy.getVisibility() == View.VISIBLE) {
binding.imageFilesRecy.setVisibility(View.GONE);
} else {
binding.imageFilesRecy.setVisibility(View.VISIBLE);
}
});
binding.videoFilesAllCl.setOnClickListener(v -> {
if (binding.videoFilesRecy.getVisibility() == View.VISIBLE) {
binding.videoFilesRecy.setVisibility(View.GONE);
} else {
binding.videoFilesRecy.setVisibility(View.VISIBLE);
}
});
binding.audioFilesAllCl.setOnClickListener(v -> {
if (binding.audioFilesRecy.getVisibility() == View.VISIBLE) {
binding.audioFilesRecy.setVisibility(View.GONE);
} else {
binding.audioFilesRecy.setVisibility(View.VISIBLE);
}
});
binding.buttonCleanUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (selectedSize < 0) {
ToastUtil.showLongToast(WhatsAppActivity.this, "Please check the file to be deleted");
} else {
if (view != null) {
onClickCleanUpButton(view);
}
}
}
});
initImage();
initVideo();
initAudio();
compositeDisposable.add(initImage().andThen(initAudio()).andThen(initVideo()).subscribe(() -> {
// 所有操作完成后执行
binding.wasteNumber.setText(formatFileSize(totalSelectedSize));
}, throwable -> {
// 处理错误
throwable.printStackTrace();
}));
}
public void onClickCleanUpButton(View view) {
List<CleanFileBean> imageFiles;
List<CleanFileBean> videoFiles;
List<CleanFileBean> audioFiles;
if (appCleanImageAdapter != null) {
imageFiles = appCleanImageAdapter.getSelectedFiles();
ImageCleanFiles(imageFiles);
}
if (appCleanVideoAdapter != null) {
videoFiles = appCleanVideoAdapter.getSelectedFiles();
VideoCleanFiles(videoFiles);
}
if (appCleanVideoAdapter != null) {
audioFiles = appCleanAudioAdapter.getSelectedFiles();
AudioCleanFiles(audioFiles);
}
updateButtonStatus();
//跳转页面
initAnimation(formatFileSize(selectedSize));
}
private void initAnimation(String str) {
Intent intent = new Intent(this, AnimatorActivity.class);
intent.putExtra("cleanstr", "Cleaned " + str + " junk files");
intent.putExtra("title", "Clean Junk");
intent.putExtra("animator",5);
startActivity(intent);
finish();
}
//图片删除
public void ImageCleanFiles(List<CleanFileBean> selectedFiles) {
Disposable disposable = Observable.fromCallable(() -> {
// 文件删除操作,放到后台线程执行
for (CleanFileBean selectedFile : selectedFiles) {
FileHelps.deleteFile(selectedFile.getPath());
}
// 将删除的文件路径转换为数组
String[] paths = selectedFiles.stream()
.map(CleanFileBean::getPath)
.toArray(String[]::new);
return paths;
})
.subscribeOn(AppSchedulers.io()) // 在后台线程执行文件删除
.observeOn(AppSchedulers.mainThread()) // 切换到主线程执行 UI 更新
.subscribe(paths -> {
// 更新媒体库
MediaHelps.updateMedia(getApplication(), paths);
appCleanImageAdapter.removeSelectedFiles(selectedFiles);
appCleanImageAdapter.notifyDataSetChanged();
}, throwable -> {
// 处理错误
throwable.printStackTrace();
});
compositeDisposable.add(disposable);
}
//视频删除
public void VideoCleanFiles(List<CleanFileBean> selectedFiles) {
Disposable disposable = Observable.fromCallable(() -> {
// 文件删除操作,放到后台线程执行
for (CleanFileBean selectedFile : selectedFiles) {
FileHelps.deleteFile(selectedFile.getPath());
}
// 将删除的文件路径转换为数组
String[] paths = selectedFiles.stream()
.map(CleanFileBean::getPath)
.toArray(String[]::new);
return paths;
})
.subscribeOn(AppSchedulers.io()) // 在后台线程执行文件删除
.observeOn(AppSchedulers.mainThread()) // 切换到主线程执行 UI 更新
.subscribe(paths -> {
// 更新媒体库
MediaHelps.updateMedia(getApplication(), paths);
appCleanVideoAdapter.removeSelectedFiles(selectedFiles);
appCleanVideoAdapter.notifyDataSetChanged();
}, throwable -> {
// 处理错误
throwable.printStackTrace();
});
compositeDisposable.add(disposable);
}
//音频删除
public void AudioCleanFiles(List<CleanFileBean> selectedFiles) {
Disposable disposable = Observable.fromCallable(() -> {
// 文件删除操作,放到后台线程执行
for (CleanFileBean selectedFile : selectedFiles) {
FileHelps.deleteFile(selectedFile.getPath());
}
// 将删除的文件路径转换为数组
String[] paths = selectedFiles.stream()
.map(CleanFileBean::getPath)
.toArray(String[]::new);
return paths;
})
.subscribeOn(AppSchedulers.io()) // 在后台线程执行文件删除
.observeOn(AppSchedulers.mainThread()) // 切换到主线程执行 UI 更新
.subscribe(paths -> {
// 更新媒体库
MediaHelps.updateMedia(getApplication(), paths);
appCleanAudioAdapter.removeSelectedFiles(selectedFiles);
appCleanAudioAdapter.notifyDataSetChanged();
}, throwable -> {
// 处理错误
throwable.printStackTrace();
});
compositeDisposable.add(disposable);
}
private Completable initImage() {
return Completable.fromObservable(Observable.fromCallable(() -> {
files = FileHelps.findWhatsappFiles();
Log.d("ssad", files.toString());
if (files != null) {
imageList = files.stream()
.filter(file -> FileTypes.images.stream().anyMatch(suffix -> file.getName().toLowerCase(Locale.ROOT).endsWith(suffix)))
.collect(Collectors.toList());
}
return imageList;
}).subscribeOn(AppSchedulers.io())
.observeOn(AppSchedulers.mainThread())
.doOnNext(emptyFolders -> {
long totalSize = imageList.stream()
.mapToLong(CleanFileBean::getLength)
.sum();
totalSelectedSize += totalSize;
appCleanImageAdapter = new WhatsAppCleanImageAdapter(imageList, new WhatsAppCleanImageAdapter.OnItemClickListener() {
@Override
public void onItemClick(CleanFileBean fileBean) {
if (fileBean.isSelected()) {
selectedSize += fileBean.getLength();
updateButtonStatus();
} else {
selectedSize -= fileBean.getLength();
updateButtonStatus();
}
}
});
binding.imageFilesRecy.setAdapter(appCleanImageAdapter);
binding.imageFilesRecy.setLayoutManager(new LinearLayoutManager(this));
}))
.onErrorComplete();
}
private Completable initAudio() {
return Completable.fromObservable(Observable.fromCallable(() -> {
files = FileHelps.findWhatsappFiles();
Log.d("ssad", files.toString());
if (files != null) {
audioList = files.stream()
.filter(file -> FileTypes.audios.stream().anyMatch(suffix -> file.getName().toLowerCase(Locale.ROOT).endsWith(suffix)))
.collect(Collectors.toList());
}
return audioList;
}).subscribeOn(AppSchedulers.io())
.observeOn(AppSchedulers.mainThread())
.doOnNext(emptyFolders -> {
long totalSize = audioList.stream()
.mapToLong(CleanFileBean::getLength)
.sum();
totalSelectedSize += totalSize;
appCleanAudioAdapter = new WhatsAppCleanAudioAdapter(audioList, new WhatsAppCleanAudioAdapter.OnItemClickListener() {
@Override
public void onItemClick(CleanFileBean fileBean) {
if (fileBean.isSelected()) {
selectedSize += fileBean.getLength();
updateButtonStatus();
} else {
selectedSize -= fileBean.getLength();
updateButtonStatus();
}
}
});
binding.audioFilesRecy.setAdapter(appCleanAudioAdapter);
binding.audioFilesRecy.setLayoutManager(new LinearLayoutManager(this));
}))
.onErrorComplete();
}
private Completable initVideo() {
return Completable.fromObservable(Observable.fromCallable(() -> {
files = FileHelps.findWhatsappFiles();
Log.d("ssad", files.toString());
if (files != null) {
videoList = files.stream()
.filter(file -> FileTypes.videos.stream().anyMatch(suffix -> file.getName().toLowerCase(Locale.ROOT).endsWith(suffix)))
.collect(Collectors.toList());
}
return videoList;
}).subscribeOn(AppSchedulers.io())
.observeOn(AppSchedulers.mainThread())
.doOnNext(emptyFolders -> {
long totalSize = videoList.stream()
.mapToLong(CleanFileBean::getLength)
.sum();
totalSelectedSize += totalSize;
appCleanVideoAdapter = new WhatsAppCleanVideoAdapter(videoList, new WhatsAppCleanVideoAdapter.OnItemClickListener() {
@Override
public void onItemClick(CleanFileBean fileBean) {
if (fileBean.isSelected()) {
selectedSize += fileBean.getLength();
updateButtonStatus();
} else {
selectedSize -= fileBean.getLength();
updateButtonStatus();
}
}
});
binding.videoFilesRecy.setAdapter(appCleanVideoAdapter);
binding.videoFilesRecy.setLayoutManager(new LinearLayoutManager(this));
}))
.onErrorComplete();
}
private void updateButtonStatus() {
binding.buttonCleanUp.setText("Clean Up " + formatFileSize(selectedSize));
}
private String formatFileSize(long size) {
if (size <= 0) return "0 Bytes";
final String[] units = new String[]{"Bytes", "KB", "MB", "GB", "TB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
@Override
public void onBackPressed() {
initCustDialog();
}
private void initBar() {
ImmersionBar.with(this)
.transparentStatusBar() // 透明状态栏
.statusBarDarkFont(true) // 状态栏字体颜色为深色
.navigationBarDarkIcon(false) // 导航栏图标颜色为浅色
.init();
}
private void initCustDialog() {
Activity activity = this;
CustomScoreDialog customScoreDialog = new CustomScoreDialog(this);
customScoreDialog.setOnDialogClickListener(new CustomScoreDialog.OnDialogClickListener() {
@Override
public void onCancel() {
customScoreDialog.dismiss();
}
@Override
public void onSubmit() {
if (AdmobHelps.INSTANCE.isShowAdBackInter()){
AdmobHelps.INSTANCE.showInterstitialAd(
WhatsAppActivity.this,
() -> {
FinishMain.INSTANCE.finishToMain(activity);
// 当广告被关闭时的逻辑
Log.d("AdmobHelps", "Interstitial Ad was dismissed.");
return null;
},
() -> {
// 当广告展示完成时的逻辑
Log.d("AdmobHelps", "Interstitial Ad was shown.");
return null;
},
() -> {
FinishMain.INSTANCE.finishToMain(activity);
// 当广告加载失败时的逻辑
Log.d("AdmobHelps", "Interstitial Ad failed to load.");
return null;
},
false
);
}else {
FinishMain.INSTANCE.finishToMain(activity);
}
}
});
customScoreDialog.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
compositeDisposable.clear();
if (compositeDisposable != null) {
compositeDisposable.dispose(); // 取消所有订阅
}
}
}
\ No newline at end of file
package com.swiftcleaner.chovey.view.adapter;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatButton;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.model.bean.AppInfo;
import com.swiftcleaner.chovey.model.bean.AppInfoBean;
import java.util.List;
public class AppInfoAdapter extends RecyclerView.Adapter<AppInfoAdapter.AppInfoViewHolder> {
private List<AppInfoBean> appList;
Context context;
public AppInfoAdapter(List<AppInfoBean> appList, Context context) {
this.appList = appList;
this.context = context;
}
@NonNull
@Override
public AppInfoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_battery_list, parent, false);
return new AppInfoViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AppInfoViewHolder holder, int position) {
AppInfoBean appInfoBean = appList.get(position);
holder.button_delete.setOnClickListener(v->{
// 卸载应用
Intent intentUninstall = new Intent(Intent.ACTION_DELETE);
intentUninstall.setData(Uri.parse("package:" + appInfoBean.getPackageName()));
context.startActivity(intentUninstall);
appList.remove(appInfoBean);
});
Glide.with(context)
.load(appInfoBean.getAppIcon())
.apply(new RequestOptions().transform(new RoundedCorners(10)))
.error(R.mipmap.ic_launcher)
.placeholder(R.mipmap.ic_launcher)
.into(holder.icon);
holder.appName.setText(appInfoBean.getAppName());
// holder.memoryUsage.setText(String.format("", formatMemoryUsage(appInfoBean.)));
}
@Override
public int getItemCount() {
return appList.size();
}
public static class AppInfoViewHolder extends RecyclerView.ViewHolder {
ImageView icon;
TextView appName;
TextView memoryUsage;
AppCompatButton button_delete;
public AppInfoViewHolder(@NonNull View itemView) {
super(itemView);
icon = itemView.findViewById(R.id.item_battery_img);
appName = itemView.findViewById(R.id.item_battery_name);
memoryUsage = itemView.findViewById(R.id.item_battery_memory_number);
button_delete = itemView.findViewById(R.id.item_button_battery_delete);
}
}
}
package com.swiftcleaner.chovey.view.adapter;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatButton;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.model.bean.AppInfo;
import com.swiftcleaner.chovey.model.bean.AppInfoBean;
import java.util.List;
public class AppProcessAdapter extends RecyclerView.Adapter<AppProcessAdapter.AppInfoViewHolder> {
private List<AppInfoBean> appList;
Context context;
public AppProcessAdapter(List<AppInfoBean> appList, Context context) {
this.appList = appList;
this.context = context;
}
@NonNull
@Override
public AppInfoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_app_process_list, parent, false);
return new AppInfoViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AppInfoViewHolder holder, int position) {
AppInfoBean appInfo = appList.get(position);
holder.button_delete.setOnClickListener(v->{
// 打开应用详情页(进程)
Intent intentAppDetails = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intentAppDetails.setData(Uri.parse("package:" + appInfo.getPackageName()));
context.startActivity(intentAppDetails);
});
Glide.with(context)
.load(appInfo.getAppIcon())
.apply(new RequestOptions().transform(new RoundedCorners(10)))
.error(R.mipmap.ic_launcher)
.placeholder(R.mipmap.ic_launcher)
.into(holder.icon);
holder.appName.setText(appInfo.getAppName());
}
@Override
public int getItemCount() {
return appList.size();
}
public static class AppInfoViewHolder extends RecyclerView.ViewHolder {
ImageView icon;
TextView appName;
AppCompatButton button_delete;
public AppInfoViewHolder(@NonNull View itemView) {
super(itemView);
icon = itemView.findViewById(R.id.item_battery_img);
appName = itemView.findViewById(R.id.item_battery_name);
button_delete = itemView.findViewById(R.id.item_button_battery_delete);
}
}
}
package com.swiftcleaner.chovey.view.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.model.bean.CleanFileBean;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class WhatsAppCleanAdapter extends RecyclerView.Adapter<WhatsAppCleanAdapter.AppInfoViewHolder> {
private List<CleanFileBean> list;
private OnItemClickListener listener;
public WhatsAppCleanAdapter(List<CleanFileBean> list, OnItemClickListener listener) {
this.list = list;
this.listener = listener;
}
@NonNull
@Override
public AppInfoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_clean_list_min, parent, false);
return new AppInfoViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AppInfoViewHolder holder, int position) {
CleanFileBean fileInfo = list.get(position);
if (fileInfo!=null&&fileInfo.getPath()!=null){
Glide.with(holder.itemView.getContext())
.load(R.mipmap.l_tu)
.apply(new RequestOptions().transform(new RoundedCorners(10)))
.error(R.mipmap.ic_launcher)
.placeholder(R.mipmap.ic_launcher)
.into(holder.apk_icon);
holder.apk_Name.setText(fileInfo.getName());
holder.apk_number.setText(formatFileSize(fileInfo.getLength()));
holder.apk_checked.setChecked(fileInfo.isSelected());
holder.itemView.setOnClickListener(v -> {
// 切换选中状态
fileInfo.setSelected(!fileInfo.isSelected());
// 通知数据变化,更新视图
notifyItemChanged(position);
// 如果设置了点击事件监听器,则回调
if (listener != null) {
listener.onItemClick(fileInfo);
}
});
}
}
private String formatFileSize(long size) {
if (size <= 0) return "0 Bytes";
final String[] units = new String[]{"Bytes", "KB", "MB", "GB", "TB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
@Override
public int getItemCount() {
return list.size();
}
public List<CleanFileBean> getSelectedFiles() {
List<CleanFileBean> selectedFiles = new ArrayList<>();
for (CleanFileBean fileBean : list) {
if (fileBean.isSelected()) {
selectedFiles.add(fileBean);
}
}
return selectedFiles;
}
public void removeSelectedFiles(List<CleanFileBean> selectedFiles) {
list.removeAll(selectedFiles);
notifyDataSetChanged(); // 通知适配器数据已更改
}
public void setAllChecked(boolean isChecked) {
for (CleanFileBean fileBean : list) {
fileBean.setSelected(isChecked);
}
notifyDataSetChanged(); // 通知适配器数据已更改
}
public boolean isAllChecked() {
for (CleanFileBean fileBean : list) {
if (!fileBean.isSelected()) {
return false;
}
}
return true;
}
public static class AppInfoViewHolder extends RecyclerView.ViewHolder {
ImageView apk_icon;
TextView apk_Name, apk_number;
CheckBox apk_checked;
public AppInfoViewHolder(@NonNull View itemView) {
super(itemView);
apk_icon = itemView.findViewById(R.id.item_clean_list_file_img);
apk_Name = itemView.findViewById(R.id.item_clean_list_file_name);
apk_checked = itemView.findViewById(R.id.item_clean_list_file_checkout);
apk_number = itemView.findViewById(R.id.item_clean_list_file_number);
}
}
public interface OnItemClickListener {
void onItemClick(CleanFileBean fileBean);
}
}
package com.swiftcleaner.chovey.view.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.model.bean.CleanFileBean;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class WhatsAppCleanAudioAdapter extends RecyclerView.Adapter<WhatsAppCleanAudioAdapter.AppInfoViewHolder> {
private List<CleanFileBean> list;
private OnItemClickListener listener;
public WhatsAppCleanAudioAdapter(List<CleanFileBean> list, OnItemClickListener listener) {
this.list = list;
this.listener = listener;
}
@NonNull
@Override
public AppInfoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_clean_list_min, parent, false);
return new AppInfoViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AppInfoViewHolder holder, int position) {
CleanFileBean fileInfo = list.get(position);
if (fileInfo!=null&&fileInfo.getPath()!=null){
Glide.with(holder.itemView.getContext())
.load(fileInfo.getPath())
.apply(new RequestOptions().transform(new RoundedCorners(10)))
.error(R.mipmap.ic_launcher)
.placeholder(R.mipmap.ic_launcher)
.into(holder.apk_icon);
holder.apk_Name.setText(fileInfo.getName());
holder.apk_number.setText(formatFileSize(fileInfo.getLength()));
holder.apk_checked.setChecked(fileInfo.isSelected());
holder.itemView.setOnClickListener(v -> {
// 切换选中状态
fileInfo.setSelected(!fileInfo.isSelected());
// 通知数据变化,更新视图
notifyItemChanged(position);
// 如果设置了点击事件监听器,则回调
if (listener != null) {
listener.onItemClick(fileInfo);
}
});
}
}
private String formatFileSize(long size) {
if (size <= 0) return "0 Bytes";
final String[] units = new String[]{"Bytes", "KB", "MB", "GB", "TB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
@Override
public int getItemCount() {
return list.size();
}
public List<CleanFileBean> getSelectedFiles() {
List<CleanFileBean> selectedFiles = new ArrayList<>();
for (CleanFileBean fileBean : list) {
if (fileBean.isSelected()) {
selectedFiles.add(fileBean);
}
}
return selectedFiles;
}
public void removeSelectedFiles(List<CleanFileBean> selectedFiles) {
list.removeAll(selectedFiles);
notifyDataSetChanged(); // 通知适配器数据已更改
}
public void setAllChecked(boolean isChecked) {
for (CleanFileBean fileBean : list) {
fileBean.setSelected(isChecked);
}
notifyDataSetChanged(); // 通知适配器数据已更改
}
public boolean isAllChecked() {
for (CleanFileBean fileBean : list) {
if (!fileBean.isSelected()) {
return false;
}
}
return true;
}
public static class AppInfoViewHolder extends RecyclerView.ViewHolder {
ImageView apk_icon;
TextView apk_Name, apk_number;
CheckBox apk_checked;
public AppInfoViewHolder(@NonNull View itemView) {
super(itemView);
apk_icon = itemView.findViewById(R.id.item_clean_list_file_img);
apk_Name = itemView.findViewById(R.id.item_clean_list_file_name);
apk_checked = itemView.findViewById(R.id.item_clean_list_file_checkout);
apk_number = itemView.findViewById(R.id.item_clean_list_file_number);
}
}
public interface OnItemClickListener {
void onItemClick(CleanFileBean fileBean);
}
}
package com.swiftcleaner.chovey.view.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.model.bean.CleanFileBean;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class WhatsAppCleanImageAdapter extends RecyclerView.Adapter<WhatsAppCleanImageAdapter.AppInfoViewHolder> {
private List<CleanFileBean> list;
private OnItemClickListener listener;
public WhatsAppCleanImageAdapter(List<CleanFileBean> list, OnItemClickListener listener) {
this.list = list;
this.listener = listener;
}
@NonNull
@Override
public AppInfoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_clean_list_min, parent, false);
return new AppInfoViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AppInfoViewHolder holder, int position) {
CleanFileBean fileInfo = list.get(position);
if (fileInfo!=null&&fileInfo.getPath()!=null){
Glide.with(holder.itemView.getContext())
.load(fileInfo.getPath())
.apply(new RequestOptions().transform(new RoundedCorners(10)))
.error(R.mipmap.ic_launcher)
.placeholder(R.mipmap.ic_launcher)
.into(holder.apk_icon);
holder.apk_Name.setText(fileInfo.getName());
holder.apk_number.setText(formatFileSize(fileInfo.getLength()));
holder.apk_checked.setChecked(fileInfo.isSelected());
holder.itemView.setOnClickListener(v -> {
// 切换选中状态
fileInfo.setSelected(!fileInfo.isSelected());
// 通知数据变化,更新视图
notifyItemChanged(position);
// 如果设置了点击事件监听器,则回调
if (listener != null) {
listener.onItemClick(fileInfo);
}
});
}
}
private String formatFileSize(long size) {
if (size <= 0) return "0 Bytes";
final String[] units = new String[]{"Bytes", "KB", "MB", "GB", "TB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
@Override
public int getItemCount() {
return list.size();
}
public List<CleanFileBean> getSelectedFiles() {
List<CleanFileBean> selectedFiles = new ArrayList<>();
for (CleanFileBean fileBean : list) {
if (fileBean.isSelected()) {
selectedFiles.add(fileBean);
}
}
return selectedFiles;
}
public void removeSelectedFiles(List<CleanFileBean> selectedFiles) {
list.removeAll(selectedFiles);
notifyDataSetChanged(); // 通知适配器数据已更改
}
public void setAllChecked(boolean isChecked) {
for (CleanFileBean fileBean : list) {
fileBean.setSelected(isChecked);
}
notifyDataSetChanged(); // 通知适配器数据已更改
}
public boolean isAllChecked() {
for (CleanFileBean fileBean : list) {
if (!fileBean.isSelected()) {
return false;
}
}
return true;
}
public static class AppInfoViewHolder extends RecyclerView.ViewHolder {
ImageView apk_icon;
TextView apk_Name, apk_number;
CheckBox apk_checked;
public AppInfoViewHolder(@NonNull View itemView) {
super(itemView);
apk_icon = itemView.findViewById(R.id.item_clean_list_file_img);
apk_Name = itemView.findViewById(R.id.item_clean_list_file_name);
apk_checked = itemView.findViewById(R.id.item_clean_list_file_checkout);
apk_number = itemView.findViewById(R.id.item_clean_list_file_number);
}
}
public interface OnItemClickListener {
void onItemClick(CleanFileBean fileBean);
}
}
package com.swiftcleaner.chovey.view.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.model.bean.CleanFileBean;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class WhatsAppCleanVideoAdapter extends RecyclerView.Adapter<WhatsAppCleanVideoAdapter.AppInfoViewHolder> {
private List<CleanFileBean> list;
private OnItemClickListener listener;
public WhatsAppCleanVideoAdapter(List<CleanFileBean> list, OnItemClickListener listener) {
this.list = list;
this.listener = listener;
}
@NonNull
@Override
public AppInfoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_clean_list_min, parent, false);
return new AppInfoViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AppInfoViewHolder holder, int position) {
CleanFileBean fileInfo = list.get(position);
if (fileInfo!=null&&fileInfo.getPath()!=null){
Glide.with(holder.itemView.getContext())
.load(fileInfo.getPath())
.apply(new RequestOptions().transform(new RoundedCorners(10)))
.error(R.mipmap.ic_launcher)
.placeholder(R.mipmap.ic_launcher)
.into(holder.apk_icon);
holder.apk_Name.setText(fileInfo.getName());
holder.apk_number.setText(formatFileSize(fileInfo.getLength()));
holder.apk_checked.setChecked(fileInfo.isSelected());
holder.itemView.setOnClickListener(v -> {
// 切换选中状态
fileInfo.setSelected(!fileInfo.isSelected());
// 通知数据变化,更新视图
notifyItemChanged(position);
// 如果设置了点击事件监听器,则回调
if (listener != null) {
listener.onItemClick(fileInfo);
}
});
}
}
private String formatFileSize(long size) {
if (size <= 0) return "0 Bytes";
final String[] units = new String[]{"Bytes", "KB", "MB", "GB", "TB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
@Override
public int getItemCount() {
return list.size();
}
public List<CleanFileBean> getSelectedFiles() {
List<CleanFileBean> selectedFiles = new ArrayList<>();
for (CleanFileBean fileBean : list) {
if (fileBean.isSelected()) {
selectedFiles.add(fileBean);
}
}
return selectedFiles;
}
public void removeSelectedFiles(List<CleanFileBean> selectedFiles) {
list.removeAll(selectedFiles);
notifyDataSetChanged(); // 通知适配器数据已更改
}
public void setAllChecked(boolean isChecked) {
for (CleanFileBean fileBean : list) {
fileBean.setSelected(isChecked);
}
notifyDataSetChanged(); // 通知适配器数据已更改
}
public boolean isAllChecked() {
for (CleanFileBean fileBean : list) {
if (!fileBean.isSelected()) {
return false;
}
}
return true;
}
public static class AppInfoViewHolder extends RecyclerView.ViewHolder {
ImageView apk_icon;
TextView apk_Name, apk_number;
CheckBox apk_checked;
public AppInfoViewHolder(@NonNull View itemView) {
super(itemView);
apk_icon = itemView.findViewById(R.id.item_clean_list_file_img);
apk_Name = itemView.findViewById(R.id.item_clean_list_file_name);
apk_checked = itemView.findViewById(R.id.item_clean_list_file_checkout);
apk_number = itemView.findViewById(R.id.item_clean_list_file_number);
}
}
public interface OnItemClickListener {
void onItemClick(CleanFileBean fileBean);
}
}
...@@ -15,7 +15,6 @@ import com.clean.file.b.business.newAdmob.AdmobHelps; ...@@ -15,7 +15,6 @@ import com.clean.file.b.business.newAdmob.AdmobHelps;
import com.swiftcleaner.chovey.R; import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.business.admob.AdmobManager; import com.swiftcleaner.chovey.business.admob.AdmobManager;
import com.swiftcleaner.chovey.business.admob.NativeView; import com.swiftcleaner.chovey.business.admob.NativeView;
import com.swiftcleaner.chovey.view.activity.AppProcessActivity;
public class AppExitDialog extends Dialog { public class AppExitDialog extends Dialog {
...@@ -79,7 +78,6 @@ public class AppExitDialog extends Dialog { ...@@ -79,7 +78,6 @@ public class AppExitDialog extends Dialog {
} }
}.start(); }.start();
setCanceledOnTouchOutside(false); setCanceledOnTouchOutside(false);
FrameLayout nativeView = findViewById(R.id.fl_ad); FrameLayout nativeView = findViewById(R.id.fl_ad);
......
...@@ -42,7 +42,7 @@ public class CustomScoreDialog extends Dialog { ...@@ -42,7 +42,7 @@ public class CustomScoreDialog extends Dialog {
FrameLayout nativeView = findViewById(R.id.fl_ad); FrameLayout nativeView = findViewById(R.id.fl_ad);
if (!isDialogDestroyed){ if (!isDialogDestroyed){
AdmobHelps.INSTANCE.showNativeAd(activity,nativeView,R.layout.layout_ad_native_small,AdmobHelps.INSTANCE.isShowAdNativeBottom(),false); AdmobHelps.INSTANCE.showNativeAd(activity,nativeView,R.layout.layout_ad_native_small,AdmobHelps.INSTANCE.isShowAdNativeExitFunction(),false);
} }
dialog_cancel.setOnClickListener(v -> { dialog_cancel.setOnClickListener(v -> {
......
...@@ -19,7 +19,6 @@ import com.swiftcleaner.chovey.R; ...@@ -19,7 +19,6 @@ import com.swiftcleaner.chovey.R;
import com.swiftcleaner.chovey.business.admob.AdmobManager; import com.swiftcleaner.chovey.business.admob.AdmobManager;
import com.swiftcleaner.chovey.business.admob.NativeView; import com.swiftcleaner.chovey.business.admob.NativeView;
import com.swiftcleaner.chovey.view.MainActivity; import com.swiftcleaner.chovey.view.MainActivity;
import com.swiftcleaner.chovey.view.activity.AppProcessActivity;
import com.swiftcleaner.chovey.view.activity.GuideActivity; import com.swiftcleaner.chovey.view.activity.GuideActivity;
import io.reactivex.rxjava3.annotations.Nullable; import io.reactivex.rxjava3.annotations.Nullable;
......
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/whick_xuan" android:state_checked="true" />
<item android:drawable="@mipmap/whick_weixuan" android:state_checked="false" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#99EBF3FF" />
<corners android:radius="16dp" />
<stroke
android:width="1dp"
android:color="#E6E6E6" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="#EBF3FF" />
<corners android:radius="16dp" />
<stroke
android:width="1dp"
android:color="#E6E6E6" />
</shape>
</item>
</selector>
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".view.activity.AppProcessActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:layout_width="match_parent"
android:layout_height="88dp"
android:background="@drawable/shape_left_right_blue"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/app_process_cl1"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="44dp"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_return"
android:layout_width="19dp"
android:layout_height="19dp"
android:layout_marginStart="16dp"
android:src="@mipmap/fanhui"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="App Process"
android:textColor="#FFFFFF"
android:textSize="19sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/app_process_text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:gravity="center"
android:text="Space Used"
android:textColor="#000000"
android:textSize="15sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/app_process_cl1" />
<TextView
android:id="@+id/app_process_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="50"
android:textColor="#000000"
android:textSize="50sp"
app:layout_constraintStart_toStartOf="@id/app_process_text1"
app:layout_constraintTop_toBottomOf="@id/app_process_text1" />
<TextView
android:id="@+id/app_process_text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_marginBottom="8dp"
android:gravity="center"
android:text="%"
android:textColor="#000000"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="@id/app_process_num"
app:layout_constraintStart_toEndOf="@id/app_process_num" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/app_process_cl2"
android:layout_width="match_parent"
android:layout_height="34dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="14dp"
android:background="@drawable/shpae_app_process_back"
app:layout_constraintTop_toBottomOf="@id/app_process_text2">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:max="100"
android:progress="0"
android:progressDrawable="@drawable/custom_progress_bar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/memoryInfo_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:gravity="center"
android:text="11"
android:textColor="#000000"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/app_process_cl2">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/img_adzhanwei_small"/>
</FrameLayout>
<TextView
android:id="@+id/app_process_text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="10dp"
android:text="Running background apps"
android:textColor="#999999"
android:textSize="15sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl_ad" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/app_process_recy"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp"
android:overScrollMode="never"
app:layout_constraintBottom_toTopOf="@id/cl5"
app:layout_constraintTop_toBottomOf="@id/app_process_text3" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl5"
android:layout_width="match_parent"
android:layout_height="80dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/app_process_button_ok"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp"
android:background="@drawable/shape_clean_up"
android:gravity="center"
android:text="Skip"
android:textColor="#FFFFFF"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".view.activity.BatteryInfoActivity">
<View
android:layout_width="match_parent"
android:layout_height="88dp"
android:background="@drawable/shape_left_right_blue"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/battery_cl1"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="44dp"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_return"
android:layout_width="19dp"
android:layout_height="19dp"
android:layout_marginStart="16dp"
android:src="@mipmap/fanhui"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="App Manager"
android:textColor="#FFFFFF"
android:textSize="19sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/battery_cl1">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/img_adzhanwei_small"/>
</FrameLayout>
<TextView
android:id="@+id/tv_battery_info_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="5dp"
android:gravity="center_vertical"
android:text="Installed applications"
android:textColor="#000000"
android:textSize="15sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl_ad" />
<TextView
android:id="@+id/tv_battery_info_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginTop="5dp"
android:gravity="center_vertical"
android:text="(85 in total)"
android:textColor="#03A9F4"
android:textSize="15sp"
app:layout_constraintStart_toEndOf="@id/tv_battery_info_text"
app:layout_constraintTop_toBottomOf="@id/fl_ad" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/battery_recy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="17dp"
android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/tv_battery_info_num"
android:overScrollMode="never"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView
android:id="@+id/id_activity_appmanager_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="loading..."
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -118,8 +118,7 @@ ...@@ -118,8 +118,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp">
app:layout_constraintTop_toBottomOf="@id/battery_cl1">
<ImageView <ImageView
android:layout_width="match_parent" android:layout_width="match_parent"
......
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
tools:context=".view.activity.ClooseFunActivity">
<TextView
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="35dp"
android:layout_marginTop="64dp"
android:gravity="center"
android:text="Which type do you want to clean?"
android:textColor="#111111"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl1"
android:layout_width="match_parent"
android:layout_height="70dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="20dp"
android:background="@drawable/shape_which_bg"
app:layout_constraintTop_toBottomOf="@id/tv_text">
<ImageView
android:id="@+id/iv_photo"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="10dp"
android:scaleType="fitXY"
android:src="@mipmap/icon_photo"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="Photo"
android:textColor="#111111"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_photo"
app:layout_constraintTop_toTopOf="parent" />
<CheckBox
android:id="@+id/check_photo"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginEnd="10dp"
android:button="@null"
android:drawableStart="@drawable/check"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl2"
android:layout_width="match_parent"
android:layout_height="70dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="20dp"
android:background="@drawable/shape_which_bg"
app:layout_constraintTop_toBottomOf="@id/cl1">
<ImageView
android:id="@+id/iv_video"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="10dp"
android:scaleType="fitXY"
android:src="@mipmap/icon_video"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="Video"
android:textColor="#111111"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_video"
app:layout_constraintTop_toTopOf="parent" />
<CheckBox
android:id="@+id/check_video"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginEnd="10dp"
android:button="@null"
android:drawableStart="@drawable/check"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl3"
android:layout_width="match_parent"
android:layout_height="70dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="20dp"
android:background="@drawable/shape_which_bg"
app:layout_constraintTop_toBottomOf="@id/cl2">
<ImageView
android:id="@+id/iv_audio"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="10dp"
android:scaleType="fitXY"
android:src="@mipmap/icon_photo"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="Audio"
android:textColor="#111111"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_audio"
app:layout_constraintTop_toTopOf="parent" />
<CheckBox
android:id="@+id/check_audio"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginEnd="10dp"
android:button="@null"
android:drawableStart="@drawable/check"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl4"
android:layout_width="match_parent"
android:layout_height="70dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="20dp"
android:background="@drawable/shape_which_bg"
app:layout_constraintTop_toBottomOf="@id/cl3">
<ImageView
android:id="@+id/iv_doc"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="10dp"
android:scaleType="fitXY"
android:src="@mipmap/icon_photo"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="Document"
android:textColor="#111111"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_doc"
app:layout_constraintTop_toTopOf="parent" />
<CheckBox
android:id="@+id/check_document"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginEnd="10dp"
android:button="@null"
android:drawableStart="@drawable/check"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<ImageView
android:id="@+id/iv_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/bottom_img1"
app:layout_constraintBottom_toBottomOf="parent"/>
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/iv_bottom">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/img_adzhanwei_small" />
</FrameLayout>
<TextView
android:id="@+id/tv_continue"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:textSize="17sp"
android:text="Continue >"
android:textColor="#1364FF"
android:gravity="center"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toTopOf="@id/fl_ad"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -160,67 +160,6 @@ ...@@ -160,67 +160,6 @@
app:layout_constraintTop_toBottomOf="@id/iv_cl_end_clean_junk_img" /> app:layout_constraintTop_toBottomOf="@id/iv_cl_end_clean_junk_img" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_end_app_manager"
android:layout_width="match_parent"
android:layout_height="155dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="12dp"
android:background="@drawable/shape_radio_10dp_white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_end_clean_junk">
<ImageView
android:id="@+id/iv_cl_end_app_manager_img"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="14dp"
android:layout_marginTop="17dp"
android:src="@mipmap/h_appmanager"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_app_manager_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="13dp"
android:layout_marginTop="3dp"
android:text="App Manager"
android:textColor="#000000"
android:textSize="16sp"
app:layout_constraintStart_toEndOf="@id/iv_cl_end_app_manager_img"
app:layout_constraintTop_toTopOf="@id/iv_cl_end_app_manager_img" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="13dp"
android:layout_marginTop="3dp"
android:gravity="start"
android:text="@string/app_manager"
android:textColor="#999999"
android:textSize="13sp"
app:layout_constraintStart_toEndOf="@id/iv_cl_end_app_manager_img"
app:layout_constraintTop_toBottomOf="@id/tv_app_manager_text" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/button_app_manager_check_no"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="27dp"
android:background="@drawable/shape_clean_up"
android:gravity="center"
android:text="Check Now"
android:textAllCaps="false"
android:textColor="#FFFFFF"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_cl_end_app_manager_img" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_end_battery_info" android:id="@+id/cl_end_battery_info"
...@@ -231,7 +170,7 @@ ...@@ -231,7 +170,7 @@
android:background="@drawable/shape_radio_10dp_white" android:background="@drawable/shape_radio_10dp_white"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_end_app_manager"> app:layout_constraintTop_toBottomOf="@id/cl_end_clean_junk">
<ImageView <ImageView
android:id="@+id/iv_cl_end_battery_info_img" android:id="@+id/iv_cl_end_battery_info_img"
...@@ -342,133 +281,6 @@ ...@@ -342,133 +281,6 @@
app:layout_constraintTop_toBottomOf="@id/iv_cl_end_large_file_cleaner" /> app:layout_constraintTop_toBottomOf="@id/iv_cl_end_large_file_cleaner" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_end_whatsapp"
android:layout_width="match_parent"
android:layout_height="155dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="12dp"
android:background="@drawable/shape_radio_10dp_white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_end_large_file">
<ImageView
android:id="@+id/iv_cl_end_whatsapp"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="14dp"
android:layout_marginTop="17dp"
android:src="@mipmap/h_whatsapp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_whatsapp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="13dp"
android:layout_marginTop="3dp"
android:text="WhatsApp Cleaner"
android:textColor="#000000"
android:textSize="16sp"
app:layout_constraintStart_toEndOf="@id/iv_cl_end_whatsapp"
app:layout_constraintTop_toTopOf="@id/iv_cl_end_whatsapp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="13dp"
android:layout_marginTop="3dp"
android:layout_marginEnd="25dp"
android:ellipsize="end"
android:gravity="start"
android:maxLines="2"
android:text="@string/free_up_space_by_cleaning_up_whatsapp_junkfiles"
android:textColor="#999999"
android:textSize="13sp"
app:layout_constraintStart_toEndOf="@id/iv_cl_end_whatsapp"
app:layout_constraintTop_toBottomOf="@id/tv_whatsapp" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/button_whatsapp_check_no"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="27dp"
android:background="@drawable/shape_clean_up"
android:gravity="center"
android:text="View"
android:textAllCaps="false"
android:textColor="#FFFFFF"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_cl_end_whatsapp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_end_app_process"
android:layout_width="match_parent"
android:layout_height="155dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="12dp"
android:background="@drawable/shape_radio_10dp_white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_end_whatsapp">
<ImageView
android:id="@+id/iv_cl_end_process"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="14dp"
android:layout_marginTop="17dp"
android:src="@mipmap/h_zppprocess"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_process"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="13dp"
android:layout_marginTop="3dp"
android:text="App Process"
android:textColor="#000000"
android:textSize="16sp"
app:layout_constraintStart_toEndOf="@id/iv_cl_end_process"
app:layout_constraintTop_toTopOf="@id/iv_cl_end_process" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="13dp"
android:layout_marginTop="3dp"
android:gravity="start"
android:text="@string/app_process"
android:textColor="#999999"
android:textSize="13sp"
app:layout_constraintStart_toEndOf="@id/iv_cl_end_process"
app:layout_constraintTop_toBottomOf="@id/tv_process" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/button_app_process_check_no"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="27dp"
android:background="@drawable/shape_clean_up"
android:gravity="center"
android:text="Check Now"
android:textAllCaps="false"
android:textColor="#FFFFFF"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_cl_end_process" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_end_similar_photos" android:id="@+id/cl_end_similar_photos"
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -478,7 +290,7 @@ ...@@ -478,7 +290,7 @@
android:background="@drawable/shape_radio_10dp_white" android:background="@drawable/shape_radio_10dp_white"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_end_app_process"> app:layout_constraintTop_toBottomOf="@id/cl_end_large_file">
<ImageView <ImageView
android:id="@+id/iv_cl_end_similar_photos" android:id="@+id/iv_cl_end_similar_photos"
......
...@@ -299,7 +299,7 @@ ...@@ -299,7 +299,7 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl3_app_manager" android:id="@+id/cl3_battery_info"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="18dp" android:layout_marginEnd="18dp"
...@@ -312,20 +312,20 @@ ...@@ -312,20 +312,20 @@
android:layout_width="50dp" android:layout_width="50dp"
android:layout_height="50dp" android:layout_height="50dp"
android:scaleType="fitXY" android:scaleType="fitXY"
android:src="@mipmap/h_appmanager" android:src="@mipmap/h_batteryinfo"
app:layout_constraintEnd_toEndOf="@id/cl3_app_manager" app:layout_constraintEnd_toEndOf="@id/cl3_battery_info"
app:layout_constraintStart_toStartOf="@id/cl3_app_manager" app:layout_constraintStart_toStartOf="@id/cl3_battery_info"
app:layout_constraintTop_toTopOf="@id/cl3_app_manager" /> app:layout_constraintTop_toTopOf="@id/cl3_battery_info" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:text="App Manager" android:text="Battery Info"
android:textColor="#000000" android:textColor="#000000"
android:textSize="15sp" android:textSize="15sp"
app:layout_constraintEnd_toEndOf="@id/cl3_app_manager" app:layout_constraintEnd_toEndOf="@id/cl3_battery_info"
app:layout_constraintStart_toStartOf="@id/cl3_app_manager" app:layout_constraintStart_toStartOf="@id/cl3_battery_info"
app:layout_constraintTop_toBottomOf="@id/iv_app_manager" /> app:layout_constraintTop_toBottomOf="@id/iv_app_manager" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
...@@ -369,7 +369,7 @@ ...@@ -369,7 +369,7 @@
app:layout_constraintTop_toBottomOf="@id/more_textview"> app:layout_constraintTop_toBottomOf="@id/more_textview">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl3_battery_info" android:id="@+id/screenshot_cleaner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="72dp" android:layout_height="72dp"
android:background="@drawable/shape_radio_20dp_white" android:background="@drawable/shape_radio_20dp_white"
...@@ -382,21 +382,21 @@ ...@@ -382,21 +382,21 @@
android:layout_height="44dp" android:layout_height="44dp"
android:layout_marginStart="14dp" android:layout_marginStart="14dp"
android:scaleType="fitXY" android:scaleType="fitXY"
android:src="@mipmap/h_batteryinfo" android:src="@mipmap/h_screenshot"
app:layout_constraintBottom_toBottomOf="@id/cl3_battery_info" app:layout_constraintBottom_toBottomOf="@id/screenshot_cleaner"
app:layout_constraintStart_toStartOf="@id/cl3_battery_info" app:layout_constraintStart_toStartOf="@id/screenshot_cleaner"
app:layout_constraintTop_toTopOf="@id/cl3_battery_info" /> app:layout_constraintTop_toTopOf="@id/screenshot_cleaner" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="72dp" android:layout_marginStart="72dp"
android:text="Battery Info" android:text="Screenshot"
android:textColor="#000000" android:textColor="#000000"
android:textSize="15sp" android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="@id/cl3_battery_info" app:layout_constraintBottom_toBottomOf="@id/screenshot_cleaner"
app:layout_constraintStart_toStartOf="@id/cl3_battery_info" app:layout_constraintStart_toStartOf="@id/screenshot_cleaner"
app:layout_constraintTop_toTopOf="@id/cl3_battery_info" /> app:layout_constraintTop_toTopOf="@id/screenshot_cleaner" />
<ImageView <ImageView
android:layout_width="18dp" android:layout_width="18dp"
...@@ -404,9 +404,9 @@ ...@@ -404,9 +404,9 @@
android:layout_marginEnd="11dp" android:layout_marginEnd="11dp"
android:scaleType="fitXY" android:scaleType="fitXY"
android:src="@mipmap/jiantou" android:src="@mipmap/jiantou"
app:layout_constraintBottom_toBottomOf="@id/cl3_battery_info" app:layout_constraintBottom_toBottomOf="@id/screenshot_cleaner"
app:layout_constraintEnd_toEndOf="@id/cl3_battery_info" app:layout_constraintEnd_toEndOf="@id/screenshot_cleaner"
app:layout_constraintTop_toTopOf="@id/cl3_battery_info" /> app:layout_constraintTop_toTopOf="@id/screenshot_cleaner" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
...@@ -417,7 +417,7 @@ ...@@ -417,7 +417,7 @@
android:background="@drawable/shape_radio_20dp_white" android:background="@drawable/shape_radio_20dp_white"
app:layout_constraintEnd_toEndOf="@id/cl4" app:layout_constraintEnd_toEndOf="@id/cl4"
app:layout_constraintStart_toStartOf="@id/cl4" app:layout_constraintStart_toStartOf="@id/cl4"
app:layout_constraintTop_toBottomOf="@id/cl3_battery_info"> app:layout_constraintTop_toBottomOf="@id/screenshot_cleaner">
<ImageView <ImageView
android:layout_width="44dp" android:layout_width="44dp"
...@@ -451,89 +451,6 @@ ...@@ -451,89 +451,6 @@
app:layout_constraintTop_toTopOf="@id/large_file_cleaner" /> app:layout_constraintTop_toTopOf="@id/large_file_cleaner" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/whats_app"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_marginTop="12dp"
android:background="@drawable/shape_radio_20dp_white"
app:layout_constraintEnd_toEndOf="@id/cl4"
app:layout_constraintStart_toStartOf="@id/cl4"
app:layout_constraintTop_toBottomOf="@id/large_file_cleaner">
<ImageView
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="14dp"
android:scaleType="fitXY"
android:src="@mipmap/h_whatsapp"
app:layout_constraintBottom_toBottomOf="@id/whats_app"
app:layout_constraintStart_toStartOf="@id/whats_app"
app:layout_constraintTop_toTopOf="@id/whats_app" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="72dp"
android:text="WhatsApp Cleaner"
android:textColor="#000000"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="@id/whats_app"
app:layout_constraintStart_toStartOf="@id/whats_app"
app:layout_constraintTop_toTopOf="@id/whats_app" />
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginEnd="11dp"
android:scaleType="fitXY"
android:src="@mipmap/jiantou"
app:layout_constraintBottom_toBottomOf="@id/whats_app"
app:layout_constraintEnd_toEndOf="@id/whats_app"
app:layout_constraintTop_toTopOf="@id/whats_app" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/app_process"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_marginTop="12dp"
android:background="@drawable/shape_radio_20dp_white"
app:layout_constraintEnd_toEndOf="@id/cl4"
app:layout_constraintStart_toStartOf="@id/cl4"
app:layout_constraintTop_toBottomOf="@id/whats_app">
<ImageView
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="14dp"
android:scaleType="fitXY"
android:src="@mipmap/h_zppprocess"
app:layout_constraintBottom_toBottomOf="@id/app_process"
app:layout_constraintStart_toStartOf="@id/app_process"
app:layout_constraintTop_toTopOf="@id/app_process" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="72dp"
android:text="App Process"
android:textColor="#000000"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="@id/app_process"
app:layout_constraintStart_toStartOf="@id/app_process"
app:layout_constraintTop_toTopOf="@id/app_process" />
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginEnd="11dp"
android:scaleType="fitXY"
android:src="@mipmap/jiantou"
app:layout_constraintBottom_toBottomOf="@id/app_process"
app:layout_constraintEnd_toEndOf="@id/app_process"
app:layout_constraintTop_toTopOf="@id/app_process" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/similar_photos" android:id="@+id/similar_photos"
...@@ -543,7 +460,7 @@ ...@@ -543,7 +460,7 @@
android:background="@drawable/shape_radio_20dp_white" android:background="@drawable/shape_radio_20dp_white"
app:layout_constraintEnd_toEndOf="@id/cl4" app:layout_constraintEnd_toEndOf="@id/cl4"
app:layout_constraintStart_toStartOf="@id/cl4" app:layout_constraintStart_toStartOf="@id/cl4"
app:layout_constraintTop_toBottomOf="@id/app_process"> app:layout_constraintTop_toBottomOf="@id/large_file_cleaner">
<ImageView <ImageView
android:layout_width="44dp" android:layout_width="44dp"
...@@ -577,48 +494,6 @@ ...@@ -577,48 +494,6 @@
app:layout_constraintTop_toTopOf="@id/similar_photos" /> app:layout_constraintTop_toTopOf="@id/similar_photos" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/screenshot_cleaner"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_marginTop="12dp"
android:background="@drawable/shape_radio_20dp_white"
app:layout_constraintEnd_toEndOf="@id/cl4"
app:layout_constraintStart_toStartOf="@id/cl4"
app:layout_constraintTop_toBottomOf="@id/similar_photos">
<ImageView
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="14dp"
android:scaleType="fitXY"
android:src="@mipmap/h_screenshot"
app:layout_constraintBottom_toBottomOf="@id/screenshot_cleaner"
app:layout_constraintStart_toStartOf="@id/screenshot_cleaner"
app:layout_constraintTop_toTopOf="@id/screenshot_cleaner" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="72dp"
android:text="Screenshot_Cleaner"
android:textColor="#000000"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="@id/screenshot_cleaner"
app:layout_constraintStart_toStartOf="@id/screenshot_cleaner"
app:layout_constraintTop_toTopOf="@id/screenshot_cleaner" />
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginEnd="11dp"
android:scaleType="fitXY"
android:src="@mipmap/jiantou"
app:layout_constraintBottom_toBottomOf="@id/screenshot_cleaner"
app:layout_constraintEnd_toEndOf="@id/screenshot_cleaner"
app:layout_constraintTop_toTopOf="@id/screenshot_cleaner" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<ImageView <ImageView
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
tools:context=".view.activity.StartActivity"> tools:context=".view.activity.StartActivity">
<ImageView <ImageView
android:id="@+id/adad"
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="100dp" android:layout_height="100dp"
android:layout_marginTop="199dp" android:layout_marginTop="199dp"
...@@ -28,6 +29,50 @@ ...@@ -28,6 +29,50 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_ee"
android:layout_width="match_parent"
android:layout_height="165dp"
android:layout_marginHorizontal="35dp"
android:layout_marginTop="38dp"
android:layout_marginBottom="20dp"
app:layout_constraintBottom_toTopOf="@id/start_id"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/product_name">
<TextView
android:id="@+id/text_consent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Consent Required"
android:textColor="#000000"
android:textSize="13sp"
android:textStyle="bold"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/essentiona"
app:layout_constraintEnd_toStartOf="@id/text_consent"
app:layout_constraintTop_toTopOf="@id/text_consent"
app:layout_constraintBottom_toBottomOf="@id/text_consent"
android:layout_marginEnd="8dp"/>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginHorizontal="15dp"
app:layout_constraintTop_toBottomOf="@id/text_consent"
app:layout_constraintBottom_toBottomOf="parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/consent_string"
android:singleLine="false"/>
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView <TextView
android:id="@+id/start_id" android:id="@+id/start_id"
android:layout_width="match_parent" android:layout_width="match_parent"
......
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".view.activity.WhatsAppActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="310dp"
android:scaleType="fitXY"
android:src="@mipmap/w_bg"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/whats_app_cl1"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginTop="44dp"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_return"
android:layout_width="19dp"
android:layout_height="19dp"
android:layout_marginStart="16dp"
android:src="@mipmap/fanhui"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="WhatsApp Cleaner"
android:textColor="#FFFFFF"
android:textSize="19sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/whats_app_cl2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="35dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/whats_app_cl1">
<TextView
android:id="@+id/waste_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="678.1"
android:textColor="@color/white"
android:textSize="50sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="@id/whats_app_cl2"
app:layout_constraintStart_toStartOf="@id/whats_app_cl2"
app:layout_constraintTop_toTopOf="@id/whats_app_cl2" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cleanable"
android:textColor="#FFFFFF"
android:textSize="15sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/waste_number" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="285dp"
android:background="@drawable/shape_top_radio_20"
app:layout_constraintTop_toTopOf="parent">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="14dp"
android:overScrollMode="never"
app:layout_constraintBottom_toTopOf="@id/button_clean_up"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/img_adzhanwei_small"/>
</FrameLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp"
android:background="@drawable/shape_radio_10dp_white">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/video_files_all_cl"
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_video_file_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="Video Messages"
android:textColor="#000000"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_video_file_zhan_kai"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginStart="12dp"
android:scaleType="fitXY"
android:src="@mipmap/w_zhankai"
app:layout_constraintBottom_toBottomOf="@id/tv_video_file_all"
app:layout_constraintStart_toEndOf="@id/tv_video_file_all"
app:layout_constraintTop_toTopOf="@id/tv_video_file_all" />
<CheckBox
android:id="@+id/video_file_all_checkout"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginEnd="14dp"
android:background="@drawable/checkout_file"
android:button="@null"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@id/iv_video_file_zhan_kai"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_video_file_zhan_kai" />
<TextView
android:id="@+id/video_file_all_file_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="43dp"
android:text=""
android:textColor="#FF613E"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="@id/iv_video_file_zhan_kai"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_video_file_zhan_kai" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/video_files_recy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/video_files_all_cl" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="12dp"
android:background="@drawable/shape_radio_10dp_white">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/image_files_all_cl"
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_image_file_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="Image Messages"
android:textColor="#000000"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_image_file_zhan_kai"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginStart="12dp"
android:scaleType="fitXY"
android:src="@mipmap/w_zhankai"
app:layout_constraintBottom_toBottomOf="@id/tv_image_file_all"
app:layout_constraintStart_toEndOf="@id/tv_image_file_all"
app:layout_constraintTop_toTopOf="@id/tv_image_file_all" />
<CheckBox
android:id="@+id/image_file_all_checkout"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginEnd="14dp"
android:background="@drawable/checkout_file"
android:button="@null"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@id/iv_image_file_zhan_kai"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_image_file_zhan_kai" />
<TextView
android:id="@+id/image_file_all_file_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="43dp"
android:text=""
android:textColor="#FF613E"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="@id/iv_image_file_zhan_kai"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_image_file_zhan_kai" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/image_files_recy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/image_files_all_cl" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="12dp"
android:background="@drawable/shape_radio_10dp_white">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/audio_files_all_cl"
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_audio_file_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="Audio Messages"
android:textColor="#000000"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_audio_file_zhan_kai"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginStart="12dp"
android:scaleType="fitXY"
android:src="@mipmap/w_zhankai"
app:layout_constraintBottom_toBottomOf="@id/tv_audio_file_all"
app:layout_constraintStart_toEndOf="@id/tv_audio_file_all"
app:layout_constraintTop_toTopOf="@id/tv_audio_file_all" />
<CheckBox
android:id="@+id/audio_file_all_checkout"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginEnd="14dp"
android:background="@drawable/checkout_file"
android:button="@null"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@id/iv_audio_file_zhan_kai"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_audio_file_zhan_kai" />
<TextView
android:id="@+id/audio_file_all_file_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="43dp"
android:text=""
android:textColor="#FF613E"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="@id/iv_audio_file_zhan_kai"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_audio_file_zhan_kai" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/audio_files_recy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/audio_files_all_cl" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/button_clean_up"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="12dp"
android:background="@drawable/shape_clean_up"
android:gravity="center"
android:text="Clean Up"
android:textAllCaps="false"
android:textColor="#FFFFFF"
android:textSize="18sp"
app:layout_constraintBottom_toTopOf="@id/iv_bottom" />
<ImageView
android:id="@+id/iv_bottom"
android:layout_width="match_parent"
android:layout_height="34dp"
android:scaleType="fitXY"
android:src="@mipmap/bian_bottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?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:layout_marginTop="18dp">
<ImageView
android:id="@+id/item_battery_img"
android:layout_width="46dp"
android:layout_height="46dp"
android:scaleType="fitXY"
android:src="@mipmap/ic_launcher"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/item_battery_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="56dp"
android:layout_marginEnd="180dp"
android:gravity="start"
android:text="1111"
android:maxLines="1"
android:ellipsize="end"
android:textColor="#000000"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/item_button_battery_delete"
android:layout_width="80dp"
android:layout_height="30dp"
android:background="@drawable/shape_button_qian_blue_radio_90"
android:gravity="center"
android:text="Stop"
android:textAllCaps="false"
android:textColor="#2E7CF6"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?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:layout_marginBottom="29dp">
<ImageView
android:id="@+id/item_battery_img"
android:layout_width="46dp"
android:layout_height="46dp"
android:scaleType="fitXY"
android:src="@mipmap/ic_launcher"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/item_battery_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="56dp"
android:layout_marginEnd="180dp"
android:gravity="start"
android:text="1111"
android:maxLines="1"
android:ellipsize="end"
android:textColor="#000000"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/item_button_battery_delete"
android:layout_width="80dp"
android:layout_height="30dp"
android:background="@drawable/shape_button_qian_blue_radio_90"
android:gravity="center"
android:text="Unistall"
android:textAllCaps="false"
android:textColor="#666666"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/item_battery_memory_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00MB"
android:visibility="gone"
android:textSize="14sp"
android:textColor="#666666"
android:gravity="center"
android:layout_marginEnd="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/item_button_battery_delete"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -51,4 +51,5 @@ ...@@ -51,4 +51,5 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/item_clean_list_file_checkout" app:layout_constraintEnd_toStartOf="@id/item_clean_list_file_checkout"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:src="@mipmap/c_app" android:src="@mipmap/h_screenshot"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
......
...@@ -61,13 +61,13 @@ ...@@ -61,13 +61,13 @@
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginBottom="6dp" android:layout_marginBottom="6dp"
android:src="@mipmap/c_app" android:src="@mipmap/h_screenshot"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="App" android:text="screenshot"
android:textColor="#666666" android:textColor="#666666"
android:textSize="12sp" android:textSize="12sp"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
......
...@@ -48,4 +48,7 @@ ...@@ -48,4 +48,7 @@
<string name="notification_malware_2">Your device might be at risk. Tap to scan and secure it now.</string> <string name="notification_malware_2">Your device might be at risk. Tap to scan and secure it now.</string>
<string name="notification_malware_3">Your device may have potential threats. Tap to scan and eliminate them.</string> <string name="notification_malware_3">Your device may have potential threats. Tap to scan and eliminate them.</string>
<string name="notification_malware_4">Your device might be at risk. Tap to run a quick scan and keep your data safe.</string> <string name="notification_malware_4">Your device might be at risk. Tap to run a quick scan and keep your data safe.</string>
<string name="consent_string">During the use of this APP, we need to obtain the following information:Mobile phone model, mobile phone manufacturer,Android system version,Application version number, application version name,Package name,Google Ad ID,Mobile phone local time zone,Mobile phone photo album, empty folders, apk files, temp files, log files,Audio files, video files, document file, file storage locations,Battery power, mobile phone standby time, battery temperature, battery voltage, battery technology, battery capacity, battery current, current average value of the battery,The package name, signature, code version, hash, file name, size, service name, etc. of the scanned APK file
Please rest assured that we will handle your information in strict accordance with relevant laws and regulations. All the information we collect will be used reasonably to ensure the normal operation and service improvement of the APP, and we will take all necessary measures to protect the security of your personal information. Your privacy is of utmost importance to us.</string>
</resources> </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