Commit 0ae7376c authored by wanglei's avatar wanglei

...

parent cbbce77b
......@@ -192,6 +192,10 @@
android:name=".activity.XzLoadingActivity"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.guide.WhichWantGuideActivity"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<meta-data
android:name="com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"
......@@ -202,6 +206,7 @@
<meta-data
android:name="com.google.android.gms.ads.flag.NATIVE_AD_DEBUGGER_ENABLED"
android:value="false" />
<service
android:name=".service.StayJobService"
android:exported="false"
......
......@@ -23,7 +23,9 @@ class BatteryInfoAnimationActivity : BaseActivity<ActivityBatteryInfoAnimationBi
private var job: Job? = null
override fun initView() {
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative)
if (AdmobMaxHelper.showLoadingNativeSp()) {
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.idFlNative)
}
resumeLottie()
}
......
......@@ -38,7 +38,9 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
override fun initView() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative)
if (AdmobMaxHelper.showLoadingNativeSp()) {
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.idFlNative)
}
if (!checkStorePermission()) {
showGerPermission(tittle = "Storage Permission Required",
desc = "This feature requires access to your storage to scan your files and clean up junk files and unused APK files. We will not transmit your data to any third-party service. Please grant permission so that we can provide you with better service.",
......@@ -51,8 +53,8 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
}
})
})
}else{
ConstObject.hasCleaned=true
} else {
ConstObject.hasCleaned = true
}
}
......
......@@ -23,7 +23,9 @@ class LargeFileAnimationActivity : BaseActivity<ActivityLargeFileAnimationBindin
private var job: Job? = null
override fun initView() {
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative)
if (AdmobMaxHelper.showLoadingNativeSp()) {
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.idFlNative)
}
}
override fun initListener() {
......
......@@ -21,7 +21,9 @@ class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() {
private var job: Job? = null
override fun initView() {
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative)
if (AdmobMaxHelper.showLoadingNativeSp()) {
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.idFlNative)
}
}
override fun initListener() {
......
......@@ -23,7 +23,9 @@ class ScreenShotAnimationActivity : BaseActivity<ActivityScreenShotAnimationBind
private var job: Job? = null
override fun initView() {
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative)
if (AdmobMaxHelper.showLoadingNativeSp()) {
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.idFlNative)
}
}
private fun jumpJob() = lifecycleScope.launch {
......
......@@ -6,11 +6,11 @@ import android.net.Uri
import android.text.SpannableString
import android.text.Spanned
import android.text.style.UnderlineSpan
import android.view.View
import com.base.filerecoveryrecyclebin.GlobalConfig
import com.base.filerecoveryrecyclebin.MyApplication
import com.base.filerecoveryrecyclebin.bean.ConstObject.ifAgreePrivacy
import com.base.filerecoveryrecyclebin.databinding.ActivitySplashBinding
import com.base.filerecoveryrecyclebin.help.ConfigHelper
class PrivacyManager {
......@@ -60,6 +60,7 @@ class PrivacyManager {
return@setOnClickListener
}
clicked = true
binding.llConsent.visibility = View.INVISIBLE
// binding.idTvStart.isVisible = false
// binding.idLlJindu.isVisible = true
// binding.idLlYinsi.igitsVisible = false
......
......@@ -17,6 +17,7 @@ import com.base.filerecoveryrecyclebin.fcm.NotificationUtil
import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
@SuppressLint("CustomSplashScreen")
class Splash2Activity : BaseActivity<ActivitySplashBinding>(),
......@@ -48,6 +49,11 @@ class Splash2Activity : BaseActivity<ActivitySplashBinding>(),
var jumpType = 0
override fun initView() {
val isHotLaunch = intent?.extras?.getBoolean("isHotLaunch", false) ?: false
Splash2Activity.isSplashHot = isHotLaunch
initStatusBar()
if (isDestroyed) {
return
......@@ -95,8 +101,14 @@ class Splash2Activity : BaseActivity<ActivitySplashBinding>(),
}, 500)
}
var shenPb = 0
private fun loadAd() {
progressCallBack = {
binding.pb.progress += shenPb
LogEx.logDebug(TAG, "AdmobOpenUtils shenPb=$shenPb ${binding.pb.max}")
}
AdmobMaxHelper.admobMaxShowOpenAd(this, {
shenPb = (binding.pb.max - binding.pb.progress) / 3
mTaskManager?.pauseProgress()
}, {
mTaskManager?.pauseProgress()
......
......@@ -28,13 +28,18 @@ object AdmobMaxHelper {
return ss == 1
}
fun showLoadingNativeSp(): Boolean {
val isShowLoadingNative = AppPreferences.getInstance().getString("isShowLoadingNative", "1").toInt()
return isShowLoadingNative == 1
}
fun showExitNativeSp(): Boolean {
val isShowExitNative = AppPreferences.getInstance().getString("isShowExitNative", "0").toInt()
return isShowExitNative == 1
}
fun showGuideNativeSp(): Boolean {
val isShowGuideNative = AppPreferences.getInstance().getString("isShowGuideNative", "0").toInt()
val isShowGuideNative = AppPreferences.getInstance().getString("isShowGuideNative", "1").toInt()
return isShowGuideNative == 1
}
......
package com.base.filerecoveryrecyclebin.ads
import android.animation.ObjectAnimator
import android.app.Activity
import android.app.Dialog
import android.os.Handler
import android.os.Looper
import android.view.View
import android.view.Window
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.splash.Splash2Activity
import com.base.filerecoveryrecyclebin.utils.LogEx
object CountdownDialog {
private val TAG = "CountdownDialog"
fun dismissLoadingDialog() {
kotlin.runCatching {
loadingDialog?.dismiss()
loadingDialog = null
}
}
/**
* 显示倒计时弹窗
*/
fun showLoadingScreen(activity: Activity, callBack: (() -> Unit)?) {
if (loadingDialog == null) {
loadingDialog = Dialog(activity).apply {
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.dialog_loading)
setCancelable(false)
window?.setBackgroundDrawable(ContextCompat.getDrawable(activity, R.drawable.bg_loadingads))
}
}
val imageView = loadingDialog?.findViewById<ImageView>(R.id.loading_image)
val countdownTextView = loadingDialog?.findViewById<TextView>(R.id.countdown_text)
imageView?.let { startRotateAnimation(it) } // 开始旋转动画
// 控制倒计时文本是否显示
countdownTextView?.visibility = View.VISIBLE
loadingDialog?.setOnDismissListener {
loadingDialog = null
}
if (!activity.isFinishing && !activity.isDestroyed) {
loadingDialog?.show()
}
callBack?.invoke()
}
private var countdown = 3 // 初始倒计时
private var countdownHandler: Handler? = null
private var loadingDialog: Dialog? = null
/**
* 倒计时3秒,如果显示了弹窗跟弹窗
*/
fun startCountdownAndShowAd(callBack: (() -> Unit)?) {
countdown = 3
updateCountdownText(countdown) // 显示倒计时文本
countdownHandler?.removeCallbacksAndMessages(null)
countdownHandler = Handler(Looper.getMainLooper())
countdownHandler?.post(object : Runnable {
override fun run() {
if (countdown <= 0) {
loadingDialog?.dismiss()
Splash2Activity.progressCallBack = null
callBack?.invoke()
} else {
Splash2Activity.progressCallBack?.invoke()
updateCountdownText(countdown) // 更新倒计时文本
countdown--
LogEx.logDebug(TAG, "startCountdownAndShowAd countdown=$countdown")
countdownHandler?.postDelayed(this, 1000)
}
}
})
}
// 更新倒计时文本并控制是否显示括号和数字
private fun updateCountdownText(count: Int) {
val countdownTextView = loadingDialog?.findViewById<TextView>(R.id.countdown_text)
// LogEx.logDebug(AdmobOpenUtils.TAG, "updateCountdownText $count countdownTextView=$countdownTextView")
countdownTextView?.text = "Ads are about to be shown($count)"
countdownTextView?.visibility = View.VISIBLE
}
private fun startRotateAnimation(imageView: ImageView) {
ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f).apply {
duration = 3000 // 持续 3 秒
repeatCount = ObjectAnimator.INFINITE // 无限循环
start()
}
}
}
\ No newline at end of file
......@@ -8,11 +8,13 @@ import com.base.filerecoveryrecyclebin.GlobalConfig
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.lastShowedOnHiddenTime
import com.base.filerecoveryrecyclebin.ads.CountdownDialog.dismissLoadingDialog
import com.base.filerecoveryrecyclebin.ads.CountdownDialog.showLoadingScreen
import com.base.filerecoveryrecyclebin.ads.CountdownDialog.startCountdownAndShowAd
import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent.clickAd
import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent.pullAd
import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent.showAd
import com.base.filerecoveryrecyclebin.help.BaseApplication
import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.view.CustomDialog
import com.google.android.gms.ads.AdError
......@@ -38,8 +40,6 @@ object AdmobInterstitialUtils {
fun showInterstitialAd(
activity: Activity,
isReLoadAd: Boolean = false,
isShowDialog: Boolean = true,
onHidden: (() -> Unit)? = null
) {
......@@ -65,20 +65,35 @@ object AdmobInterstitialUtils {
return
}
if (interAd != null) {
displayInterstitialAd(activity, onHidden)
showLoadingScreen(activity) {
startCountdownAndShowAd {
displayInterstitialAd(activity, onHidden)
}
}
} else {
showAdDialogAndLoadInterstitial(activity, isReLoadAd, isShowDialog, onHidden)
showLoadingScreen(activity) {}
loadInterstitialAd(activity) { loaded ->
if (loaded) {
startCountdownAndShowAd {
displayInterstitialAd(activity, onHidden)
}
} else {
dismissLoadingDialog()
onHidden?.invoke()
}
}
}
}
fun loadInterstitialAd(activity: Activity, onLoad: (() -> Unit)? = null) {
fun loadInterstitialAd(activity: Activity, onLoad: ((flag: Boolean) -> Unit)? = null) {
if (interAd != null) {
onLoad?.invoke()
onLoad?.invoke(true)
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("")) {
onLoad?.invoke()
if (!AdDisplayUtils.getInstance().shouldShowAd("InterAd")) {
onLoad?.invoke(false)
return
}
val reqId = UUID.randomUUID().toString()
......@@ -93,7 +108,7 @@ object AdmobInterstitialUtils {
object : InterstitialAdLoadCallback() {
override fun onAdFailedToLoad(p0: LoadAdError) {
interAd = null
onLoad?.invoke()
onLoad?.invoke(false)
pullAd(p0.responseInfo, "interAd", p0.message, reqId = reqId)
if (BuildConfig.DEBUG) {
Toast.makeText(
......@@ -107,7 +122,7 @@ object AdmobInterstitialUtils {
override fun onAdLoaded(ad: InterstitialAd) {
interAd = ad
onLoad?.invoke()
onLoad?.invoke(true)
interLoadTime = System.currentTimeMillis()
pullAd(ad.responseInfo, "interAd", reqId = reqId)
ad.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(ad)
......@@ -115,37 +130,6 @@ object AdmobInterstitialUtils {
})
}
private fun showAdDialogAndLoadInterstitial(
activity: Activity,
isReLoadAd: Boolean,
isShowDialog: Boolean,
onHidden: (() -> Unit)?
) {
if (!isShowDialog) {
onHidden?.invoke()
return
}
var mDialog: Dialog? = null
if (!activity.isFinishing && !activity.isDestroyed) {
mDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
// 设置对话框的样式和内容
mDialog.show()
}
loadInterstitialAd(activity) {
mDialog?.dismiss()
if (!isReLoadAd) {
showInterstitialAd(activity, true, false) {
onHidden?.invoke()
}
}
}
if (isReLoadAd) {
mDialog?.dismiss()
onHidden?.invoke()
}
}
private fun displayInterstitialAd(activity: Activity, onHidden: (() -> Unit)? = null) {
val thisInterAd = interAd
......
......@@ -3,7 +3,6 @@ package com.base.filerecoveryrecyclebin.ads.admob
import android.app.Activity
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.base.filerecoveryrecyclebin.BuildConfig
import com.base.filerecoveryrecyclebin.GlobalConfig
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
......@@ -11,7 +10,6 @@ import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent.clickAd
import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent.pullAd
import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent.showAd
import com.base.filerecoveryrecyclebin.help.BaseApplication
import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.google.android.gms.ads.AdListener
......@@ -81,6 +79,7 @@ object AdmobNativeUtils {
obj.put("ad_unit", "NativeAd")
EventUtils.event("ad_prepare_show", ext = obj)
if (!AdDisplayUtils.getInstance().shouldShowAd("NativeAd")) {
LogEx.logDebug(TAG, "!shouldShowAd")
return
}
loadingListener = {
......
package com.base.filerecoveryrecyclebin.ads.admob
import android.app.Activity
import com.base.filerecoveryrecyclebin.BuildConfig
import com.base.filerecoveryrecyclebin.GlobalConfig
import com.base.filerecoveryrecyclebin.activity.splash.Splash2Activity
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.ads.CountdownDialog.startCountdownAndShowAd
import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent.clickAd
import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent.pullAd
import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent.showAd
import com.base.filerecoveryrecyclebin.help.BaseApplication
import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.google.android.gms.ads.AdError
......@@ -98,40 +98,26 @@ object AdmobOpenUtils {
if (mOpenAd != null) {
LogEx.logDebug(TAG, "mOpenAd!=null")
val thisMOpenAd = mOpenAd
mOpenAd = null
thisMOpenAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
clickAd(thisMOpenAd?.responseInfo, "openAd")
}
override fun onAdDismissedFullScreenContent() {
mOpenAd = null
onHidden?.invoke(3)
loadAppOpenAd()
}
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
mOpenAd = null
onHidden?.invoke(4)
loadAppOpenAd()
val obj = JSONObject()
obj.put("reason", p0.message)
obj.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj)
}
override fun onAdShowedFullScreenContent() {
showBefore?.invoke(true)
showAd(thisMOpenAd?.responseInfo, "openAd", activity)
showBefore?.invoke(true)
if (Splash2Activity.isSplashHot) {
startCountdownAndShowAd {
showReadyAd(activity, showBefore, onHidden)
}
} else {
showReadyAd(activity, showBefore, onHidden)
}
thisMOpenAd?.show(activity)
} else {
LogEx.logDebug(TAG, "mOpenAd=null")
loadAppOpenAd {
if (mOpenAd != null) {
showAppOpenAd(activity, true, showBefore, onHidden)
showBefore?.invoke(true)
if (Splash2Activity.isSplashHot) {
startCountdownAndShowAd {
showReadyAd(activity, showBefore, onHidden)
}
} else {
showReadyAd(activity, showBefore, onHidden)
}
} else {
val obj = JSONObject()
obj.put("reason", "no_ad")
......@@ -142,4 +128,41 @@ object AdmobOpenUtils {
}
}
}
private fun showReadyAd(
activity: Activity,
showBefore: ((flag: Boolean) -> Unit)? = null,
onHidden: ((where: Int) -> Unit)?
) {
val thisMOpenAd = mOpenAd
mOpenAd = null
thisMOpenAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
clickAd(thisMOpenAd?.responseInfo, "openAd")
}
override fun onAdDismissedFullScreenContent() {
mOpenAd = null
onHidden?.invoke(3)
loadAppOpenAd()
}
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
mOpenAd = null
onHidden?.invoke(4)
loadAppOpenAd()
val obj = JSONObject()
obj.put("reason", p0.message)
obj.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj)
}
override fun onAdShowedFullScreenContent() {
showBefore?.invoke(true)
showAd(thisMOpenAd?.responseInfo, "openAd", activity)
}
}
thisMOpenAd?.show(activity)
}
}
\ No newline at end of file
package com.base.filerecoveryrecyclebin.ads.max
import android.animation.ObjectAnimator
import android.app.Activity
import android.app.Dialog
import android.os.Handler
import android.os.Looper
import android.view.View
import android.view.Window
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
......@@ -19,6 +11,8 @@ import com.base.filerecoveryrecyclebin.MyApplication.Companion.isInterOpenShowin
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.lastShowedOnHiddenTime
import com.base.filerecoveryrecyclebin.ads.CountdownDialog.showLoadingScreen
import com.base.filerecoveryrecyclebin.ads.CountdownDialog.startCountdownAndShowAd
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.base.filerecoveryrecyclebin.view.CustomDialog
......@@ -153,20 +147,16 @@ object AdMaxInterstitialUtils {
LogEx.logDebug(TAG, "loaded=true")
loadingListener = {
LogEx.logDebug(TAG, "loadingListener")
if (interstitialAd?.isReady == true) {
this.onHidden = onHidden
startCountdownAndShowAd {
loadingDialog?.dismiss()
interstitialAd?.showAd(activity)
}
} else {
loadingDialog?.dismiss()
onHidden?.invoke()
}
}
} else {
loadingDialog?.dismiss()
LogEx.logDebug(TAG, "loaded=false")
onHidden?.invoke()
}
......@@ -178,19 +168,6 @@ object AdMaxInterstitialUtils {
return System.currentTimeMillis() - interLoadTime > 1000 * 60 * 60
}
private fun showAdDialogAndLoadInterstitial(
activity: Activity,
): Dialog? {
var customDialog: Dialog? = null
if (!activity.isFinishing && !activity.isDestroyed) {
customDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
// 设置对话框的样式和内容
customDialog.show()
}
return customDialog
}
fun loadInterstitialAd(activity: Activity): Boolean {
setListener(activity)
......@@ -208,74 +185,6 @@ object AdMaxInterstitialUtils {
AdDisplayUtils.getInstance().incrementAdRequestCount()
return true
}
private fun showLoadingScreen(activity: Activity, callBack: (() -> Unit)) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (loadingDialog == null) {
loadingDialog = Dialog(activity).apply {
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.dialog_loading)
setCancelable(false)
window?.setBackgroundDrawable(ContextCompat.getDrawable(activity, R.drawable.bg_loadingads))
}
}
val imageView = loadingDialog?.findViewById<ImageView>(R.id.loading_image)
val countdownTextView = loadingDialog?.findViewById<TextView>(R.id.countdown_text)
imageView?.let { startRotateAnimation(it) } // 开始旋转动画
// 控制倒计时文本是否显示
countdownTextView?.visibility = View.VISIBLE
loadingDialog?.show()
callBack.invoke()
}
private fun startRotateAnimation(imageView: ImageView) {
ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f).apply {
duration = 3000 // 持续 3 秒
repeatCount = ObjectAnimator.INFINITE // 无限循环
start()
}
}
private var countdown = 3 // 初始倒计时
private var countdownHandler: Handler? = null
private var loadingDialog: Dialog? = null
private fun startCountdownAndShowAd(callBack: (() -> Unit)?) {
countdown = 3
updateCountdownText(count = countdown) // 显示倒计时文本
countdownHandler?.removeCallbacksAndMessages(null)
countdownHandler = Handler(Looper.getMainLooper())
countdownHandler?.post(object : Runnable {
override fun run() {
if (countdown <= 0) {
loadingDialog?.dismiss()
loadingDialog = null
callBack?.invoke()
} else {
updateCountdownText(countdown) // 更新倒计时文本
countdown--
countdownHandler?.postDelayed(this, 1000)
}
}
})
}
// 更新倒计时文本并控制是否显示括号和数字
private fun updateCountdownText(count: Int) {
val countdownTextView = loadingDialog?.findViewById<TextView>(R.id.countdown_text)
// LogEx.logDebug(AdmobOpenUtils.TAG, "updateCountdownText $count countdownTextView=$countdownTextView")
countdownTextView?.text = "Ads are about to be shown($count)"
countdownTextView?.visibility = View.VISIBLE
}
}
......@@ -19,6 +19,7 @@ import com.base.filerecoveryrecyclebin.MyApplication.Companion.isInterOpenShowin
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.splash.Splash2Activity
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.ads.CountdownDialog.startCountdownAndShowAd
import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
......@@ -204,75 +205,5 @@ object AdMaxOpenUtils {
return appOpenAd?.isReady == true
}
private fun showLoadingScreen(activity: Activity, callBack: (() -> Unit)) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (loadingDialog == null) {
loadingDialog = Dialog(activity).apply {
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.dialog_loading)
setCancelable(false)
window?.setBackgroundDrawable(ContextCompat.getDrawable(activity, R.drawable.bg_loadingads))
}
}
val imageView = loadingDialog?.findViewById<ImageView>(R.id.loading_image)
val countdownTextView = loadingDialog?.findViewById<TextView>(R.id.countdown_text)
imageView?.let { startRotateAnimation(it) } // 开始旋转动画
// 控制倒计时文本是否显示
countdownTextView?.visibility = View.VISIBLE
loadingDialog?.show()
startCountdownAndShowAd(callBack = callBack)
}
private fun startRotateAnimation(imageView: ImageView) {
ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f).apply {
duration = 3000 // 持续 3 秒
repeatCount = ObjectAnimator.INFINITE // 无限循环
start()
}
}
private var countdown = 3 // 初始倒计时
private var countdownHandler: Handler? = null
private var loadingDialog: Dialog? = null
private fun startCountdownAndShowAd(callBack: (() -> Unit)?) {
countdown = 3
updateCountdownText(count = countdown) // 显示倒计时文本
countdownHandler?.removeCallbacksAndMessages(null)
countdownHandler = Handler(Looper.getMainLooper())
countdownHandler?.post(object : Runnable {
override fun run() {
if (countdown <= 0) {
loadingDialog?.dismiss()
Splash2Activity.progressCallBack = null
callBack?.invoke()
} else {
Splash2Activity.progressCallBack?.invoke()
updateCountdownText(countdown) // 更新倒计时文本
countdown--
LogEx.logDebug(TAG, "startCountdownAndShowAd countdown=$countdown")
countdownHandler?.postDelayed(this, 1000)
}
}
})
}
// 更新倒计时文本并控制是否显示括号和数字
private fun updateCountdownText(count: Int) {
val countdownTextView = loadingDialog?.findViewById<TextView>(R.id.countdown_text)
// LogEx.logDebug(AdmobOpenUtils.TAG, "updateCountdownText $count countdownTextView=$countdownTextView")
countdownTextView?.text = "Ads are about to be shown($count)"
countdownTextView?.visibility = View.VISIBLE
}
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#4772FF" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
......@@ -13,7 +13,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="33dp"
android:layout_marginTop="300dp"
android:layout_marginTop="350dp"
android:background="@drawable/bg_fbfbfb_20"
android:orientation="vertical"
android:padding="18dp">
......@@ -46,14 +46,13 @@
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="150dp"
android:layout_marginTop="12dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:maxHeight="150dp"
android:text="@string/consent"
android:textColor="#A8A8A8"
android:textSize="13sp" />
......@@ -154,7 +153,7 @@
android:layout_height="48dp"
android:layout_marginHorizontal="40dp"
android:layout_marginBottom="49dp"
android:background="#577CFB"
android:background="@drawable/bg_4772ff_10"
android:gravity="center"
android:text="START TO USE"
android:textColor="@color/white"
......
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