Commit 9d8a858b authored by guest's avatar guest

修改新需求

parent 905d3ff3
...@@ -32,11 +32,11 @@ ...@@ -32,11 +32,11 @@
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/logo" android:icon="@mipmap/logo"
android:label="@string/app_name" android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:requestRawExternalStorageAccess="true"
android:roundIcon="@mipmap/logo" android:roundIcon="@mipmap/logo"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.DataRecovery" android:theme="@style/Theme.DataRecovery"
android:requestRawExternalStorageAccess="true"
android:requestLegacyExternalStorage="true"
tools:targetApi="34"> tools:targetApi="34">
<activity <activity
...@@ -111,7 +111,13 @@ ...@@ -111,7 +111,13 @@
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" /> tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity <activity
android:name=".activity.guide.GuideActivity" android:name=".activity.guide.FirstSelectActivity"
android:exported="true"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.guide.FirstGuestActivity"
android:exported="true" android:exported="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" android:screenOrientation="portrait"
...@@ -216,14 +222,13 @@ ...@@ -216,14 +222,13 @@
<activity <activity
android:name=".activity.junkclean.ScanJunk2Activity" android:name=".activity.junkclean.ScanJunk2Activity"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity android:name=".activity.newfunction.WeatherInterface" <activity
android:screenOrientation="portrait"/> android:name=".activity.newfunction.WeatherInterface"
<activity android:name=".activity.newfunction.WebBrowserActivity" android:screenOrientation="portrait" />
android:screenOrientation="portrait"/> <activity
<activity android:name=".activity.newfunction.XingzuoLoadingActivity" android:name=".activity.repeat.SimilarPicAt"
android:screenOrientation="portrait"/> android:screenOrientation="portrait" />
<activity android:name=".activity.repeat.SimilarPicAt"
android:screenOrientation="portrait"/>
<meta-data <meta-data
android:name="com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION" android:name="com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"
android:value="true" /> android:value="true" />
...@@ -281,8 +286,8 @@ ...@@ -281,8 +286,8 @@
android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.USER_PRESENT" /> <action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.TIMEZONE_CHANGED"/> <action android:name="android.intent.action.TIMEZONE_CHANGED" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter> </intent-filter>
...@@ -304,14 +309,17 @@ ...@@ -304,14 +309,17 @@
<data android:scheme="file" /> <data android:scheme="file" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver android:name=".fcm.work.AlterReceiver" <receiver
android:name=".fcm.work.AlterReceiver"
android:enabled="true" android:enabled="true"
android:exported="true" android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED"/> android:permission="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".fcm.work.AlterReceiver2" <receiver
android:name=".fcm.work.AlterReceiver2"
android:enabled="true" android:enabled="true"
android:exported="true" android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED"/> android:permission="android.permission.RECEIVE_BOOT_COMPLETED" />
<meta-data <meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID" android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713" /> android:value="ca-app-pub-3940256099942544~3347511713" />
......
package com.base.datarecovery
import com.base.datarecovery.utils.AppPreferences
object GlobalConfig {
// 包名
const val PACKAGE_NAME = "com.cleaner.recovery.tencgog"
// 域名
/**
* Url Event 上报接口
*/
const val URL_EVENT = "https://rp.rocioxynv2.online"
/**
* Url Api 业务接口
*/
const val URL_API = "https://api.rocioxynv2.online"
/**
* Url Privacy 隐私链接
*/
const val URL_PRIVACY = "https://sites.google.com/view/recpri/rec"
/**
* Url Use 使用条款
*/
const val URL_USE = ""
/**
* Key Aes 加密key
*/
const val KEY_AES = "5s1q2jusawhorcz0"
/**
* Key solar 归因key
*/
const val KEY_SOLAR = ""
inline val ID_ADMOB_APPLICATION get() = "ca-app-pub-3940256099942544~3347511713"
// admob广告位id
inline val ID_ADMOB_OPEN get() = "/6499/example/app-open"
inline val ID_ADMOB_INTER get() = "ca-app-pub-3940256099942544/1033173712"
inline val ID_ADMOB_NATIVE get() = "ca-app-pub-3940256099942544/2247696110"
inline val ID_ADMOB_BANNER get() = "ca-app-pub-3940256099942544/9214589741"
inline val ID_ADMOB_REWARD get() = ""
// max广告位id
inline val ID_MAX_OPEN get() = "d1d943cdd3127c90"
inline val ID_MAX_INTER get() = "b31e7f6d11ee659e"
inline val ID_MAX_NATIVE get() = "96e8fe78b0efc5d1"
inline val ID_MAX_BANNER get() = "ca-app-pub-3940256099942544/9214589741"
inline val ID_MAX_REWARD get() = ""
/**
* Key MAX MAX广告初始化key
*/
const val KEY_MAX =
"GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
//
const val KEY_INIT = "key_init"
const val KEY_AD = "sAds"
const val KEY_BLACKLIST = "blacklist"
const val KEY_CLEANUP_SIZE = "key_cleanup_size"
const val KEY_SCORE = "key_score"
const val KEY_APP_BACKGROUND = "key_app_background"
const val KEY_NOTIFICATION_ID = "key_notification_id"
const val KEY_HOME_COUNT = "key_home_count"
const val KEY_INSTALL_TIME = "key_install_time"
const val KEY_CLEAN_LAST_TIME = "key_clean_last_time"
const val KEY_NOT_CLEAN_TIME = "key_not_clean_time"
const val KEY_UUID = "key_uuid"
const val KEY_GOOGLE_ADVERTISER_ID = "key_google_advertiser_id"
const val KEY_DEVICE_NAME = "key_device_name"
const val KEY_IS_FIRST = "is_first"
const val KEY_REFERRER = "referrer"
const val KEY_TOKEN = "token"
const val KEY_TOKEN_SUCCESS = "token_success"
const val KEY_PUSH_REPORT_SWITCH = "push_report_switch"
const val ID_CLEAN_JUNK = 12000
const val ID_BATTERY_INFO = 12020
const val ID_LARGE_FILE_CLEANER = 12030
const val ID_PHOTO_COMPRESSION = 12040
const val ID_SCREENSHOT_CLEAN = 12050
const val ID_APP_INSTALL = 12060
const val ID_APP_UNINSTALL = 12070
const val ID_NOT_CLEANED = 12080
const val ID_BATTERY_LEVEL = 12090
const val ID_HOME = 12100
const val DEFAULT_SWITCH = "1"
inline var isInit
get() = AppPreferences.getInstance().getBoolean(KEY_INIT,false)
set(value) = AppPreferences.getInstance().put(KEY_INIT, value)
inline var isFirst
get() = AppPreferences.getInstance().getBoolean(KEY_IS_FIRST, true)
set(value) = AppPreferences.getInstance().put(KEY_IS_FIRST, value)
inline var useBlacklist
get() = AppPreferences.getInstance().getBoolean(KEY_BLACKLIST,false)
set(value) = AppPreferences.getInstance().put(KEY_BLACKLIST, value)
inline var useAdmob
get() = AppPreferences.getInstance().getString(KEY_AD, "1").toInt()
set(value) = AppPreferences.getInstance().put(KEY_AD, value)
const val KEY_GET_CONFIG = "getConfigInterval"
}
\ No newline at end of file
...@@ -15,7 +15,6 @@ import androidx.work.PeriodicWorkRequestBuilder ...@@ -15,7 +15,6 @@ import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager import androidx.work.WorkManager
import com.base.datarecovery.activity.newfunction.WeatherUtils import com.base.datarecovery.activity.newfunction.WeatherUtils
import com.base.datarecovery.activity.splash.Splash2Activity import com.base.datarecovery.activity.splash.Splash2Activity
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy
import com.base.datarecovery.fcm.FCMManager import com.base.datarecovery.fcm.FCMManager
import com.base.datarecovery.fcm.ScreenStatusReceiver import com.base.datarecovery.fcm.ScreenStatusReceiver
...@@ -55,6 +54,9 @@ class MyApplication : BaseApplication() { ...@@ -55,6 +54,9 @@ class MyApplication : BaseApplication() {
@JvmField @JvmField
var PAUSED_VALUE = 0 var PAUSED_VALUE = 0
fun initApp() {
(context as MyApplication).initApp()
}
} }
override fun init() { override fun init() {
...@@ -82,7 +84,7 @@ class MyApplication : BaseApplication() { ...@@ -82,7 +84,7 @@ class MyApplication : BaseApplication() {
FacebookSdk.sdkInitialize(applicationContext) FacebookSdk.sdkInitialize(applicationContext)
// FacebookSdk.setIsDebugEnabled(true) // FacebookSdk.setIsDebugEnabled(true)
// FacebookSdk.addLoggingBehavior(LoggingBehavior.APP_EVENTS) // FacebookSdk.addLoggingBehavior(LoggingBehavior.APP_EVENTS)
val topic = ConfigHelper.packageName + "_push" val topic = GlobalConfig.PACKAGE_NAME + "_push"
FCMManager.initFirebase(this) FCMManager.initFirebase(this)
FCMManager.subscribeToTopic(topic) FCMManager.subscribeToTopic(topic)
LogEx.logDebug(TAG, "topic=${topic}") LogEx.logDebug(TAG, "topic=${topic}")
...@@ -141,65 +143,43 @@ class MyApplication : BaseApplication() { ...@@ -141,65 +143,43 @@ class MyApplication : BaseApplication() {
private fun initLifeListener() { private fun initLifeListener() {
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks { registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
private var count = 0 private var count = 0
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
ActivityManagerUtils.addActivity(activity)
}
override fun onActivityStarted(activity: Activity) { override fun onActivityStarted(activity: Activity) {
// LogEx.logDebug(TAG, "onActivityStarted")
count++ count++
lastTimeResume = System.currentTimeMillis() lastTimeResume = System.currentTimeMillis()
if (count == 1 && isHotLaunch()) { if (count == 1 && isHotLaunch()) {
val topActivity: Activity? = ActivityManagerUtils.topActivity val topActivity: Activity? = ActivityManagerUtils.topActivity
val flag = if (topActivity == null) {
var flag = if (topActivity == null) {
true true
} else { } else {
ConfigHelper.noLoadingActivities.all { ConfigHelper.noLoadingActivities.all {
!topActivity.localClassName.contains(it, true) !topActivity.localClassName.contains(
it,
true
)
} }
} }
if (flag) {
if (activity.localClassName.contains("AppLovinFullscreenActivity")) { topActivity?.startActivity(
flag = false Intent(
} topActivity,
LogEx.logDebug(TAG, "flag=$flag" + " activity:" + activity.localClassName) Splash2Activity::class.java
).apply {
if (flag && !isInterOpenShowing) { putExtra("isHotLaunch", true)
if (AdmobMaxHelper.isOpenAdLoaded()) { putExtra("type", -1)
})
topActivity?.startActivity(
Intent(
topActivity,
Splash2Activity::class.java
).apply {
putExtra("isHotLaunch", true)
putExtra("type", -1)
})
} else {
topActivity?.startActivity(
Intent(
topActivity,
Splash2Activity::class.java
).apply {
putExtra("isHotLaunch", true)
putExtra("type", -1)
})
}
} }
} }
lastTimeResume = 0 lastTimeResume = 0
} }
override fun onActivityResumed(activity: Activity) { override fun onActivityResumed(activity: Activity) {
// LogEx.logDebug(TAG, "onActivityResumed")
PAUSED_VALUE = 1 PAUSED_VALUE = 1
} }
override fun onActivityPaused(activity: Activity) { override fun onActivityPaused(activity: Activity) {
// LogEx.logDebug(TAG, "onActivityPaused")
PAUSED_VALUE = 2 PAUSED_VALUE = 2
lastTimePause = System.currentTimeMillis() lastTimePause = System.currentTimeMillis()
...@@ -207,13 +187,12 @@ class MyApplication : BaseApplication() { ...@@ -207,13 +187,12 @@ class MyApplication : BaseApplication() {
override fun onActivityStopped(activity: Activity) { override fun onActivityStopped(activity: Activity) {
count-- count--
} }
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
override fun onActivityDestroyed(activity: Activity) { override fun onActivityDestroyed(activity: Activity) {}
ActivityManagerUtils.removeActivity(activity)
}
}) })
} }
......
...@@ -7,7 +7,6 @@ import android.graphics.Color ...@@ -7,7 +7,6 @@ import android.graphics.Color
import android.graphics.Typeface import android.graphics.Typeface
import android.os.Build import android.os.Build
import android.provider.Settings import android.provider.Settings
import android.view.View
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
...@@ -15,7 +14,7 @@ import androidx.fragment.app.Fragment ...@@ -15,7 +14,7 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.base.datarecovery.ads.admob.AdmobBannerUtils import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.ActivityMainBinding import com.base.datarecovery.databinding.ActivityMainBinding
import com.base.datarecovery.fragment.HomeFragment import com.base.datarecovery.fragment.HomeFragment
import com.base.datarecovery.fragment.RecoveryFragment import com.base.datarecovery.fragment.RecoveryFragment
...@@ -63,16 +62,12 @@ class MainActivity : BaseActivity<ActivityMainBinding>() { ...@@ -63,16 +62,12 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight()) binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
AdmobManager.showBannerAd(this,binding.flBanner)
if (!checkStorePermission()) { if (!checkStorePermission()) {
if (dialog == null) { if (dialog == null) {
dialog = showPermissionBottomSheet(launcher) { dialog = showPermissionBottomSheet(launcher) {
binding.flBanner.visibility = View.VISIBLE
AdmobBannerUtils.showCollapsibleBannerAd(this, binding.flBanner)
} }
} }
} else {
binding.flBanner.visibility = View.VISIBLE
AdmobBannerUtils.showCollapsibleBannerAd(this, binding.flBanner)
} }
binding.viewpager2.run { binding.viewpager2.run {
adapter = object : FragmentStateAdapter(this@MainActivity) { adapter = object : FragmentStateAdapter(this@MainActivity) {
......
...@@ -3,7 +3,7 @@ package com.base.datarecovery.activity ...@@ -3,7 +3,7 @@ package com.base.datarecovery.activity
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import androidx.activity.OnBackPressedCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.datarecovery.activity.battery.BatteryInfoAnimationActivity import com.base.datarecovery.activity.battery.BatteryInfoAnimationActivity
import com.base.datarecovery.activity.junkclean.ScanJunkActivity import com.base.datarecovery.activity.junkclean.ScanJunkActivity
...@@ -15,7 +15,7 @@ import com.base.datarecovery.activity.repeat.RepeatAnimationActivity ...@@ -15,7 +15,7 @@ import com.base.datarecovery.activity.repeat.RepeatAnimationActivity
import com.base.datarecovery.activity.screenshot.ScreenShotAnimationActivity import com.base.datarecovery.activity.screenshot.ScreenShotAnimationActivity
import com.base.datarecovery.activity.videomanager.VideoCleanAnimationActivity import com.base.datarecovery.activity.videomanager.VideoCleanAnimationActivity
import com.base.datarecovery.adapter.AppFunctionAdapter import com.base.datarecovery.adapter.AppFunctionAdapter
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject.BATTERY_INFO import com.base.datarecovery.bean.ConstObject.BATTERY_INFO
import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER
import com.base.datarecovery.bean.ConstObject.LARGE_FILE import com.base.datarecovery.bean.ConstObject.LARGE_FILE
...@@ -150,25 +150,17 @@ class ResultActivity : BaseActivity<ActivityLayoutResultBinding>() { ...@@ -150,25 +150,17 @@ class ResultActivity : BaseActivity<ActivityLayoutResultBinding>() {
adapter.removeItem(it) adapter.removeItem(it)
} }
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
val s = AppPreferences.getInstance().getString("isShowBackIntAd", "0").toIntOrNull()
?: 0
if (s == 1) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@ResultActivity,false) {
finishToMain()
}
} else {
finishToMain()
}
}
})
binding.ivBack.setOnClickListener { binding.ivBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
AdmobMaxHelper.admobMaxShowNativeAd(this@ResultActivity, binding.flAd) onBackPressedDispatcher.addCallback {
admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdResultBackInter()) {
finishToMain()
}
}
AdmobManager.showNativeAd(this@ResultActivity, binding.flAd)
} }
override fun onDestroy() { override fun onDestroy() {
......
...@@ -7,13 +7,13 @@ import android.content.Intent ...@@ -7,13 +7,13 @@ import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.net.Uri import android.net.Uri
import androidx.activity.addCallback import androidx.activity.addCallback
import com.base.datarecovery.GlobalConfig
import com.base.datarecovery.bean.ConstObject.fcmNotification import com.base.datarecovery.bean.ConstObject.fcmNotification
import com.base.datarecovery.bean.ConstObject.stayNotification import com.base.datarecovery.bean.ConstObject.stayNotification
import com.base.datarecovery.databinding.ActivitySettingBinding import com.base.datarecovery.databinding.ActivitySettingBinding
import com.base.datarecovery.fcm.FCMManager.subscribeToTopic import com.base.datarecovery.fcm.FCMManager.subscribeToTopic
import com.base.datarecovery.fcm.FCMManager.unsubscribeFromTopic import com.base.datarecovery.fcm.FCMManager.unsubscribeFromTopic
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.service.StayJobService import com.base.datarecovery.service.StayJobService
import com.base.datarecovery.service.StayJobService.Companion.startJob import com.base.datarecovery.service.StayJobService.Companion.startJob
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
...@@ -54,7 +54,7 @@ class SettingActivity : BaseActivity<ActivitySettingBinding>() { ...@@ -54,7 +54,7 @@ class SettingActivity : BaseActivity<ActivitySettingBinding>() {
} }
binding.switchFcmNotification.setOnCheckedChangeListener { buttonView, isChecked -> binding.switchFcmNotification.setOnCheckedChangeListener { buttonView, isChecked ->
fcmNotification = isChecked fcmNotification = isChecked
val topic = "${ConfigHelper.packageName}_push" val topic = "${GlobalConfig.PACKAGE_NAME}_push"
if (isChecked) { if (isChecked) {
subscribeToTopic(topic) subscribeToTopic(topic)
} else { } else {
...@@ -65,7 +65,7 @@ class SettingActivity : BaseActivity<ActivitySettingBinding>() { ...@@ -65,7 +65,7 @@ class SettingActivity : BaseActivity<ActivitySettingBinding>() {
binding.llPrivacy.setOnClickListener { binding.llPrivacy.setOnClickListener {
val intent = Intent( val intent = Intent(
Intent.ACTION_VIEW, Intent.ACTION_VIEW,
Uri.parse(ConfigHelper.privacyPolicy) Uri.parse(GlobalConfig.URL_PRIVACY)
) )
startActivity(intent) startActivity(intent)
// NotificationUtil.sendNotification(this, actionId = ID_WEATHER,"weather") // NotificationUtil.sendNotification(this, actionId = ID_WEATHER,"weather")
......
//package com.base.datarecovery.activity
//
//import android.annotation.SuppressLint
//import android.content.Intent
//import android.graphics.Color
//import android.net.Uri
//import android.text.SpannableString
//import android.text.Spanned
//import android.text.style.UnderlineSpan
//import android.view.View
//import androidx.lifecycle.lifecycleScope
//import com.base.datarecovery.MyApplication
//import com.base.datarecovery.activity.appmanager.AppManagerAnimationActivity
//import com.base.datarecovery.activity.appprocess.AppProcessAnimationActivity
//import com.base.datarecovery.activity.battery.BatteryInfoAnimationActivity
//import com.base.datarecovery.activity.guide.GuideActivity
//import com.base.datarecovery.activity.junkclean.ScanJunkActivity
//import com.base.datarecovery.activity.largefile.LargeFileActivity
//import com.base.datarecovery.activity.largefile.LargeFileAnimationActivity
//import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity
//import com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity
//import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
//import com.base.datarecovery.activity.recovery.FileScanResultActivity
//import com.base.datarecovery.activity.whatsapp.WhatsAppCleanerAnimationActivity
//import com.base.datarecovery.ads.AdmobMaxHelper
//import com.base.datarecovery.bean.ConstObject
//import com.base.datarecovery.bean.ConstObject.ID_APP_MANAGER
//import com.base.datarecovery.bean.ConstObject.ID_APP_PROCESS
//import com.base.datarecovery.bean.ConstObject.ID_BATTERY_INFO
//import com.base.datarecovery.bean.ConstObject.ID_JUNK_CLEAN_PUSH
//import com.base.datarecovery.bean.ConstObject.ID_LARGE_FILE
//import com.base.datarecovery.bean.ConstObject.ID_PRIVACY_SPACE
//import com.base.datarecovery.bean.ConstObject.ID_RECOVERY_DOCUMENTS
//import com.base.datarecovery.bean.ConstObject.ID_RECOVERY_PHOTOS
//import com.base.datarecovery.bean.ConstObject.ID_RECOVERY_VIDEOS
//import com.base.datarecovery.bean.ConstObject.ID_SCREENSHOT_CLEAN
//import com.base.datarecovery.bean.ConstObject.ID_SIMILAR_IMAGE
//import com.base.datarecovery.bean.ConstObject.ID_WHATSAPP_CLEANER
//import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy
//import com.base.datarecovery.bean.ConstObject.isGuide
//import com.base.datarecovery.bean.ConstObject.privacyPinPassword
//import com.base.datarecovery.databinding.ActivitySplashBinding
//import com.base.datarecovery.fcm.CloseNotificationReceiver
//import com.base.datarecovery.fcm.CloseNotificationReceiver.Companion.NotificationId
//import com.base.datarecovery.fcm.NotificationUtil
//import com.base.datarecovery.help.BaseActivity
//import com.base.datarecovery.help.ConfigHelper
//import com.base.datarecovery.service.StayNotificationService.Companion.startStayNotification
//import com.base.datarecovery.utils.AppPreferences
//import com.base.datarecovery.utils.BarUtils
//import com.base.datarecovery.utils.LogEx
//import kotlinx.coroutines.Dispatchers
//import kotlinx.coroutines.Job
//import kotlinx.coroutines.cancel
//import kotlinx.coroutines.delay
//import kotlinx.coroutines.flow.MutableSharedFlow
//import kotlinx.coroutines.flow.SharedFlow
//import kotlinx.coroutines.flow.collectLatest
//import kotlinx.coroutines.isActive
//import kotlinx.coroutines.launch
//import kotlin.random.Random
//
//@SuppressLint("CustomSplashScreen")
//class SplashActivity : BaseActivity<ActivitySplashBinding>() {
//
// private val TAG = "SplashActivity"
// private var job: Job? = null
// private val progress = MutableSharedFlow<Int>()
// private val progressFlow: SharedFlow<Int> = progress
// private var oneClickStart: Boolean = false
// private var actionId = -1
//
//
// override val binding: ActivitySplashBinding by lazy {
// ActivitySplashBinding.inflate(layoutInflater)
// }
//
// override fun initView() {
// BarUtils.setStatusBarLightMode(this, true)
// BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
//
//// if (MyApplication.isInterOpenShowing) {
//// finish()
//// return
//// }
//
// startStayNotification()
// NotificationUtil.stopNotificationHandler()
//
// actionId = intent?.extras?.getInt("actionId") ?: -1
// closeNotification()
//
// progressCollect()
//
// if (ifAgreePrivacy) {
// LogEx.logDebug(TAG, "ifAgreePrivacy=$ifAgreePrivacy")
//
// AdmobMaxHelper.preloadAd(this)
//
// job = startProgress()
// binding.llStart.visibility = View.GONE
// binding.llProgress.visibility = View.VISIBLE
// } else {
// binding.llStart.visibility = View.VISIBLE
// binding.llProgress.visibility = View.GONE
// }
//
// val spannableString = SpannableString("Privacy Policy")
// spannableString.setSpan(
// UnderlineSpan(),
// 0,
// spannableString.length,
// Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
// )
// binding.idTvPrivacyPolicy.text = spannableString
//
// binding.idTvPrivacyPolicy.setOnClickListener {
// val intent = Intent(
// Intent.ACTION_VIEW,
// Uri.parse(ConfigHelper.privacyPolicy)
// )
// startActivity(intent)
// }
//
//
// }
//
// private fun progressCollect() {
// lifecycleScope.launch {
// progressFlow.collectLatest {
// if (it >= 100) {
// job?.cancel()
// LogEx.logDebug(TAG, "jumpNext")
// jumpNext()
// this.cancel()
// }
// }
// }
// }
//
// var jumped: Boolean = false
// private fun jumpNext() {
// if (jumped) {
// return
// }
// jumped = true
// LogEx.logDebug(TAG, "jumpNext actionId=$actionId")
//
// when (actionId) {
// ID_JUNK_CLEAN_PUSH -> {
// startActivity(Intent(this, ScanJunkActivity::class.java))
// }
//
// ID_SIMILAR_IMAGE -> {
// startActivity(Intent(this, PhotoManagerAnimationActivity::class.java))
// }
//
// ID_SCREENSHOT_CLEAN -> {
// startActivity(Intent(this, PhotoManagerAnimationActivity::class.java))
// }
//
// ID_RECOVERY_PHOTOS -> {
// startActivity(Intent(this, FileScanResultActivity::class.java).apply {
// putExtra("ScanType", ConstObject.SCAN_PHOTOS)
// })
// }
//
// ID_RECOVERY_VIDEOS -> {
// startActivity(Intent(this, FileScanResultActivity::class.java).apply {
// putExtra("ScanType", ConstObject.SCAN_VIDEOS)
// })
// }
//
// ID_RECOVERY_DOCUMENTS -> {
// startActivity(Intent(this, FileScanResultActivity::class.java).apply {
// putExtra("ScanType", ConstObject.SCAN_DOCUMENTS)
// })
// }
//
// ID_PRIVACY_SPACE -> {
// if (privacyPinPassword.isNotEmpty()) {
// startActivity(Intent(this, PrivacyPinOneActivity::class.java))
// } else {
// startActivity(Intent(this, PrivacySpaceActivity::class.java).apply {
//
// })
// }
// }
//
// ID_WHATSAPP_CLEANER -> {
// startActivity(Intent(this, WhatsAppCleanerAnimationActivity::class.java))
// }
//
// ID_LARGE_FILE -> {
// startActivity(Intent(this, LargeFileAnimationActivity::class.java))
// }
//
// ID_APP_PROCESS -> {
// startActivity(Intent(this, AppProcessAnimationActivity::class.java))
// }
//
// ID_APP_MANAGER -> {
// startActivity(Intent(this, AppManagerAnimationActivity::class.java))
// }
//
// ID_BATTERY_INFO -> {
// startActivity(Intent(this, BatteryInfoAnimationActivity::class.java))
// }
//
// else -> {
// val isHotLaunch = intent?.extras?.getBoolean("isHotLaunch", false) ?: false
// if (!isHotLaunch) {
// if (!isGuide) {
// startActivity(Intent(this@SplashActivity, GuideActivity::class.java))
// } else {
// startActivity(Intent(this@SplashActivity, MainActivity::class.java))
// }
// }
// }
// }
// finish()
// intent.extras?.clear()
// }
//
// private fun closeNotification() {
// sendBroadcast(Intent(this, CloseNotificationReceiver::class.java).apply {
// this.action = CloseNotificationReceiver.Action
// this.putExtra(NotificationId, actionId)
// })
// }
//
// override fun initListener() {
//
// binding.idTvStart.setOnClickListener {
// if (oneClickStart) {
// return@setOnClickListener
// }
// oneClickStart = true
// ifAgreePrivacy = true
// (application as MyApplication).initApp(true)
// AdmobMaxHelper.preloadAd(this)
// binding.llStart.visibility = View.GONE
// binding.llProgress.visibility = View.VISIBLE
// job = startProgress()
// }
// }
//
// private var processTime = 0L
// private var outTimeAdStart = false
// private fun startProgress() = lifecycleScope.launch(Dispatchers.Main) {
// LogEx.logDebug(TAG, "startProgress")
// while (isActive) {
// val value = binding.pb.progress + 2
// binding.pb.setProgress(value, true)
// progress.emit(value)
// val delayTime = 450L
// delay(delayTime)
// processTime += delayTime
// if (processTime >= 900L) {
// if (!outTimeAdStart) {
// outTimeAdStart = true
// outTimeAd()
// }
// }
// }
// }
//
//
// private fun outTimeAd() {
// LogEx.logDebug(TAG, "outTimeAd")
// var loaded: Boolean = true
// AdmobMaxHelper.admobMaxShowOpenAd(this, showBeforeAction = { flag ->
// loaded = flag
// job?.cancel()
// }) {
// val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt()
// if (sp == 1 && !loaded) {
// AdmobMaxHelper.admobMaxShowInterstitialAd(this, false) {
// binding.pb.progress = 100
// jumpNext()
// }
// } else {
// binding.pb.progress = 100
// jumpNext()
// }
// }
// }
//
// override fun onResume() {
// super.onResume()
// LogEx.logDebug(TAG, "onResume")
// if (ifAgreePrivacy && job?.isActive == false) {
// job = startProgress()
// }
// }
//
// override fun onPause() {
// super.onPause()
// job?.cancel()
// LogEx.logDebug(TAG, "onPause")
// }
//
//
//}
\ No newline at end of file
...@@ -8,7 +8,7 @@ import android.os.BatteryManager ...@@ -8,7 +8,7 @@ import android.os.BatteryManager
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.datarecovery.activity.ResultActivity import com.base.datarecovery.activity.ResultActivity
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject.BATTERY_INFO import com.base.datarecovery.bean.ConstObject.BATTERY_INFO
import com.base.datarecovery.databinding.ActivityBatteryBinding import com.base.datarecovery.databinding.ActivityBatteryBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
...@@ -57,18 +57,14 @@ class BatteryActivity : BaseActivity<ActivityBatteryBinding>() { ...@@ -57,18 +57,14 @@ class BatteryActivity : BaseActivity<ActivityBatteryBinding>() {
// } // }
// } // }
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.flAd, 2) AdmobManager.showNativeAd(this, binding.flAd)
} }
override fun initListener() { override fun initListener() {
super.initListener() super.initListener()
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
showExitFunctionDialog { showAd -> showExitFunctionDialog {
if (showAd) { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@BatteryActivity) {
finishToMain()
}
} else {
finishToMain() finishToMain()
} }
} }
...@@ -77,10 +73,12 @@ class BatteryActivity : BaseActivity<ActivityBatteryBinding>() { ...@@ -77,10 +73,12 @@ class BatteryActivity : BaseActivity<ActivityBatteryBinding>() {
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.tvFinish.setOnClickListener { binding.tvFinish.setOnClickListener {
startActivity(Intent(this, ResultActivity::class.java).apply { admobMaxShowInterstitialAd(true) {
putExtra("from", BATTERY_INFO) startActivity(Intent(this, ResultActivity::class.java).apply {
}) putExtra("from", BATTERY_INFO)
finish() })
finish()
}
} }
} }
...@@ -99,7 +97,8 @@ class BatteryActivity : BaseActivity<ActivityBatteryBinding>() { ...@@ -99,7 +97,8 @@ class BatteryActivity : BaseActivity<ActivityBatteryBinding>() {
val currentNow = mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW) val currentNow = mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW)
binding.tvElectric.text = "${getFirstThreeDigits(currentNow * 100)} mA" binding.tvElectric.text = "${getFirstThreeDigits(currentNow * 100)} mA"
val currentAverage: Int = mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE) val currentAverage: Int =
mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE)
binding.tvCurrentAverage.text = "${getFirstThreeDigits(currentAverage * 100)} mA" binding.tvCurrentAverage.text = "${getFirstThreeDigits(currentAverage * 100)} mA"
val hm = (capacity.toFloat() / getFirstThreeDigits(currentNow * 100).toFloat()) val hm = (capacity.toFloat() / getFirstThreeDigits(currentNow * 100).toFloat())
......
...@@ -6,7 +6,7 @@ import android.view.View ...@@ -6,7 +6,7 @@ import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.ActivityBatteryInfoAnimationBinding import com.base.datarecovery.databinding.ActivityBatteryInfoAnimationBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
...@@ -24,7 +24,7 @@ class BatteryInfoAnimationActivity : BaseActivity<ActivityBatteryInfoAnimationBi ...@@ -24,7 +24,7 @@ class BatteryInfoAnimationActivity : BaseActivity<ActivityBatteryInfoAnimationBi
override fun initView() { override fun initView() {
resumeLottie() resumeLottie()
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative, isShowAdNative = AdmobManager.isShowAdNativeBottom())
} }
override fun initListener() { override fun initListener() {
...@@ -64,7 +64,7 @@ class BatteryInfoAnimationActivity : BaseActivity<ActivityBatteryInfoAnimationBi ...@@ -64,7 +64,7 @@ class BatteryInfoAnimationActivity : BaseActivity<ActivityBatteryInfoAnimationBi
binding.lottieCompleted.playAnimation() binding.lottieCompleted.playAnimation()
binding.tv.text = "Completed!" binding.tv.text = "Completed!"
delay(1000) delay(1000)
AdmobMaxHelper.admobMaxShowInterstitialAd(this@BatteryInfoAnimationActivity) { admobMaxShowInterstitialAd {
binding.lottie.clearAnimation() binding.lottie.clearAnimation()
startActivity(Intent(this@BatteryInfoAnimationActivity, BatteryActivity::class.java)) startActivity(Intent(this@BatteryInfoAnimationActivity, BatteryActivity::class.java))
finish() finish()
......
package com.base.datarecovery.activity.guide
import com.base.datarecovery.R
import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.FragmentFullScreenBinding
import com.base.datarecovery.help.BaseFragment
class AdFragment : BaseFragment<FragmentFullScreenBinding>() {
override val binding: FragmentFullScreenBinding by lazy {
FragmentFullScreenBinding.inflate(layoutInflater)
}
var page: Int = 2
override fun setView() {
binding.idClose.setOnClickListener {
(requireActivity() as FirstGuestActivity).setPosition(3)
}
AdmobManager.showNativeAd(requireActivity(), binding.idFlNative, layout = R.layout.native_layout_full)
}
}
\ No newline at end of file
package com.base.datarecovery.activity.guide package com.base.datarecovery.activity.guide
import android.graphics.Color
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.base.datarecovery.R import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.databinding.ActivityGuideBinding import com.base.datarecovery.databinding.ActivityGuideBinding
import com.base.datarecovery.fragment.GuideFragment
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
import com.zhpan.indicator.enums.IndicatorSlideMode
import com.zhpan.indicator.enums.IndicatorStyle
class GuideActivity : BaseActivity<ActivityGuideBinding>() {
private val page1: GuideFragment by lazy { class FirstGuestActivity : BaseActivity<ActivityGuideBinding>() {
GuideFragment().apply { page = 1 } override val binding: ActivityGuideBinding by lazy {
ActivityGuideBinding.inflate(layoutInflater)
} }
private val page2: GuideFragment by lazy { private val page1: GuestFragment by lazy {
GuideFragment().apply { page = 2 } GuestFragment().apply { page = 0 }
} }
private val fragments by lazy { private val page2: GuestFragment by lazy {
mutableListOf(page1, page2) GuestFragment().apply { page = 1 }
} }
private val adPage: AdFragment by lazy {
AdFragment().apply { page = 2 }
override val binding: ActivityGuideBinding by lazy {
ActivityGuideBinding.inflate(layoutInflater)
} }
private val page3: GuestFragment by lazy {
fun setPosition(position: Int) { GuestFragment().apply { page = 3 }
binding.viewpager2.currentItem = position }
private val page4: GuestFragment by lazy {
GuestFragment().apply { page = 4 }
}
private val fragments by lazy {
mutableListOf(page1, page2, adPage, page3, page4)
} }
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) if (!AdmobManager.checkNative()) {
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) fragments.removeAt(2)
binding.viewpager2.run { }
adapter = object : FragmentStateAdapter(this@GuideActivity) {
binding.idViewPager.run {
adapter = object : FragmentStateAdapter(this@FirstGuestActivity) {
override fun getItemCount(): Int { override fun getItemCount(): Int {
return fragments.size return fragments.size
} }
...@@ -51,21 +50,15 @@ class GuideActivity : BaseActivity<ActivityGuideBinding>() { ...@@ -51,21 +50,15 @@ class GuideActivity : BaseActivity<ActivityGuideBinding>() {
} }
} }
} }
binding.viewpager2.registerOnPageChangeCallback(object : binding.idViewPager.registerOnPageChangeCallback(object :
ViewPager2.OnPageChangeCallback() { ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
} }
}) })
val normalColor = ContextCompat.getColor(this, R.color.color_cccccc)
val selectedColor = ContextCompat.getColor(this, R.color.color_4f86eb)
binding.indicatorView
.setSliderColor(normalColor, selectedColor)
.setSliderWidth(resources.getDimension(R.dimen.dp_9))
.setSliderHeight(resources.getDimension(R.dimen.dp_9))
.setSlideMode(IndicatorSlideMode.WORM)
.setIndicatorStyle(IndicatorStyle.CIRCLE)
.setupWithViewPager(binding.viewpager2)
} }
fun setPosition(position: Int) {
binding.idViewPager.currentItem = position
}
} }
\ No newline at end of file
package com.base.datarecovery.activity.guide
import android.content.Intent
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.view.updatePadding
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.base.datarecovery.R
import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.SelectBean
import com.base.datarecovery.databinding.ActivityLayoutFirstSelectBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.view.DialogViews.showFeature
class FirstSelectActivity : BaseActivity<ActivityLayoutFirstSelectBinding>() {
override val binding: ActivityLayoutFirstSelectBinding by lazy {
ActivityLayoutFirstSelectBinding.inflate(layoutInflater)
}
private val mList by lazy {
mutableListOf(
SelectBean(R.mipmap.icon_image, "Photo"),
SelectBean(R.mipmap.icon_video, "Video"),
SelectBean(R.mipmap.icon_voice, "Audio"),
SelectBean(R.mipmap.icon_document, "Document")
)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.idRl.run {
layoutManager = LinearLayoutManager(this@FirstSelectActivity)
adapter = mAdapter
}
AdmobManager.showNativeAd(this, binding.idFlAd)
}
override fun initListener() {
binding.idContinue.setOnClickListener {
val s = mList.filter { it.isSelect }
if (s.isNotEmpty()) {
startActivity(Intent(this, FirstGuestActivity::class.java))
finish()
} else {
showFeature()
}
}
}
var isshow = 0
private val mAdapter by lazy {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val ivImage: ImageView
val tvName: TextView
val ivSelect: ImageView
init {
ivImage = view.findViewById(R.id.id_icon)
tvName = view.findViewById(R.id.id_tv_name)
ivSelect = view.findViewById(R.id.id_img_select)
}
}
object : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ViewHolder {
val view = LayoutInflater.from(this@FirstSelectActivity)
.inflate(R.layout.item_layout_select_type, parent, false)
return ViewHolder(view)
}
override fun getItemCount() = mList.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = mList[position]
holder.ivImage.setImageResource(item.imageRes)
holder.tvName.text = item.name
holder.itemView.setOnClickListener {
item.isSelect = !item.isSelect
holder.itemView.isSelected = item.isSelect
holder.ivSelect.isSelected = item.isSelect
isshow++
if (isshow < 2) {
AdmobManager.showNativeAd(this@FirstSelectActivity, binding.idFlAd)
}
}
}
}
}
}
\ No newline at end of file
package com.base.datarecovery.activity.guide
import android.annotation.SuppressLint
import android.content.Intent
import android.view.View
import androidx.core.view.isVisible
import com.base.datarecovery.R
import com.base.datarecovery.activity.MainActivity
import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject
import com.base.datarecovery.databinding.FragmentGuestBinding
import com.base.datarecovery.help.BaseFragment
class GuestFragment : BaseFragment<FragmentGuestBinding>() {
var page: Int = 0
override val binding: FragmentGuestBinding by lazy {
FragmentGuestBinding.inflate(layoutInflater)
}
@SuppressLint("SetTextI18n")
override fun setView() {
if (page == 0) {
binding.idFlNative.visibility = View.VISIBLE
AdmobManager.showNativeAd(
requireActivity(),
binding.idFlNative
)
} else {
binding.idFlNative.visibility = View.INVISIBLE
}
binding.root.postDelayed({
binding.idTvSkip.isVisible = true
}, 2000)
when (page) {
0 -> {
binding.idImg01.setImageResource(R.mipmap.jindu1)
binding.idImg02.setImageResource(R.mipmap.yuan1)
binding.idImg03.setImageResource(R.mipmap.yuan1)
binding.idImg04.setImageResource(R.mipmap.yuan1)
binding.iv.setImageResource(R.mipmap.yindao1)
binding.idTrip1.text = "Bring Your Memories Back"
binding.idTrip2.text = "Recover Deleted Photos and Videos"
}
1 -> {
binding.iv.setImageResource(R.mipmap.yindao2)
binding.idTrip1.text = "Fast Recovery, No Stress"
binding.idTrip2.text = "Quickly scan and restore your files with afew taps"
binding.idImg01.setImageResource(R.mipmap.yuan1)
binding.idImg02.setImageResource(R.mipmap.jindu1)
binding.idImg03.setImageResource(R.mipmap.yuan1)
binding.idImg04.setImageResource(R.mipmap.yuan1)
}
2 -> {
binding.iv.setImageResource(R.mipmap.yindao3)
binding.idTrip1.text = "Everything You Need,Recovered"
binding.idTrip2.text =
"Search, preview, and recover various other files-all in one place"
binding.idImg01.setImageResource(R.mipmap.yuan1)
binding.idImg02.setImageResource(R.mipmap.yuan1)
binding.idImg03.setImageResource(R.mipmap.jindu1)
binding.idImg04.setImageResource(R.mipmap.yuan1)
}
3 -> {
binding.iv.setImageResource(R.mipmap.yindao3)
binding.idTrip1.text = "Everything You Need,Recovered"
binding.idTrip2.text =
"Search, preview, and recover various other files-all in one place"
binding.idImg01.setImageResource(R.mipmap.yuan1)
binding.idImg02.setImageResource(R.mipmap.yuan1)
binding.idImg03.setImageResource(R.mipmap.jindu1)
binding.idImg04.setImageResource(R.mipmap.yuan1)
}
4 -> {
binding.iv.setImageResource(R.mipmap.yindao4)
binding.idTrip1.text = "All-in-One Solution"
binding.idTrip2.text = "Recover, manage, and organize your files—all in one intuitive interface."
binding.idImg01.setImageResource(R.mipmap.yuan1)
binding.idImg02.setImageResource(R.mipmap.yuan1)
binding.idImg03.setImageResource(R.mipmap.yuan1)
binding.idImg04.setImageResource(R.mipmap.jindu1)
}
}
binding.idTvNext.setOnClickListener {
if (page == 0) {
(requireActivity() as FirstGuestActivity).setPosition(1)
} else if (page == 1) {
(requireActivity() as FirstGuestActivity).setPosition(2)
} else if (page == 2) {
(requireActivity() as FirstGuestActivity).setPosition(3)
} else if (page == 3) {
(requireActivity() as FirstGuestActivity).setPosition(4)
} else {
jumpNext()
}
}
binding.idTvSkip.setOnClickListener {
jumpNext()
}
}
private fun jumpNext() {
ConstObject.isGuide = true
(requireActivity() as FirstGuestActivity).admobMaxShowInterstitialAd {
startActivity(Intent(requireContext(), MainActivity::class.java))
}
// val showAd = SPUtils.getInstance().getString("isShowGuideAd", "0")?.toInt()
// if (showAd == 1) {
//
// } else {
// if (!ConfigHelper.ifGuest) {
// startActivity(Intent(requireContext(), DeviceScanActivity::class.java))
// requireActivity().finish()
// }else{
// startActivity(Intent(requireContext(), MainActivity::class.java))
// }
// }
}
}
\ No newline at end of file
...@@ -5,14 +5,14 @@ import android.content.Intent ...@@ -5,14 +5,14 @@ import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Environment import android.os.Environment
import android.view.View import android.view.View
import androidx.activity.OnBackPressedCallback import androidx.activity.addCallback
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.activity.ResultActivity import com.base.datarecovery.activity.ResultActivity
import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity
import com.base.datarecovery.adapter.JunkExpandAdapter import com.base.datarecovery.adapter.JunkExpandAdapter
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ChildBean import com.base.datarecovery.bean.ChildBean
import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER
import com.base.datarecovery.databinding.ActivityLayoutCleanJunkBinding import com.base.datarecovery.databinding.ActivityLayoutCleanJunkBinding
...@@ -20,7 +20,6 @@ import com.base.datarecovery.help.BaseActivity ...@@ -20,7 +20,6 @@ import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.KotlinExt.toFormatSize import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.help.PermissionHelp.checkStorePermission import com.base.datarecovery.help.PermissionHelp.checkStorePermission
import com.base.datarecovery.help.PermissionHelp.requestStorePermission import com.base.datarecovery.help.PermissionHelp.requestStorePermission
import com.base.datarecovery.utils.AppPreferences
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.utils.MediaStoreUtils import com.base.datarecovery.utils.MediaStoreUtils
import com.base.datarecovery.view.DialogViews.showExitFunctionDialog import com.base.datarecovery.view.DialogViews.showExitFunctionDialog
...@@ -48,11 +47,11 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { ...@@ -48,11 +47,11 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
// binding.root.updatePadding(top = BarUtils.getStatusBarHeight()) binding.llTop.updatePadding(top = BarUtils.getStatusBarHeight())
AdmobManager.showNativeAd(this, binding.idFlNative)
junkExpandAdapter = JunkExpandAdapter { size -> junkExpandAdapter = JunkExpandAdapter { size ->
if (size == 0L) { if (size == 0L) {
binding.tvBtn.text = "Got it" binding.tvBtn.text = "Go it"
binding.tvSize.text = "0" binding.tvSize.text = "0"
binding.tvUnit.text = "B" binding.tvUnit.text = "B"
} else { } else {
...@@ -65,7 +64,6 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { ...@@ -65,7 +64,6 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
if (junkExpandAdapter.getAllChildItemCount() == 0) { if (junkExpandAdapter.getAllChildItemCount() == 0) {
binding.tvBtn.visibility = View.VISIBLE binding.tvBtn.visibility = View.VISIBLE
binding.tvBtn.isEnabled = true binding.tvBtn.isEnabled = true
binding.llTwoBtn.visibility = View.GONE
} else { } else {
binding.tvBtn.isVisible = true binding.tvBtn.isVisible = true
binding.tvBtn.isEnabled = true binding.tvBtn.isEnabled = true
...@@ -92,62 +90,37 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { ...@@ -92,62 +90,37 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
binding.flFanhui.setOnClickListener { binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) { onBackPressedDispatcher.addCallback {
override fun handleOnBackPressed() { showExitFunctionDialog {
showExitFunctionDialog { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
if (it) { finishToMain()
AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleanJunkActivity, false) {
finishToMain()
}
} else {
finishToMain()
}
} }
} }
}
})
binding.tvBtn.setOnClickListener { binding.tvBtn.setOnClickListener {
when (binding.tvBtn.text) { when (binding.tvBtn.text) {
"Got it" -> { "Go it" -> {
val showJunkBtnAd = AppPreferences.getInstance().getString("isGotItplayAd", "0").toInt() admobMaxShowInterstitialAd(true) {
if (showJunkBtnAd == 1) { startActivity(
AdmobMaxHelper.admobMaxShowInterstitialAd(this) { Intent(
startActivity(Intent(this@CleanJunkActivity, ResultActivity::class.java).apply { this@CleanJunkActivity,
ResultActivity::class.java
).apply {
putExtra("clean_size", JUNK_CLEANER) putExtra("clean_size", JUNK_CLEANER)
putExtra("from", 0) putExtra("from", 0)
}) })
finish()
}
} else {
startActivity(Intent(this@CleanJunkActivity, ResultActivity::class.java).apply {
putExtra("clean_size", JUNK_CLEANER)
putExtra("from", 0)
})
finish() finish()
} }
} }
else -> { else -> {
val showJunkBtnAd = AppPreferences.getInstance().getString("isGotItplayAd", "0").toInt() admobMaxShowInterstitialAd(true) {
if (showJunkBtnAd == 1) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this) {
startActivity(
Intent(this, CleaningActivity::class.java).apply {
val list = junkExpandAdapter.getChoosePath()
putExtra("type",JUNK_CLEANER)
putExtra("list", list.map { it.chilepath }.toTypedArray())
putExtra("size", list.sumOf { it.childSize })
}
)
finish()
}
} else {
startActivity( startActivity(
Intent(this, CleaningActivity::class.java).apply { Intent(this, CleaningActivity::class.java).apply {
val list = junkExpandAdapter.getChoosePath() val list = junkExpandAdapter.getChoosePath()
putExtra("type",JUNK_CLEANER) putExtra("type", JUNK_CLEANER)
putExtra("list", list.map { it.chilepath }.toTypedArray()) putExtra("list", list.map { it.chilepath }.toTypedArray())
putExtra("size", list.sumOf { it.childSize }) putExtra("size", list.sumOf { it.childSize })
} }
...@@ -159,31 +132,6 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { ...@@ -159,31 +132,6 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
} }
binding.tvGotIt2.setOnClickListener {
val showJunkBtnAd = AppPreferences.getInstance().getString("isGotItplayAd", "0").toInt()
if (showJunkBtnAd == 1) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this) {
startActivity(Intent(this@CleanJunkActivity, ResultActivity::class.java).apply {
putExtra("clean_size", JUNK_CLEANER)
putExtra("from", 0)
})
finish()
}
} else {
startActivity(Intent(this@CleanJunkActivity, ResultActivity::class.java).apply {
putExtra("clean_size", JUNK_CLEANER)
putExtra("from", 0)
})
finish()
}
}
binding.tvDeepScan.setOnClickListener {
startActivity(Intent(this, PhotoManagerAnimationActivity::class.java).apply {
putExtra("tittle", "Deep Scan")
})
finish()
}
} }
...@@ -225,7 +173,9 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { ...@@ -225,7 +173,9 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
list.clear() list.clear()
async { async {
val apk = MediaStoreUtils.queryFiles(this@CleanJunkActivity, MediaStoreUtils.FileType.APK) ?: listOf() val apk =
MediaStoreUtils.queryFiles(this@CleanJunkActivity, MediaStoreUtils.FileType.APK)
?: listOf()
apk.forEach { l -> apk.forEach { l ->
totalSize += l.size totalSize += l.size
list.add(ChildBean(R.mipmap.apk, l.name, l.path, l.size)) list.add(ChildBean(R.mipmap.apk, l.name, l.path, l.size))
...@@ -244,7 +194,9 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { ...@@ -244,7 +194,9 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
list.clear() list.clear()
async { async {
val temp = MediaStoreUtils.queryFiles(this@CleanJunkActivity, MediaStoreUtils.FileType.TMP) ?: listOf() val temp =
MediaStoreUtils.queryFiles(this@CleanJunkActivity, MediaStoreUtils.FileType.TMP)
?: listOf()
temp.forEach { l -> temp.forEach { l ->
totalSize += l.size totalSize += l.size
list.add(ChildBean(R.mipmap.temp_clean, l.name, l.path, l.size)) list.add(ChildBean(R.mipmap.temp_clean, l.name, l.path, l.size))
...@@ -262,7 +214,9 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { ...@@ -262,7 +214,9 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
list.clear() list.clear()
async { async {
val log = MediaStoreUtils.queryFiles(this@CleanJunkActivity, MediaStoreUtils.FileType.LOG) ?: listOf() val log =
MediaStoreUtils.queryFiles(this@CleanJunkActivity, MediaStoreUtils.FileType.LOG)
?: listOf()
log.forEach { l -> log.forEach { l ->
totalSize += l.size totalSize += l.size
list.add(ChildBean(R.mipmap.log_clean, l.name, l.path, l.size)) list.add(ChildBean(R.mipmap.log_clean, l.name, l.path, l.size))
...@@ -290,12 +244,14 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { ...@@ -290,12 +244,14 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
it.cancel() it.cancel()
} }
} }
fun findEmptyFolders(): List<File> { fun findEmptyFolders(): List<File> {
val externalStorageDir = Environment.getExternalStorageDirectory() val externalStorageDir = Environment.getExternalStorageDirectory()
val filters = arrayOf("/storage/emulated/0/Android/data", "/storage/emulated/0/Android/obb") val filters = arrayOf("/storage/emulated/0/Android/data", "/storage/emulated/0/Android/obb")
val emptyFolders = getAllEmptyFolders(externalStorageDir, filters) val emptyFolders = getAllEmptyFolders(externalStorageDir, filters)
return emptyFolders return emptyFolders
} }
private fun getAllEmptyFolders(root: File, filters: Array<String>): List<File> { private fun getAllEmptyFolders(root: File, filters: Array<String>): List<File> {
return root.walk() return root.walk()
.filter { .filter {
......
...@@ -9,7 +9,7 @@ import androidx.activity.addCallback ...@@ -9,7 +9,7 @@ import androidx.activity.addCallback
import androidx.core.animation.doOnEnd import androidx.core.animation.doOnEnd
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.datarecovery.activity.ResultActivity import com.base.datarecovery.activity.ResultActivity
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.ActivityLayoutCleanupingBinding import com.base.datarecovery.databinding.ActivityLayoutCleanupingBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
...@@ -41,7 +41,7 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() { ...@@ -41,7 +41,7 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() {
override fun initView() { override fun initView() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight()) binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative, isShowAdNative = AdmobManager.isShowAdNativeBottom())
MainScope().launch(Dispatchers.IO) { MainScope().launch(Dispatchers.IO) {
try { try {
listPath.forEach { listPath.forEach {
...@@ -81,14 +81,12 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() { ...@@ -81,14 +81,12 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() {
binding.idTvJd.text = "${it.animatedValue as Int}" binding.idTvJd.text = "${it.animatedValue as Int}"
} }
doOnEnd { doOnEnd {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleaningActivity,false) { startActivity(
startActivity( Intent(this@CleaningActivity, ResultActivity::class.java)
Intent(this@CleaningActivity, ResultActivity::class.java) .putExtra("from", type)
.putExtra("from", type) .putExtra("clean_size", intentSize)
.putExtra("clean_size", intentSize) )
) finish()
finish()
}
} }
start() start()
} }
......
...@@ -10,7 +10,7 @@ import android.widget.Toast ...@@ -10,7 +10,7 @@ import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.ActivityLayoutScanJunkBinding import com.base.datarecovery.databinding.ActivityLayoutScanJunkBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
...@@ -32,7 +32,7 @@ class ScanJunk2Activity : BaseActivity<ActivityLayoutScanJunkBinding>() { ...@@ -32,7 +32,7 @@ class ScanJunk2Activity : BaseActivity<ActivityLayoutScanJunkBinding>() {
LogEx.logDebug(TAG,"ScanJunkActivity initView") LogEx.logDebug(TAG,"ScanJunkActivity initView")
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight()) binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative, isShowAdNative = AdmobManager.isShowAdNativeBottom())
} }
...@@ -123,7 +123,7 @@ class ScanJunk2Activity : BaseActivity<ActivityLayoutScanJunkBinding>() { ...@@ -123,7 +123,7 @@ class ScanJunk2Activity : BaseActivity<ActivityLayoutScanJunkBinding>() {
animator2?.cancel() animator2?.cancel()
animator3?.cancel() animator3?.cancel()
delay(1000) delay(1000)
AdmobMaxHelper.admobMaxShowInterstitialAd(this@ScanJunk2Activity) { admobMaxShowInterstitialAd {
startActivity(Intent(this@ScanJunk2Activity, CleanJunkActivity::class.java)) startActivity(Intent(this@ScanJunk2Activity, CleanJunkActivity::class.java))
finish() finish()
} }
......
...@@ -10,8 +10,7 @@ import android.widget.Toast ...@@ -10,8 +10,7 @@ import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.ads.AdmobMaxHelper.admobMaxShowInterstitialAd
import com.base.datarecovery.databinding.ActivityLayoutScanJunkBinding import com.base.datarecovery.databinding.ActivityLayoutScanJunkBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.PermissionHelp.checkStorePermission import com.base.datarecovery.help.PermissionHelp.checkStorePermission
...@@ -39,7 +38,7 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() { ...@@ -39,7 +38,7 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
LogEx.logDebug(TAG,"ScanJunkActivity initView") LogEx.logDebug(TAG,"ScanJunkActivity initView")
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight()) binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative, isShowAdNative = AdmobManager.isShowAdNativeBottom())
if (!checkStorePermission()) { if (!checkStorePermission()) {
showGerPermission(tittle = "Storage Permission Required", 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.", 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.",
...@@ -145,7 +144,7 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() { ...@@ -145,7 +144,7 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
animator2?.cancel() animator2?.cancel()
animator3?.cancel() animator3?.cancel()
delay(1000) delay(1000)
admobMaxShowInterstitialAd(this@ScanJunkActivity) { admobMaxShowInterstitialAd {
startActivity(Intent(this@ScanJunkActivity, CleanJunkActivity::class.java)) startActivity(Intent(this@ScanJunkActivity, CleanJunkActivity::class.java))
finish() finish()
} }
......
...@@ -7,7 +7,7 @@ import androidx.core.view.isVisible ...@@ -7,7 +7,7 @@ import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.activity.junkclean.CleaningActivity import com.base.datarecovery.activity.junkclean.CleaningActivity
import com.base.datarecovery.adapter.LargeFileAdapter import com.base.datarecovery.adapter.LargeFileAdapter
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject import com.base.datarecovery.bean.ConstObject
import com.base.datarecovery.bean.ConstObject.SELECT_FILE_ALL import com.base.datarecovery.bean.ConstObject.SELECT_FILE_ALL
import com.base.datarecovery.bean.ConstObject.SELECT_FILE_AUDIO import com.base.datarecovery.bean.ConstObject.SELECT_FILE_AUDIO
...@@ -43,7 +43,7 @@ class LargeFileActivity : BaseActivity<ActivityLargeFileBinding>() { ...@@ -43,7 +43,7 @@ class LargeFileActivity : BaseActivity<ActivityLargeFileBinding>() {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun initView() { override fun initView() {
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative)
largeFileAdapter = LargeFileAdapter(itemClick = {}, selectClick = { largeFileAdapter = LargeFileAdapter(itemClick = {}, selectClick = {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
binding.tvDelete.isEnabled = true binding.tvDelete.isEnabled = true
...@@ -72,12 +72,8 @@ class LargeFileActivity : BaseActivity<ActivityLargeFileBinding>() { ...@@ -72,12 +72,8 @@ class LargeFileActivity : BaseActivity<ActivityLargeFileBinding>() {
override fun initListener() { override fun initListener() {
super.initListener() super.initListener()
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
showExitFunctionDialog { show -> showExitFunctionDialog {
if (show) { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@LargeFileActivity, false) {
finishToMain()
}
} else {
finishToMain() finishToMain()
} }
} }
...@@ -139,7 +135,8 @@ class LargeFileActivity : BaseActivity<ActivityLargeFileBinding>() { ...@@ -139,7 +135,8 @@ class LargeFileActivity : BaseActivity<ActivityLargeFileBinding>() {
} }
private fun deleteFiles() { private fun deleteFiles() {
val list = largeFileAdapter.getSelectData() admobMaxShowInterstitialAd (true){
val list = largeFileAdapter.getSelectData()
// runCatching { // runCatching {
// list.forEach { bean -> // list.forEach { bean ->
// File(bean.path).delete() // File(bean.path).delete()
...@@ -153,12 +150,13 @@ class LargeFileActivity : BaseActivity<ActivityLargeFileBinding>() { ...@@ -153,12 +150,13 @@ class LargeFileActivity : BaseActivity<ActivityLargeFileBinding>() {
// }) // })
// finish() // finish()
// } // }
startActivity(Intent(this, CleaningActivity::class.java).apply { startActivity(Intent(this, CleaningActivity::class.java).apply {
putExtra("list",list.map { it.path }.toTypedArray()) putExtra("list",list.map { it.path }.toTypedArray())
putExtra("type", ConstObject.LARGE_FILE) putExtra("type", ConstObject.LARGE_FILE)
} }
) )
finish() finish()
}
} }
private fun initData() = lifecycleScope.launch(Dispatchers.IO) { private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
......
...@@ -5,7 +5,7 @@ import android.view.View ...@@ -5,7 +5,7 @@ import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.ActivityLargeFileAnimationBinding import com.base.datarecovery.databinding.ActivityLargeFileAnimationBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
...@@ -22,7 +22,7 @@ class LargeFileAnimationActivity : BaseActivity<ActivityLargeFileAnimationBindin ...@@ -22,7 +22,7 @@ class LargeFileAnimationActivity : BaseActivity<ActivityLargeFileAnimationBindin
private var job: Job? = null private var job: Job? = null
override fun initView() { override fun initView() {
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative, isShowAdNative = AdmobManager.isShowAdNativeBottom())
} }
override fun initListener() { override fun initListener() {
...@@ -40,7 +40,7 @@ class LargeFileAnimationActivity : BaseActivity<ActivityLargeFileAnimationBindin ...@@ -40,7 +40,7 @@ class LargeFileAnimationActivity : BaseActivity<ActivityLargeFileAnimationBindin
binding.lottieCompleted.playAnimation() binding.lottieCompleted.playAnimation()
binding.tv.text = "Completed!" binding.tv.text = "Completed!"
delay(1000) delay(1000)
AdmobMaxHelper.admobMaxShowInterstitialAd(this@LargeFileAnimationActivity) { admobMaxShowInterstitialAd {
startActivity(Intent(this@LargeFileAnimationActivity, LargeFileActivity::class.java)) startActivity(Intent(this@LargeFileAnimationActivity, LargeFileActivity::class.java))
finish() finish()
} }
......
...@@ -9,12 +9,12 @@ import android.view.ViewGroup ...@@ -9,12 +9,12 @@ import android.view.ViewGroup
import android.view.animation.LinearInterpolator import android.view.animation.LinearInterpolator
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.activity.OnBackPressedCallback import androidx.activity.addCallback
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ListBean import com.base.datarecovery.bean.ListBean
import com.base.datarecovery.bean.WeatherBean import com.base.datarecovery.bean.WeatherBean
import com.base.datarecovery.databinding.ActivityWeatherBinding import com.base.datarecovery.databinding.ActivityWeatherBinding
...@@ -32,21 +32,20 @@ class WeatherInterface : BaseActivity<ActivityWeatherBinding>() { ...@@ -32,21 +32,20 @@ class WeatherInterface : BaseActivity<ActivityWeatherBinding>() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.idBack.updatePadding(top = BarUtils.getStatusBarHeight()) binding.idBack.updatePadding(top = BarUtils.getStatusBarHeight())
getData() getData()
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative, isShowAdNative = AdmobManager.isShowAdNativeBottom())
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.idFlAd,1)
} }
override fun initListener() { override fun initListener() {
binding.idBack.setOnClickListener { binding.idBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) { onBackPressedDispatcher.addCallback {
override fun handleOnBackPressed() { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@WeatherInterface){
finishToMain() finishToMain()
} }
} }
})
} }
private fun getData() { private fun getData() {
...@@ -58,8 +57,9 @@ class WeatherInterface : BaseActivity<ActivityWeatherBinding>() { ...@@ -58,8 +57,9 @@ class WeatherInterface : BaseActivity<ActivityWeatherBinding>() {
WeatherUtils.requestWeatherData() WeatherUtils.requestWeatherData()
} }
binding.root.postDelayed({ binding.root.postDelayed({
AdmobMaxHelper.admobMaxShowInterstitialAd(this@WeatherInterface){ admobMaxShowInterstitialAd{
binding.idFlLoading.isVisible = false binding.idFlLoading.isVisible = false
AdmobManager.showNativeAd(this, binding.idFlAd)
} }
}, Random.nextLong(2000, 4000)) }, Random.nextLong(2000, 4000))
ValueAnimator.ofFloat(0f, 360f).apply { ValueAnimator.ofFloat(0f, 360f).apply {
......
...@@ -2,8 +2,8 @@ package com.base.datarecovery.activity.newfunction ...@@ -2,8 +2,8 @@ package com.base.datarecovery.activity.newfunction
import android.text.TextUtils import android.text.TextUtils
import com.base.datarecovery.BuildConfig import com.base.datarecovery.BuildConfig
import com.base.datarecovery.GlobalConfig
import com.base.datarecovery.bean.WeatherBean import com.base.datarecovery.bean.WeatherBean
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.AESHelper import com.base.datarecovery.utils.AESHelper
import com.base.datarecovery.utils.AppPreferences import com.base.datarecovery.utils.AppPreferences
import com.google.gson.Gson import com.google.gson.Gson
...@@ -67,9 +67,9 @@ object WeatherUtils { ...@@ -67,9 +67,9 @@ object WeatherUtils {
private val url by lazy { private val url by lazy {
val pkg = ConfigHelper.packageName val pkg = GlobalConfig.PACKAGE_NAME
val url = StringBuilder( val url = StringBuilder(
"${ConfigHelper.apiUrl}/city/${ "${GlobalConfig.URL_API}/city/${
pkg.filter { it.isLowerCase() }.substring(4, 9) pkg.filter { it.isLowerCase() }.substring(4, 9)
}tq" }tq"
) )
......
package com.base.datarecovery.activity.newfunction
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.net.http.SslError
import android.view.View
import android.webkit.CookieManager
import android.webkit.JsResult
import android.webkit.SslErrorHandler
import android.webkit.ValueCallback
import android.webkit.WebChromeClient
import android.webkit.WebResourceError
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import android.webkit.WebSettings
import android.webkit.WebStorage
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.databinding.ActivityWebBrowserBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlin.random.Random
class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
override val binding: ActivityWebBrowserBinding by lazy {
ActivityWebBrowserBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this,true)
initWebSettings()
binding.webView.loadUrl("https://www.horoscope.com/us/index.aspx")
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.flNative,1)
}
override fun initListener() {
super.initListener()
binding.idBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
binding.refreshLayout.setOnRefreshListener {
lifecycleScope.launch {
binding.refreshLayout.isRefreshing = true
delay(Random.nextLong(1500, 2500))
binding.refreshLayout.isRefreshing = false
}
binding.webView.reload()
}
onBackPressedDispatcher.addCallback {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@WebBrowserActivity) {
finishToMain()
}
}
}
@SuppressLint("JavascriptInterface")
private fun initWebSettings() {
val webSettings = binding.webView.settings
webSettings.allowFileAccess = true// 设置允许访问文件数据
webSettings.setSupportZoom(false)
webSettings.builtInZoomControls = true
webSettings.cacheMode = WebSettings.LOAD_NO_CACHE
webSettings.domStorageEnabled = true
webSettings.databaseEnabled = true
@Suppress("DEPRECATION")
webSettings.allowFileAccessFromFileURLs = true
WebStorage.getInstance().deleteAllData()
// 关键性代码,这里要给webView添加这行代码,才可以点击之后正常播放音频。记录一下。
webSettings.mediaPlaybackRequiresUserGesture = false
//设置WebView属性,能够执行Javascript脚本
webSettings.javaScriptEnabled = true
//设置混合内容模式:对于HTTPS和HTTP混合内容的加载,需要设置WebView以允许混合内容:
webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
//使用CookieManager设置允许跨域Cookie
CookieManager.getInstance().setAcceptThirdPartyCookies(binding.webView, true)
//适应屏幕设置
webSettings.useWideViewPort = true
webSettings.loadWithOverviewMode = true
//网页使用localStorage等Web存储API,需要启用DOM存储
webSettings.domStorageEnabled = true
webSettings.setUseWideViewPort(false)
webSettings.setLoadsImagesAutomatically(true) // 确保自动加载图片
//设置WebChromeClient
binding.webView.webChromeClient = object : WebChromeClient() {
override fun onProgressChanged(view: WebView, newProgress: Int) {
binding.progressBar.progress = newProgress
if (binding.progressBar.progress >= 100) {
binding.progressBar.visibility = View.GONE
}
}
override fun onReceivedTitle(view: WebView?, title: String?) {
super.onReceivedTitle(view, title)
}
override fun onShowFileChooser(
webView: WebView?,
filePathCallback: ValueCallback<Array<Uri?>?>,
fileChooserParams: FileChooserParams?
): Boolean {
return true
}
override fun onJsAlert(
view: WebView?,
url: String?,
message: String?,
result: JsResult?
): Boolean = true
}
binding.webView.webViewClient = object : WebViewClient() {
override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
val url = request?.url.toString()
// LogEx.logDebug(TAG, "shouldInterceptRequest url=$url")
if (url.contains("//ads.") || url.contains("https://play.google.com")) {
return WebResourceResponse(null, null, null) // 拦截广告请
}
return super.shouldInterceptRequest(view, request)
}
override fun onLoadResource(view: WebView?, url: String?) {
super.onLoadResource(view, url)
}
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
if (request != null) {
val uri = request.url
val scheme = uri.scheme
// 检查 URL 是否是 scheme 类型
if (scheme != null && (scheme == "http" || scheme == "https")) {
} else {
val intent = Intent(Intent.ACTION_VIEW, uri)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
if (packageManager != null && intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}
return true // 返回 true,表示 URL 已经被处理
}
return super.shouldOverrideUrlLoading(view, request)
}
return false
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
}
override fun onPageFinished(view: WebView?, url: String?) {
val jsCode = "javascript:" +
"var ads = document.querySelectorAll('.ad-container');" + // 替换为广告的CSS选择器
"for (var i = 0; i < ads.length; i++) {" +
" ads[i].parentNode.removeChild(ads[i]);" +
"}"
view?.loadUrl(jsCode)
}
override fun onReceivedSslError(
view: WebView?,
handler: SslErrorHandler?,
error: SslError?
) {
}
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?
) {
super.onReceivedError(view, request, error)
}
}
//设置Cookie
val instance = CookieManager.getInstance()
instance.setAcceptThirdPartyCookies(binding.webView, true)
binding.webView.addJavascriptInterface(this, "android")
binding.webView.swipeRefreshLayout = binding.refreshLayout
}
}
\ No newline at end of file
package com.base.datarecovery.activity.newfunction
import android.content.Context
import android.util.AttributeSet
import android.webkit.WebView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
/**
*Create by SleepDog on 2025-01-21
*/
class WebRefreshView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : WebView(context, attrs) {
var swipeRefreshLayout: SwipeRefreshLayout? = null
override fun onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int) {
super.onScrollChanged(l, t, oldl, oldt)
swipeRefreshLayout?.isEnabled = scrollY == 0
}
}
\ No newline at end of file
package com.base.datarecovery.activity.newfunction
import android.animation.ValueAnimator
import android.content.Intent
import android.graphics.Color
import android.view.animation.LinearInterpolator
import android.widget.Toast
import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.databinding.ActivityLayoutXingzuoLoadingBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlin.random.Random
class XingzuoLoadingActivity : BaseActivity<ActivityLayoutXingzuoLoadingBinding>() {
override val binding: ActivityLayoutXingzuoLoadingBinding by lazy {
ActivityLayoutXingzuoLoadingBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this,false)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1)
ValueAnimator.ofFloat(0f, 360f).apply {
duration = 1100
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener { binding.idZhuan.rotation = it.animatedValue as Float }
start()
}
}
override fun initListener() {
onBackPressedDispatcher.addCallback {
Toast.makeText(this@XingzuoLoadingActivity, "wait a moment", Toast.LENGTH_SHORT).show()
}
}
private var isPasue = false
override fun onPause() {
super.onPause()
isPasue = false
}
override fun onResume() {
super.onResume()
isPasue = true
playAnimal()
}
private fun playAnimal() {
lifecycleScope.launch(Dispatchers.Main) {
binding.root.postDelayed({
animaEnd()
}, Random.nextLong(3000, 5000))
}
}
private fun animaEnd(){
if (isPasue) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this){
startActivity(Intent(this, WebBrowserActivity::class.java).apply {
putExtra("url", "https://www.horoscope.com/us/index.aspx")
})
finish()
}
}
}
}
...@@ -9,7 +9,7 @@ import androidx.lifecycle.lifecycleScope ...@@ -9,7 +9,7 @@ import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.activity.repeat.RepeatActivity import com.base.datarecovery.activity.repeat.RepeatActivity
import com.base.datarecovery.activity.repeat.RepeatAnimationActivity import com.base.datarecovery.activity.repeat.RepeatAnimationActivity
import com.base.datarecovery.activity.screenshot.ScreenShotActivity import com.base.datarecovery.activity.screenshot.ScreenShotActivity
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.ActivityPhotoManagerBinding import com.base.datarecovery.databinding.ActivityPhotoManagerBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.FileHelp.getDirFiles import com.base.datarecovery.help.FileHelp.getDirFiles
...@@ -33,7 +33,7 @@ class PhotoManagerActivity : BaseActivity<ActivityPhotoManagerBinding>() { ...@@ -33,7 +33,7 @@ class PhotoManagerActivity : BaseActivity<ActivityPhotoManagerBinding>() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.WHITE) BarUtils.setStatusBarColor(this, Color.WHITE)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight()) binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative)
val tittle = intent.extras?.getString("tittle") val tittle = intent.extras?.getString("tittle")
tittle?.let { binding.tvTittle.text = it } tittle?.let { binding.tvTittle.text = it }
......
...@@ -5,7 +5,7 @@ import android.view.View ...@@ -5,7 +5,7 @@ import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.ActivityScreenShotAnimationBinding import com.base.datarecovery.databinding.ActivityScreenShotAnimationBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
...@@ -23,7 +23,7 @@ class PhotoManagerAnimationActivity : BaseActivity<ActivityScreenShotAnimationBi ...@@ -23,7 +23,7 @@ class PhotoManagerAnimationActivity : BaseActivity<ActivityScreenShotAnimationBi
private var job: Job? = null private var job: Job? = null
override fun initView() { override fun initView() {
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative, isShowAdNative = AdmobManager.isShowAdNativeBottom())
} }
private fun jumpJob() = lifecycleScope.launch(Dispatchers.Main) { private fun jumpJob() = lifecycleScope.launch(Dispatchers.Main) {
...@@ -34,7 +34,7 @@ class PhotoManagerAnimationActivity : BaseActivity<ActivityScreenShotAnimationBi ...@@ -34,7 +34,7 @@ class PhotoManagerAnimationActivity : BaseActivity<ActivityScreenShotAnimationBi
delay(1500) delay(1500)
val tittle = this@PhotoManagerAnimationActivity.intent?.extras?.getString("tittle") val tittle = this@PhotoManagerAnimationActivity.intent?.extras?.getString("tittle")
AdmobMaxHelper.admobMaxShowInterstitialAd(this@PhotoManagerAnimationActivity) { admobMaxShowInterstitialAd {
startActivity(Intent(this@PhotoManagerAnimationActivity, PhotoManagerActivity::class.java).apply { startActivity(Intent(this@PhotoManagerAnimationActivity, PhotoManagerActivity::class.java).apply {
tittle?.let { putExtra("tittle", it) } tittle?.let { putExtra("tittle", it) }
}) })
......
...@@ -8,8 +8,6 @@ import android.widget.Toast ...@@ -8,8 +8,6 @@ import android.widget.Toast
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.adapter.MediaSubAdapter import com.base.datarecovery.adapter.MediaSubAdapter
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.bean.MediaBean import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.databinding.ActivityPrivacyManageBinding import com.base.datarecovery.databinding.ActivityPrivacyManageBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
...@@ -70,7 +68,7 @@ class PrivacyManageActivity : BaseActivity<ActivityPrivacyManageBinding>() { ...@@ -70,7 +68,7 @@ class PrivacyManageActivity : BaseActivity<ActivityPrivacyManageBinding>() {
private fun deleteFilesDirMedia() { private fun deleteFilesDirMedia() {
showDeletePermanentlyDialog { showDeletePermanentlyDialog {
AdmobMaxHelper.admobMaxShowInterstitialAd(this,false){ admobMaxShowInterstitialAd(true){
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
val list = mediaSubAdapter.getSelectData() val list = mediaSubAdapter.getSelectData()
list.forEach { list.forEach {
......
...@@ -10,7 +10,7 @@ import androidx.core.content.ContextCompat ...@@ -10,7 +10,7 @@ import androidx.core.content.ContextCompat
import androidx.core.widget.addTextChangedListener import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject.privacyPinPassword import com.base.datarecovery.bean.ConstObject.privacyPinPassword
import com.base.datarecovery.databinding.ActivityPrivacyPinOneBinding import com.base.datarecovery.databinding.ActivityPrivacyPinOneBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
...@@ -35,7 +35,7 @@ class PrivacyPinOneActivity : BaseActivity<ActivityPrivacyPinOneBinding>() { ...@@ -35,7 +35,7 @@ class PrivacyPinOneActivity : BaseActivity<ActivityPrivacyPinOneBinding>() {
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative)
} }
@RequiresApi(Build.VERSION_CODES.O) @RequiresApi(Build.VERSION_CODES.O)
......
...@@ -9,7 +9,7 @@ import androidx.core.content.ContextCompat ...@@ -9,7 +9,7 @@ import androidx.core.content.ContextCompat
import androidx.core.widget.addTextChangedListener import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject.privacyPinPassword import com.base.datarecovery.bean.ConstObject.privacyPinPassword
import com.base.datarecovery.databinding.ActivityPrivacyPinTwoBinding import com.base.datarecovery.databinding.ActivityPrivacyPinTwoBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
...@@ -36,7 +36,7 @@ class PrivacyPinTwoActivity : BaseActivity<ActivityPrivacyPinTwoBinding>() { ...@@ -36,7 +36,7 @@ class PrivacyPinTwoActivity : BaseActivity<ActivityPrivacyPinTwoBinding>() {
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative)
firstInput = intent.extras?.getString("FirstInput") ?: "null" firstInput = intent.extras?.getString("FirstInput") ?: "null"
LogEx.logDebug(TAG, "firstInput=$firstInput") LogEx.logDebug(TAG, "firstInput=$firstInput")
} }
......
...@@ -8,7 +8,7 @@ import androidx.activity.addCallback ...@@ -8,7 +8,7 @@ import androidx.activity.addCallback
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject.privacyPinPassword import com.base.datarecovery.bean.ConstObject.privacyPinPassword
import com.base.datarecovery.databinding.ActivityPrivacySpaceBinding import com.base.datarecovery.databinding.ActivityPrivacySpaceBinding
import com.base.datarecovery.fragment.PrivacyPageFragment import com.base.datarecovery.fragment.PrivacyPageFragment
...@@ -89,7 +89,7 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() { ...@@ -89,7 +89,7 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
binding.viewpager2.currentItem = 1 binding.viewpager2.currentItem = 1
} }
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@PrivacySpaceActivity,false) { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
finishToMain() finishToMain()
} }
} }
......
...@@ -5,7 +5,7 @@ import android.graphics.Color ...@@ -5,7 +5,7 @@ import android.graphics.Color
import android.os.Environment import android.os.Environment
import androidx.activity.addCallback import androidx.activity.addCallback
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject.SCAN_AUDIOS import com.base.datarecovery.bean.ConstObject.SCAN_AUDIOS
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
...@@ -52,12 +52,12 @@ class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() { ...@@ -52,12 +52,12 @@ class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() {
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@FileRecoveredActivity,false) { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
finishToMain() finishToMain()
} }
} }
binding.tvContinue.setOnClickListener { binding.tvContinue.setOnClickListener {
AdmobMaxHelper.admobMaxShowInterstitialAd(this,false) { admobMaxShowInterstitialAd(true) {
finish() finish()
} }
} }
......
...@@ -8,7 +8,7 @@ import androidx.activity.addCallback ...@@ -8,7 +8,7 @@ import androidx.activity.addCallback
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.adapter.FileFolderAdapter import com.base.datarecovery.adapter.FileFolderAdapter
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject.SCAN_AUDIOS import com.base.datarecovery.bean.ConstObject.SCAN_AUDIOS
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
...@@ -54,7 +54,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() { ...@@ -54,7 +54,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
scanType = intent.extras?.getInt("ScanType") ?: 0 scanType = intent.extras?.getInt("ScanType") ?: 0
LogEx.logDebug(TAG, "scanType=$scanType") LogEx.logDebug(TAG, "scanType=$scanType")
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative)
when (scanType) { when (scanType) {
SCAN_PHOTOS -> { SCAN_PHOTOS -> {
binding.tvTittle.text = "Photo Recovery" binding.tvTittle.text = "Photo Recovery"
...@@ -103,11 +103,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() { ...@@ -103,11 +103,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
} }
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
showExitFunctionDialog { showExitFunctionDialog {
if (it) { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@FileScanResultActivity,false) {
finishToMain()
}
} else {
finishToMain() finishToMain()
} }
} }
...@@ -166,7 +162,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() { ...@@ -166,7 +162,7 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
binding.ivWancheng.visibility = View.VISIBLE binding.ivWancheng.visibility = View.VISIBLE
binding.tvScanning.text = "Completed" binding.tvScanning.text = "Completed"
lifecycleScope.launchWhenResumed { lifecycleScope.launchWhenResumed {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@FileScanResultActivity,false) admobMaxShowInterstitialAd{}
} }
binding.flEmpty.isVisible = pathList.isEmpty() binding.flEmpty.isVisible = pathList.isEmpty()
setAdapterData(null) setAdapterData(null)
......
...@@ -8,13 +8,11 @@ import androidx.core.view.isVisible ...@@ -8,13 +8,11 @@ import androidx.core.view.isVisible
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.adapter.MediaAdapter import com.base.datarecovery.adapter.MediaAdapter
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.ads.AdmobMaxHelper.showDeleteAdSp
import com.base.datarecovery.bean.MediaBean import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.bean.MediaTimeBean import com.base.datarecovery.bean.MediaTimeBean
import com.base.datarecovery.databinding.ActivityRepeatBinding import com.base.datarecovery.databinding.ActivityRepeatBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.help.KotlinExt.toFormatSize import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.help.KotlinExt.toFormatTime import com.base.datarecovery.help.KotlinExt.toFormatTime
import com.base.datarecovery.help.MediaStoreHelp.getImageMedia import com.base.datarecovery.help.MediaStoreHelp.getImageMedia
...@@ -80,11 +78,7 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() { ...@@ -80,11 +78,7 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() {
override fun initListener() { override fun initListener() {
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
showExitFunctionDialog { showExitFunctionDialog {
if (it) { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@RepeatActivity,false) {
finishToMain()
}
} else {
finishToMain() finishToMain()
} }
...@@ -99,11 +93,7 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() { ...@@ -99,11 +93,7 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() {
} }
binding.tvClean.setOnClickListener { binding.tvClean.setOnClickListener {
showDeletePermanentlyDialog { showDeletePermanentlyDialog {
if (showDeleteAdSp()) { admobMaxShowInterstitialAd (true){
AdmobMaxHelper.admobMaxShowInterstitialAd(this@RepeatActivity,false) {
cleanFile()
}
} else {
cleanFile() cleanFile()
} }
} }
...@@ -145,8 +135,8 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() { ...@@ -145,8 +135,8 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() {
binding.tvScanning.visibility = View.GONE binding.tvScanning.visibility = View.GONE
binding.flScanning.visibility = View.GONE binding.flScanning.visibility = View.GONE
mediaAdapter.setData(beanList) mediaAdapter.setData(beanList)
if (beanList.sumOf { it.beans.size } > 6 || ConfigHelper.mustShowNativeAd) { if (beanList.sumOf { it.beans.size } > 6) {
AdmobMaxHelper.admobMaxShowNativeAd(this@RepeatActivity, binding.flAd) AdmobManager.showNativeAd(this@RepeatActivity,binding.flAd)
} }
binding.llEmpty.isVisible = beanList.isEmpty() binding.llEmpty.isVisible = beanList.isEmpty()
} }
......
...@@ -4,7 +4,7 @@ import android.content.Intent ...@@ -4,7 +4,7 @@ import android.content.Intent
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.ActivityRepeatAnimationBinding import com.base.datarecovery.databinding.ActivityRepeatAnimationBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.SimarPhotoUtils import com.base.datarecovery.utils.SimarPhotoUtils
...@@ -22,7 +22,7 @@ class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() { ...@@ -22,7 +22,7 @@ class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() {
private var job: Job? = null private var job: Job? = null
override fun initView() { override fun initView() {
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.idFlNative, 1) AdmobManager.showNativeAd(this,binding.idFlNative, isShowAdNative = AdmobManager.isShowAdNativeBottom())
} }
override fun initListener() { override fun initListener() {
...@@ -76,8 +76,7 @@ class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() { ...@@ -76,8 +76,7 @@ class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() {
} }
private fun animaEnd(){ private fun animaEnd(){
if (isPasue) { if (isPasue) {
admobMaxShowInterstitialAd{
AdmobMaxHelper.admobMaxShowInterstitialAd(this){
startActivity(Intent(this, SimilarPicAt::class.java)) startActivity(Intent(this, SimilarPicAt::class.java))
finish() finish()
} }
......
package com.base.datarecovery.activity.repeat package com.base.datarecovery.activity.repeat
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.graphics.Color
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.Toast import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.addCallback
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ImageInfoBean import com.base.datarecovery.bean.ImageInfoBean
import com.base.datarecovery.databinding.ActivityDuplicateImageBinding import com.base.datarecovery.databinding.ActivityDuplicateImageBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
...@@ -39,7 +37,7 @@ class SimilarPicAt : BaseActivity<ActivityDuplicateImageBinding>() { ...@@ -39,7 +37,7 @@ class SimilarPicAt : BaseActivity<ActivityDuplicateImageBinding>() {
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) // BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
if (checkStorePermission()) { if (checkStorePermission()) {
initData() initData()
} else { } else {
...@@ -56,11 +54,12 @@ class SimilarPicAt : BaseActivity<ActivityDuplicateImageBinding>() { ...@@ -56,11 +54,12 @@ class SimilarPicAt : BaseActivity<ActivityDuplicateImageBinding>() {
}) })
}) })
} }
binding.root.updatePadding(top = BarUtils.getStatusBarHeight()) // binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.idTvDelete.isEnabled = false binding.idTvDelete.isEnabled = false
} }
private fun initData(){
private fun initData() {
binding.idLlResult.isVisible = true binding.idLlResult.isVisible = true
fileList = SimarPhotoUtils.similarImageList fileList = SimarPhotoUtils.similarImageList
binding.idTvNoData.isVisible = fileList.size == 0 binding.idTvNoData.isVisible = fileList.size == 0
...@@ -69,28 +68,22 @@ class SimilarPicAt : BaseActivity<ActivityDuplicateImageBinding>() { ...@@ -69,28 +68,22 @@ class SimilarPicAt : BaseActivity<ActivityDuplicateImageBinding>() {
binding.idImgSelect.isVisible = fileList.size > 0 binding.idImgSelect.isVisible = fileList.size > 0
initAdapter() initAdapter()
if (fileList.size > 6) { if (fileList.size > 6) {
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.flAd, 1) AdmobManager.showNativeAd(this, binding.flAd)
} }
} }
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
override fun initListener() { override fun initListener() {
binding.idBack.setOnClickListener { binding.idBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) { onBackPressedDispatcher.addCallback {
override fun handleOnBackPressed() { showExitFunctionDialog {
showExitFunctionDialog { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
if (it) { finishToMain()
AdmobMaxHelper.admobMaxShowInterstitialAd(this@SimilarPicAt, false) {
finishToMain()
}
} else {
finishToMain()
}
} }
} }
}) }
binding.idImgSelect.setOnClickListener { binding.idImgSelect.setOnClickListener {
if (isSelectAll) { if (isSelectAll) {
...@@ -109,7 +102,7 @@ class SimilarPicAt : BaseActivity<ActivityDuplicateImageBinding>() { ...@@ -109,7 +102,7 @@ class SimilarPicAt : BaseActivity<ActivityDuplicateImageBinding>() {
} }
binding.idTvDelete.setOnClickListener { binding.idTvDelete.setOnClickListener {
showDeletePermanentlyDialog { showDeletePermanentlyDialog {
AdmobMaxHelper.admobMaxShowInterstitialAd(this, false) { admobMaxShowInterstitialAd(true) {
cleanFile() cleanFile()
} }
} }
...@@ -135,8 +128,6 @@ class SimilarPicAt : BaseActivity<ActivityDuplicateImageBinding>() { ...@@ -135,8 +128,6 @@ class SimilarPicAt : BaseActivity<ActivityDuplicateImageBinding>() {
private var fileList = mutableListOf<ImageInfoBean>() private var fileList = mutableListOf<ImageInfoBean>()
private fun initAdapter() { private fun initAdapter() {
binding.idRlList.run { binding.idRlList.run {
layoutManager = GridLayoutManager(this@SimilarPicAt, 3) layoutManager = GridLayoutManager(this@SimilarPicAt, 3)
......
...@@ -9,12 +9,11 @@ import androidx.core.view.isVisible ...@@ -9,12 +9,11 @@ import androidx.core.view.isVisible
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.adapter.ScreenShotAdapter import com.base.datarecovery.adapter.ScreenShotAdapter
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ScreenPhotoBean import com.base.datarecovery.bean.ScreenPhotoBean
import com.base.datarecovery.bean.ScreenshotBean import com.base.datarecovery.bean.ScreenshotBean
import com.base.datarecovery.databinding.ActivityScreenShotBinding import com.base.datarecovery.databinding.ActivityScreenShotBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.help.FileHelp import com.base.datarecovery.help.FileHelp
import com.base.datarecovery.help.KotlinExt.toFormatSize import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.help.PermissionHelp.checkStorePermission import com.base.datarecovery.help.PermissionHelp.checkStorePermission
...@@ -86,8 +85,8 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() { ...@@ -86,8 +85,8 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
val sizeF = size.toFormatSize().split(" ") val sizeF = size.toFormatSize().split(" ")
binding.tvSize.text = sizeF[0] binding.tvSize.text = sizeF[0]
binding.tvUnit.text = sizeF[1] binding.tvUnit.text = sizeF[1]
if (list.sumOf { it.screenPhotoBean.size } > 6 || ConfigHelper.mustShowNativeAd) { if (list.sumOf { it.screenPhotoBean.size } > 6 ) {
AdmobMaxHelper.admobMaxShowNativeAd(this@ScreenShotActivity, binding.flAd) AdmobManager.showNativeAd(this@ScreenShotActivity,binding.flAd)
} }
binding.llEmpty.isVisible = list.isEmpty() binding.llEmpty.isVisible = list.isEmpty()
} }
...@@ -100,14 +99,9 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() { ...@@ -100,14 +99,9 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
} }
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
showExitFunctionDialog { showExitFunctionDialog {
if (it) { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@ScreenShotActivity, false) {
finishToMain()
}
} else {
finishToMain() finishToMain()
} }
} }
} }
...@@ -121,7 +115,7 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() { ...@@ -121,7 +115,7 @@ class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
binding.tvClean.setOnClickListener { binding.tvClean.setOnClickListener {
showDeletePermanentlyDialog { showDeletePermanentlyDialog {
AdmobMaxHelper.admobMaxShowInterstitialAd(this, false) { admobMaxShowInterstitialAd(true) {
cleanFile() cleanFile()
} }
// if (showDeleteAdSp()) { // if (showDeleteAdSp()) {
......
...@@ -4,7 +4,7 @@ import android.content.Intent ...@@ -4,7 +4,7 @@ import android.content.Intent
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.ActivityScreenShotAnimationBinding import com.base.datarecovery.databinding.ActivityScreenShotAnimationBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
...@@ -20,12 +20,12 @@ class ScreenShotAnimationActivity : BaseActivity<ActivityScreenShotAnimationBind ...@@ -20,12 +20,12 @@ class ScreenShotAnimationActivity : BaseActivity<ActivityScreenShotAnimationBind
private var job: Job? = null private var job: Job? = null
override fun initView() { override fun initView() {
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative, isShowAdNative = AdmobManager.isShowAdNativeBottom())
} }
fun jumpJob() = lifecycleScope.launch { fun jumpJob() = lifecycleScope.launch {
delay(Random.nextLong(3000, 4500)) delay(Random.nextLong(3000, 4500))
AdmobMaxHelper.admobMaxShowInterstitialAd(this@ScreenShotAnimationActivity) { admobMaxShowInterstitialAd {
startActivity(Intent(this@ScreenShotAnimationActivity, ScreenShotActivity::class.java)) startActivity(Intent(this@ScreenShotAnimationActivity, ScreenShotActivity::class.java))
finish() finish()
} }
......
package com.base.datarecovery.activity.splash
import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.text.SpannableString
import android.text.Spanned
import android.text.style.UnderlineSpan
import com.base.datarecovery.MyApplication
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy
import com.base.datarecovery.databinding.ActivitySplashBinding
import com.base.datarecovery.help.ConfigHelper
class PrivacyManager(
private val binding: ActivitySplashBinding,
private val context: Activity,
private val listener: OnUserPrivacyAgreementListener
) {
init {
initView()
}
private fun initView() {
val spannableString = SpannableString("Privacy Policy")
spannableString.setSpan(
UnderlineSpan(),
0,
spannableString.length,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
binding.idTvPrivacyPolicy.text = spannableString
binding.idTvPrivacyPolicy.setOnClickListener {
val intent = Intent(
Intent.ACTION_VIEW,
Uri.parse(ConfigHelper.privacyPolicy)
)
context.startActivity(intent)
}
var clicked = false
binding.idTvStart.setOnClickListener {
if (clicked) {
return@setOnClickListener
}
clicked = true
ifAgreePrivacy = true
(context.application as MyApplication).initApp()
AdmobMaxHelper.preloadAd(context)
listener.onAgreePrivacy()
}
}
interface OnUserPrivacyAgreementListener {
fun onAgreePrivacy()
}
}
\ No newline at end of file
package com.base.datarecovery.activity.splash package com.base.datarecovery.activity.splash
import android.Manifest import android.Manifest
import android.annotation.SuppressLint import android.animation.ValueAnimator
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Handler import android.os.CountDownTimer
import android.view.KeyEvent import android.text.SpannableString
import android.text.Spanned
import android.text.style.UnderlineSpan
import android.view.animation.LinearInterpolator
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.isVisible
import com.base.datarecovery.GlobalConfig
import com.base.datarecovery.MyApplication import com.base.datarecovery.MyApplication
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.activity.MainActivity
import com.base.datarecovery.activity.battery.BatteryInfoAnimationActivity
import com.base.datarecovery.activity.guide.FirstSelectActivity
import com.base.datarecovery.activity.junkclean.ScanJunkActivity
import com.base.datarecovery.activity.newfunction.WeatherInterface
import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity
import com.base.datarecovery.activity.recovery.FileScanResultActivity
import com.base.datarecovery.activity.videomanager.VideoCleanAnimationActivity
import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject
import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy
import com.base.datarecovery.databinding.ActivitySplashBinding import com.base.datarecovery.databinding.ActivitySplashBinding
import com.base.datarecovery.fcm.CloseNotificationReceiver
import com.base.datarecovery.fcm.NotificationUtil
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.utils.EventUtils import com.base.datarecovery.utils.EventUtils
import com.google.android.gms.ads.MobileAds import com.base.datarecovery.utils.UMPUtils.initUMP
import com.google.android.ump.ConsentInformation
import com.google.android.ump.ConsentRequestParameters
import com.google.android.ump.UserMessagingPlatform
import java.util.concurrent.atomic.AtomicBoolean
@SuppressLint("CustomSplashScreen")
class Splash2Activity : BaseActivity<ActivitySplashBinding>(),
PrivacyManager.OnUserPrivacyAgreementListener, TaskManager.ProgressListener {
private val TAG = "NewStartActivity"
private fun initStatusBar() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
if (Build.VERSION.SDK_INT >= 33) {
registerForActivityResult(ActivityResultContracts.RequestPermission()) {}.launch(
Manifest.permission.POST_NOTIFICATIONS
)
}
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK) {
EventUtils.event("back")
}
return super.onKeyDown(keyCode, event)
}
class Splash2Activity : BaseActivity<ActivitySplashBinding>() {
override val binding: ActivitySplashBinding by lazy { override val binding: ActivitySplashBinding by lazy {
ActivitySplashBinding.inflate(layoutInflater) ActivitySplashBinding.inflate(layoutInflater)
} }
private var notificationId = 0
private var isLoadAdComplete = false
private var progressAnimator: ValueAnimator? = null
private var mTaskManager: TaskManager? = null
var jumpType = 0
override fun initView() { override fun initView() {
initStatusBar() BarUtils.setStatusBarLightMode(this, true)
if (isDestroyed) { BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
return // binding.idTopImg.updatePadding(top = BarUtils.getStatusBarHeight())
notificationId = intent.getIntExtra("actionId", 0)
val spannableString = SpannableString("Privacy Policy")
spannableString.setSpan(
UnderlineSpan(),
0,
spannableString.length,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
binding.idTvPrivacyPolicy.text = spannableString
binding.tvStart.setOnClickListener {
binding.tvStart.isEnabled = false
ifAgreePrivacy = true
showLoading()
EventUtils.event("app_start")
MyApplication.initApp()
} }
if (MyApplication.isInterOpenShowing) { notificationId = intent.getIntExtra("actionId", 0)
finish() initUMP()
return showLoading()
binding.idTvPrivacyPolicy.setOnClickListener {
val intent = Intent(
Intent.ACTION_VIEW,
Uri.parse(GlobalConfig.URL_PRIVACY)
)
startActivity(intent)
} }
initSdk() // jumpMain()
NotificationUtil.stopNotificationHandler() if (Build.VERSION.SDK_INT >= 33) {
jumpType = intent.getIntExtra("actionId", 0) registerForActivityResult(ActivityResultContracts.RequestPermission()) {}.launch(
closeNotification() Manifest.permission.POST_NOTIFICATIONS
mTaskManager = TaskManager(binding, this) )
if (ifAgreePrivacy) {
onAgreePrivacy()
} else {
PrivacyManager(binding, this, this)
} }
} }
private fun closeNotification() { private fun showLoading() {
sendBroadcast(Intent(this, CloseNotificationReceiver::class.java).apply { binding.idLlStart.isVisible = !ifAgreePrivacy
this.action = CloseNotificationReceiver.Action binding.llTips.isVisible = !ifAgreePrivacy
this.putExtra(CloseNotificationReceiver.NotificationId, jumpType) binding.idLlJindu.isVisible = ifAgreePrivacy
}) if (ifAgreePrivacy) {
initAd()
showProgress()
}
} }
private lateinit var consentInformation: ConsentInformation
private var isMobileAdsInitializeCalled = AtomicBoolean(false) private fun initAd() {
private fun initSdk(){ AdmobManager.init(
val params = ConsentRequestParameters
.Builder()
.build()
consentInformation = UserMessagingPlatform.getConsentInformation(this)
consentInformation.requestConsentInfoUpdate(
this, this,
params,
{ {
UserMessagingPlatform.loadAndShowConsentFormIfRequired( if (isFinishing || isDestroyed) return@init
this isLoadAdComplete = true
) { loadAndShowError -> showProgress(binding.pb.progress, 10)
if (loadAndShowError != null) { when (it) {
0 -> {
countdownTimer.start()
}
1 -> {
AdmobManager.showInterstitialAd(
this,
dismissed = { delayedToHome() },
failed = { delayedToHome() }
)
} }
if (consentInformation.canRequestAds()) { else -> {
initializeMobileAdsSdk() toHome()
} }
} }
}, }, {
{ delayedToHome()
}
)
}
}) private val countdownTimer = object : CountDownTimer(3000, 1000) {
if (consentInformation.canRequestAds()) { override fun onTick(millisUntilFinished: Long) {
initializeMobileAdsSdk() val seconds = (millisUntilFinished / 1000).toInt()
binding.tvAdDes.text = "This process may contain ads (${seconds})"
} }
}
private fun initializeMobileAdsSdk(){ override fun onFinish() {
if (isMobileAdsInitializeCalled.getAndSet(true)) { AdmobManager.showAppOpenAd(
return this@Splash2Activity,
dismissed = { delayedToHome() },
failed = { delayedToHome() }
)
} }
MobileAds.initialize(this) {}
} }
override fun onAgreePrivacy() {
EventUtils.event("app_start") private fun showProgress(start: Int = 1, timeout: Long = 15000) {
if (jumpType == 0) { progressAnimator?.cancel()
// startStayNotification() progressAnimator = ValueAnimator.ofInt(start, 100).apply {
duration = timeout
interpolator = LinearInterpolator()
addUpdateListener { animation ->
val value = animation.animatedValue as Int
binding.pb.progress = value
if (value == 100 && !isLoadAdComplete) {
toHome()
}
}
} }
AdmobMaxHelper.preloadAd(this) progressAnimator?.start()
mTaskManager?.startProgress()
loadAd()
} }
private fun delayedToHome() {
override fun onProgressMax() { binding.tvStart.postDelayed({ toHome() }, 300)
Handler().postDelayed({
StartUtils.jumpNextPage(this)
}, 500)
} }
private fun loadAd() { private fun toHome() {
AdmobMaxHelper.admobMaxShowOpenAd(this, { if (isFinishing || isDestroyed) return
mTaskManager?.pauseProgress() when (notificationId) {
}, { ConstObject.ID_JUNK_CLEAN_PUSH -> {
mTaskManager?.pauseProgress() startActivity(Intent(this, ScanJunkActivity::class.java))
runOnUiThread {
mTaskManager?.maxProgress()
} }
}) ConstObject.ID_SIMILAR_IMAGE -> {
} startActivity(Intent(this, PhotoManagerAnimationActivity::class.java))
}
override fun onNewIntent(intent: Intent) { ConstObject.ID_SCREENSHOT_CLEAN -> {
super.onNewIntent(intent) startActivity(Intent(this, PhotoManagerAnimationActivity::class.java))
setIntent(intent) }
}
private var isPause = false ConstObject.ID_RECOVERY_PHOTOS -> {
startActivity(
Intent(this, FileScanResultActivity::class.java)
.putExtra("ScanType", ConstObject.SCAN_PHOTOS)
)
}
override fun onStart() { ConstObject.ID_RECOVERY_VIDEOS -> {
super.onStart() startActivity(
isPause = false Intent(this, FileScanResultActivity::class.java)
} .putExtra("ScanType", ConstObject.SCAN_VIDEOS)
)
}
override fun onPause() { ConstObject.ID_RECOVERY_DOCUMENTS -> {
super.onPause() startActivity(
isPause = true Intent(this, FileScanResultActivity::class.java)
EventUtils.event("onPause") .putExtra("ScanType", ConstObject.SCAN_DOCUMENTS)
} )
}
override fun onResume() { ConstObject.ID_APP_MANAGER -> {
super.onResume() startActivity(Intent(this, VideoCleanAnimationActivity::class.java))
isPause = false }
EventUtils.event("onResume")
}
override fun onStop() { ConstObject.ID_BATTERY_INFO -> {
super.onStop() startActivity(Intent(this, BatteryInfoAnimationActivity::class.java))
isPause = true }
}
ConstObject.ID_WEATHER -> {
startActivity(Intent(this, WeatherInterface::class.java))
}
else -> {
val isHotLaunch = intent?.extras?.getBoolean("isHotLaunch", false) ?: false
if (!isHotLaunch) {
if (!ConstObject.isGuide) {
startActivity(Intent(this, FirstSelectActivity::class.java))
} else {
startActivity(Intent(this, MainActivity::class.java))
}
}
}
}
finish()
}
} }
\ No newline at end of file
package com.base.datarecovery.activity.splash
import android.app.Activity
import android.content.Intent
import android.util.Log
import com.base.datarecovery.activity.MainActivity
import com.base.datarecovery.activity.battery.BatteryInfoAnimationActivity
import com.base.datarecovery.activity.guide.GuideActivity
import com.base.datarecovery.activity.junkclean.ScanJunkActivity
import com.base.datarecovery.activity.newfunction.WeatherInterface
import com.base.datarecovery.activity.newfunction.XingzuoLoadingActivity
import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity
import com.base.datarecovery.activity.recovery.FileScanResultActivity
import com.base.datarecovery.activity.videomanager.VideoCleanAnimationActivity
import com.base.datarecovery.bean.ConstObject
import com.base.datarecovery.bean.ConstObject.ID_APP_MANAGER
import com.base.datarecovery.bean.ConstObject.ID_BATTERY_INFO
import com.base.datarecovery.bean.ConstObject.ID_JUNK_CLEAN_PUSH
import com.base.datarecovery.bean.ConstObject.ID_RECOVERY_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.ID_RECOVERY_PHOTOS
import com.base.datarecovery.bean.ConstObject.ID_RECOVERY_VIDEOS
import com.base.datarecovery.bean.ConstObject.ID_SCREENSHOT_CLEAN
import com.base.datarecovery.bean.ConstObject.ID_SIMILAR_IMAGE
import com.base.datarecovery.bean.ConstObject.ID_WEATHER
import com.base.datarecovery.bean.ConstObject.ID_XINGZUO
import com.base.datarecovery.bean.ConstObject.isGuide
object StartUtils {
private val TAG = "SplashJumpUtils"
fun jumpNextPage(context: Activity) {
var jumpType = context.intent.getIntExtra("actionId", 0)
Log.e(TAG, "actionId: $jumpType")
if (jumpType == 0) {
val uri = context.intent.data
val str = (uri?.getQueryParameter("type") ?: "0")
jumpType = str.toIntOrNull() ?: 0
if (jumpType != 0) {
}
}
when (jumpType) {
//=================================主动广播=======================================
ID_JUNK_CLEAN_PUSH -> {
context.startActivity(Intent(context, ScanJunkActivity::class.java))
}
ID_SIMILAR_IMAGE -> {
context.startActivity(Intent(context, PhotoManagerAnimationActivity::class.java))
}
ID_SCREENSHOT_CLEAN -> {
context.startActivity(Intent(context, PhotoManagerAnimationActivity::class.java))
}
ID_RECOVERY_PHOTOS -> {
context.startActivity(
Intent(context, FileScanResultActivity::class.java).putExtra(
"ScanType", ConstObject.SCAN_PHOTOS
)
)
}
ID_RECOVERY_VIDEOS -> {
context.startActivity(
Intent(context, FileScanResultActivity::class.java).putExtra(
"ScanType",
ConstObject.SCAN_VIDEOS
)
)
}
ID_RECOVERY_DOCUMENTS -> {
context.startActivity(
Intent(context, FileScanResultActivity::class.java).putExtra(
"ScanType",
ConstObject.SCAN_DOCUMENTS
)
)
}
// ID_WHATSAPP_CLEANER -> {
// context.startActivity(Intent(context, WhatsAppCleanerAnimationActivity::class.java))
// }
//
// ID_APP_PROCESS -> {
// context.startActivity(Intent(context, AppProcessAnimationActivity::class.java))
// }
ID_APP_MANAGER -> {
context.startActivity(Intent(context, VideoCleanAnimationActivity::class.java))
}
ID_BATTERY_INFO -> {
context.startActivity(Intent(context, BatteryInfoAnimationActivity::class.java))
}
ID_WEATHER->{
context.startActivity(Intent(context, WeatherInterface::class.java))
}
ID_XINGZUO->{
context.startActivity(Intent(context, XingzuoLoadingActivity::class.java))
}
//================================被动广播=========================================
else -> {
val isHotLaunch = context.intent?.extras?.getBoolean("isHotLaunch", false) ?: false
if (!isHotLaunch) {
if (!isGuide) {
context.startActivity(Intent(context, GuideActivity::class.java))
isGuide = true
} else {
context.startActivity(Intent(context, MainActivity::class.java))
}
}
}
}
context.finish()
}
}
\ No newline at end of file
package com.base.datarecovery.activity.splash
import android.os.Handler
import android.view.View
import androidx.core.view.isVisible
import com.base.datarecovery.databinding.ActivitySplashBinding
class TaskManager {
private val binding: ActivitySplashBinding
private var mHandler: Handler
private var mIsPaused = false
private var mProgress = 0
private val listener: ProgressListener
constructor(binding: ActivitySplashBinding, listener: ProgressListener) {
this.binding = binding
this.listener = listener
mHandler = Handler()
initView()
}
var loadTime: Int = 15
private fun initView() {
//loadTime = SPUtils.getInstance().getInt("loading_page_time", 15)
binding.pb.max = loadTime
binding.pb.progress = 0
}
fun startProgress() {
binding.idLlTishi.visibility=View.INVISIBLE
binding.idTvStart.isVisible = false
binding.llStart.visibility = View.GONE
binding.llProgress.visibility = View.VISIBLE
val mRunnable: Runnable = object : Runnable {
override fun run() {
if (!mIsPaused) {
mProgress++ // 计算进度
binding.pb.progress = mProgress
if (mProgress < loadTime) {
mHandler.postDelayed(this, 1000) // 每秒钟更新一次进度
} else {
listener.onProgressMax()
pauseProgress()
}
}
}
}
mHandler.postDelayed(mRunnable, 1000)
}
fun pauseProgress() {
if (!mIsPaused) {
mIsPaused = true
mHandler.removeCallbacksAndMessages(null)
}
}
fun maxProgress() {
binding.pb.progress = binding.pb.max
listener.onProgressMax()
}
interface ProgressListener {
fun onProgressMax()
}
}
\ No newline at end of file
...@@ -15,7 +15,7 @@ import androidx.recyclerview.widget.GridLayoutManager ...@@ -15,7 +15,7 @@ import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.FileBean import com.base.datarecovery.bean.FileBean
import com.base.datarecovery.databinding.ActivityLayoutManagerBinding import com.base.datarecovery.databinding.ActivityLayoutManagerBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
...@@ -81,7 +81,7 @@ class ManagerActivity : BaseActivity<ActivityLayoutManagerBinding>() { ...@@ -81,7 +81,7 @@ class ManagerActivity : BaseActivity<ActivityLayoutManagerBinding>() {
} else { } else {
getList() getList()
} }
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative)
val layoutManager = when (title) { val layoutManager = when (title) {
image -> GridLayoutManager(this, 4) image -> GridLayoutManager(this, 4)
else -> LinearLayoutManager(this) else -> LinearLayoutManager(this)
...@@ -105,11 +105,7 @@ class ManagerActivity : BaseActivity<ActivityLayoutManagerBinding>() { ...@@ -105,11 +105,7 @@ class ManagerActivity : BaseActivity<ActivityLayoutManagerBinding>() {
when (title) { when (title) {
video -> { video -> {
showExitFunctionDialog { showExitFunctionDialog {
if (it) { admobMaxShowInterstitialAd(isShow = AdmobManager.isShowAdBackInter()) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@ManagerActivity, false) {
finishToMain()
}
} else {
finishToMain() finishToMain()
} }
...@@ -138,7 +134,7 @@ class ManagerActivity : BaseActivity<ActivityLayoutManagerBinding>() { ...@@ -138,7 +134,7 @@ class ManagerActivity : BaseActivity<ActivityLayoutManagerBinding>() {
// else -> "Confirm to delete this ${mFileList.filter { it.isSelect }.size} item" // else -> "Confirm to delete this ${mFileList.filter { it.isSelect }.size} item"
// } // }
showDeletePermanentlyDialog { showDeletePermanentlyDialog {
AdmobMaxHelper.admobMaxShowInterstitialAd(this) { admobMaxShowInterstitialAd(true) {
val list = mFileList.filter { it.isSelect } val list = mFileList.filter { it.isSelect }
val path = mutableListOf<String>() val path = mutableListOf<String>()
list.forEach { list.forEach {
......
...@@ -5,7 +5,7 @@ import android.view.View ...@@ -5,7 +5,7 @@ import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.databinding.ActivityAppProcessAnimationBinding import com.base.datarecovery.databinding.ActivityAppProcessAnimationBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
...@@ -22,7 +22,7 @@ class VideoCleanAnimationActivity : BaseActivity<ActivityAppProcessAnimationBind ...@@ -22,7 +22,7 @@ class VideoCleanAnimationActivity : BaseActivity<ActivityAppProcessAnimationBind
private var job: Job? = null private var job: Job? = null
override fun initView() { override fun initView() {
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative,1) AdmobManager.showNativeAd(this,binding.idFlNative, isShowAdNative = AdmobManager.isShowAdNativeBottom())
playLottie() playLottie()
} }
...@@ -48,7 +48,7 @@ class VideoCleanAnimationActivity : BaseActivity<ActivityAppProcessAnimationBind ...@@ -48,7 +48,7 @@ class VideoCleanAnimationActivity : BaseActivity<ActivityAppProcessAnimationBind
binding.tv.text = "Completed!" binding.tv.text = "Completed!"
delay(1000) delay(1000)
AdmobMaxHelper.admobMaxShowInterstitialAd(this@VideoCleanAnimationActivity) { admobMaxShowInterstitialAd {
startActivity(Intent(this@VideoCleanAnimationActivity, ManagerActivity::class.java)) startActivity(Intent(this@VideoCleanAnimationActivity, ManagerActivity::class.java))
finish() finish()
} }
......
package com.base.datarecovery.ads
import AdMaxNativeUtils
import android.app.Activity
import android.util.Log
import android.view.ViewGroup
import com.base.datarecovery.R
import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.ads.admob.AdmobNativeUtils
import com.base.datarecovery.ads.admob.AdmobOpenUtils
import com.base.datarecovery.ads.max.AdMaxInit
import com.base.datarecovery.ads.max.AdMaxInit.initAdMax
import com.base.datarecovery.ads.max.AdMaxInterstitialUtils
import com.base.datarecovery.ads.max.AdMaxOpenUtils
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.utils.AppPreferences
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import com.google.android.gms.ads.MobileAds
import java.util.concurrent.atomic.AtomicBoolean
object AdmobMaxHelper {
var isBlack: Boolean = false
private val TAG = ""
var isAdInit = AtomicBoolean(false)
fun haveSpAdmobTrueMaxFalse(): Boolean {
return AppPreferences.getInstance().getString("admobTrueMaxFalse", "-1").toInt() != -1
}
private fun getSpAdmobTrueMaxFalse(): Boolean {
val ss = AppPreferences.getInstance().getString("admobTrueMaxFalse", "1").toInt()
return ss == 1
}
fun showBackInterAdSp(): Boolean {
val isShowBackIntAd = AppPreferences.getInstance().getString("isShowBackIntAd", "0").toInt()
//1要看插屏 0不看
return isShowBackIntAd == 1
}
fun showDeleteAdSp(): Boolean {
val isDeleteInterAd = AppPreferences.getInstance().getString("isDeleteInterAd", "0").toInt()
//1要看插屏 0不看
return isDeleteInterAd == 1
}
fun isOpenAdLoaded(): Boolean {
return if (getSpAdmobTrueMaxFalse()) {
AdmobOpenUtils.isOpenAdLoaded()
} else {
AdMaxOpenUtils.isOpenAdLoaded()
}
}
//展示广告关闭时赋值
var lastShowedOnHiddenTime = 0L
fun admobMaxShowInterstitialAd(activity: Activity, isLoading: Boolean = true, onHidden: (() -> Unit)? = null) {
if (isBlack) {
EventUtils.event("ad_black", "interAd")
onHidden?.invoke()
return
}
val isShowLoadingAd = AppPreferences.getInstance().getString("isShowLoadingAd", "0").toInt()
if (isShowLoadingAd == 0 && isLoading) {
EventUtils.event("ad_switch_close")
onHidden?.invoke()
return
}
val adInterval = AppPreferences.getInstance().getString("adInterval", "0").toInt()
if ((System.currentTimeMillis() - lastShowedOnHiddenTime) < adInterval * 1000 && lastShowedOnHiddenTime != 0L) {
onHidden?.invoke()
EventUtils.event("ad_interval")
return
}
if (getSpAdmobTrueMaxFalse()) {
AdmobInterstitialUtils.showInterstitialAd(activity) {
onHidden?.invoke()
}
} else {
AdMaxInterstitialUtils.showInterstitialAd(activity) {
onHidden?.invoke()
}
}
}
fun admobMaxShowOpenAd(activity: Activity, showBeforeAction: (flag: Boolean) -> Unit, onHidden: (() -> Unit)? = null) {
if (isBlack) {
onHidden?.invoke()
EventUtils.event("ad_black", "openAd")
return
}
if (getSpAdmobTrueMaxFalse()) {
AdmobOpenUtils.showAppOpenAd(activity, showBefore = showBeforeAction) {
onHidden?.invoke()
}
} else {
AdMaxOpenUtils.showAppOpenAd(activity, loadCallBack = showBeforeAction) {
onHidden?.invoke()
}
}
}
fun admobMaxShowNativeAd(activity: Activity, parent: ViewGroup, where: Int = 0) {
if (isBlack) {
return
}
if (getSpAdmobTrueMaxFalse()) {
AdmobNativeUtils.showNativeAd(activity, parent)
} else {
var layout = R.layout.layout_max_native_small
if (where == 0) {
layout = R.layout.layout_max_native_small_f8f8f8
}
if (where == 1) {
layout = R.layout.layout_max_native_big
}
if (where == 2) {
layout = R.layout.layout_max_native_big_2
}
AdMaxNativeUtils.showNativeAd(activity, parent, layout)
}
}
fun initAdmobMaxAd() {
if (isBlack) {
return
}
if (getSpAdmobTrueMaxFalse()) {
if (!isAdInit.get()) {
LogEx.logDebug(TAG, "init sp Admob")
MobileAds.initialize(BaseApplication.context) { initializationStatus ->
isAdInit.set(true)
}
}
} else {
if (!isAdInit.get()) {
LogEx.logDebug(TAG, "init sp AdMax")
BaseApplication.context.initAdMax()
}
}
}
fun preloadAd(activity: Activity) {
if (isBlack) {
return
}
if (getSpAdmobTrueMaxFalse()) {
// AdmobOpenUtils.loadAppOpenAd()
AdmobInterstitialUtils.loadInterstitialAd(activity)
} else {
if (isAdInit.get()) {
// AdMaxOpenUtils.loadAppOpenAd(activity)
AdMaxInterstitialUtils.loadInterstitialAd(activity)
} else {
AdMaxInit.maxInitAction = {
Log.d(TAG, "max init suc")
// AdMaxOpenUtils.loadAppOpenAd(activity)
// AdMaxInterstitialUtils.loadInterstitialAd(activity)
}
}
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads.admob
import android.app.Dialog
import android.content.Context
import android.os.CountDownTimer
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.core.view.isVisible
import com.base.datarecovery.R
import com.base.datarecovery.databinding.DialogAdLoadingBinding
class AdDialog(context: Context, block: (() -> Unit)? = null) :
Dialog(context, R.style.CustomDialog) {
private var countdownText: TextView? = null
init {
val binding = DialogAdLoadingBinding.inflate(LayoutInflater.from(context))
setContentView(binding.root)
setCancelable(false)
countdownText = binding.tvCountdown
}
fun setButtonClickListener(viewId: Int, listener: () -> Unit) {
val button = findViewById<View>(viewId) as? TextView
button?.setOnClickListener {
listener.invoke()
}
}
fun setCountdownText(viewId: Int) {
countdownText = findViewById(viewId)
}
fun updateCountdownText(seconds: String) {
countdownText?.text = seconds
}
fun start() {
countdownTimer.start()
}
override fun dismiss() {
super.dismiss()
// 清理引用
countdownText = null
}
private val countdownTimer = object : CountDownTimer(3000, 1000) {
override fun onTick(millisUntilFinished: Long) {
val seconds = (millisUntilFinished / 1000).toInt() + 1
countdownText?.text = "(${seconds})"
countdownText?.isVisible = true
}
override fun onFinish() {
block?.invoke()
countdownText?.isVisible = false
dismiss()
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads.admob
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import androidx.core.view.children
import com.base.datarecovery.BuildConfig
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.AppPreferences
import com.base.datarecovery.utils.LogEx
import com.google.ads.mediation.admob.AdMobAdapter
import com.google.android.gms.ads.AdListener
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.AdSize
import com.google.android.gms.ads.AdView
import java.util.UUID
object AdmobBannerUtils {
private val TAG = "AdmobBannerUtils"
private var adView: AdView? = null
private var listener: ViewTreeObserver.OnGlobalLayoutListener? = null
fun showCollapsibleBannerAd(context: Context, parent: ViewGroup) {
val isShowBanner = AppPreferences.getInstance().getString("isShowBanner", "0").toInt()
if (isShowBanner == 0) {
return
}
if (adView != null) {
adView?.destroy()
}
adView = AdView(context)
// parent.removeAllViews()
adView?.tag = "CollapsibleBannerAd"
// parent.removeAllViews()
val list = parent.children
list.forEach {
if (it.tag != "zhanweitu") {
parent.removeView(it)
}
}
parent.addView(adView)
listener = ViewTreeObserver.OnGlobalLayoutListener {
val screenPixelDensity = context.resources.displayMetrics.density
val adWidth = (parent.width / screenPixelDensity).toInt()
val adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, adWidth)
adView?.adUnitId = if (BuildConfig.DEBUG) ConfigHelper.bannerAdmobIdTest else ConfigHelper.bannerAdmobId
adView?.setAdSize(adSize)
loadCollapsibleBanner(parent)
parent.viewTreeObserver.removeOnGlobalLayoutListener(listener)
}
parent.viewTreeObserver.addOnGlobalLayoutListener(listener)
}
private fun loadCollapsibleBanner(parent: ViewGroup) {
val extras = Bundle()
extras.putString("collapsible", "bottom")
extras.putString("collapsible_request_id", UUID.randomUUID().toString())
val adRequest =
AdRequest.Builder().addNetworkExtrasBundle(AdMobAdapter::class.java, extras).build()
adView?.adListener =
object : AdListener() {
override fun onAdLoaded() {}
override fun onAdClosed() {
super.onAdClosed()
LogEx.logDebug(TAG, "onAdClosed")
val removeList = arrayListOf<View>()
parent.children.forEach {
if (it.tag != "CollapsibleBannerAd") {
removeList.add(it)
}
}
removeList.forEach {
parent.removeView(it)
}
}
}
adView?.loadAd(adRequest)
}
}
\ No newline at end of file
package com.base.datarecovery.ads.admob
import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.widget.Toast
import com.base.datarecovery.BuildConfig
import com.base.datarecovery.R
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.AdmobMaxHelper.lastShowedOnHiddenTime
import com.base.datarecovery.ads.admob.AdmobEvent.clickAd
import com.base.datarecovery.ads.admob.AdmobEvent.pullAd
import com.base.datarecovery.ads.admob.AdmobEvent.showAd
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.view.CustomDialog
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.FullScreenContentCallback
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.interstitial.InterstitialAd
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
import org.json.JSONObject
import java.util.UUID
object AdmobInterstitialUtils {
private var interAd: InterstitialAd? = null
private var interLoadTime = Long.MAX_VALUE
private var adLastDisplayTime: Long = 0
private val mRequest = AdRequest.Builder().build()
@SuppressLint("StaticFieldLeak")
private var customDialog: CustomDialog? = null
private fun isAdExpired(): Boolean {
return System.currentTimeMillis() - interLoadTime > 1000 * 60 * 60
}
fun showInterstitialAd(
activity: Activity,
isReLoadAd: Boolean = false,
isShowDialog: Boolean = true,
onHidden: (() -> Unit)? = null
) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
val obj = JSONObject()
obj.put("ad_unit", "interAd")
EventUtils.event("ad_prepare_show", ext = obj)
if (isAdExpired()) {
val obj = JSONObject()
obj.put("ad_unit", "interAd")
EventUtils.event("ad_expire", ext = obj)
interAd = null
loadInterstitialAd(activity)
onHidden?.invoke()
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
onHidden?.invoke()
return
}
if (interAd != null) {
showIntervalDialogAndShowAd(activity, isShowDialog, onHidden, 2)
} else {
showAdDialogAndLoadInterstitial(activity, isReLoadAd, isShowDialog, onHidden)
}
}
fun loadInterstitialAd(activity: Activity, onLoad: (() -> Unit)? = null) {
if (interAd != null) {
onLoad?.invoke()
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
onLoad?.invoke()
return
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "interAd")
obj.put("from", activity.javaClass.simpleName)
EventUtils.event("ad_pull_start", ext = obj)
InterstitialAd.load(
activity,
if (BuildConfig.DEBUG) ConfigHelper.interAdmobIdTest else ConfigHelper.interAdmobId,
mRequest,
object : InterstitialAdLoadCallback() {
override fun onAdFailedToLoad(p0: LoadAdError) {
AdDisplayUtils.getInstance().incrementAdRequestFailCount()
interAd = null
onLoad?.invoke()
pullAd(p0.responseInfo, "interAd", p0.message, reqId = reqId)
if (BuildConfig.DEBUG) {
Toast.makeText(
BaseApplication.context,
"拉取失败" + p0.message,
Toast.LENGTH_SHORT
).show()
}
}
override fun onAdLoaded(ad: InterstitialAd) {
interAd = ad
onLoad?.invoke()
interLoadTime = System.currentTimeMillis()
pullAd(ad.responseInfo, "interAd", reqId = reqId)
ad.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(ad)
}
})
}
private fun showIntervalDialogAndShowAd(
activity: Activity,
isShowDialog: Boolean,
onHidden: (() -> Unit)?,
interval: Int
) {
displayInterstitialAd(activity, onHidden)
}
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
interAd = null
thisInterAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
clickAd(thisInterAd?.responseInfo, "interAd")
AdDisplayUtils.getInstance().incrementAdClickCount()
}
override fun onAdDismissedFullScreenContent() {
interAd = null
onHidden?.invoke()
loadInterstitialAd(activity)
lastShowedOnHiddenTime = System.currentTimeMillis()
}
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
interAd = null
onHidden?.invoke()
loadInterstitialAd(activity)
}
override fun onAdShowedFullScreenContent() {
showAd(thisInterAd?.responseInfo, "interAd", activity)
AdDisplayUtils.getInstance().incrementAdDisplayCount()
adLastDisplayTime = System.currentTimeMillis() / 1000
}
}
thisInterAd?.show(activity)
}
}
\ No newline at end of file
package com.base.datarecovery.ads.admob
import android.app.Activity
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.ViewGroup
import android.view.ViewTreeObserver
import androidx.core.view.isVisible
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxAdViewAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAdView
import com.applovin.mediation.ads.MaxAppOpenAd
import com.applovin.mediation.ads.MaxInterstitialAd
import com.applovin.mediation.nativeAds.MaxNativeAdListener
import com.applovin.mediation.nativeAds.MaxNativeAdLoader
import com.applovin.mediation.nativeAds.MaxNativeAdView
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkInitializationConfiguration
import com.base.datarecovery.BuildConfig
import com.base.datarecovery.GlobalConfig.DEFAULT_SWITCH
import com.base.datarecovery.GlobalConfig.ID_ADMOB_BANNER
import com.base.datarecovery.GlobalConfig.ID_ADMOB_INTER
import com.base.datarecovery.GlobalConfig.ID_ADMOB_NATIVE
import com.base.datarecovery.GlobalConfig.ID_ADMOB_OPEN
import com.base.datarecovery.GlobalConfig.ID_MAX_BANNER
import com.base.datarecovery.GlobalConfig.ID_MAX_INTER
import com.base.datarecovery.GlobalConfig.ID_MAX_NATIVE
import com.base.datarecovery.GlobalConfig.ID_MAX_OPEN
import com.base.datarecovery.GlobalConfig.KEY_MAX
import com.base.datarecovery.GlobalConfig.useAdmob
import com.base.datarecovery.GlobalConfig.useBlacklist
import com.base.datarecovery.R
import com.base.datarecovery.utils.AppPreferences
import com.google.ads.mediation.admob.AdMobAdapter
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.AdListener
import com.google.android.gms.ads.AdLoader
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.AdSize
import com.google.android.gms.ads.AdView
import com.google.android.gms.ads.FullScreenContentCallback
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.appopen.AppOpenAd
import com.google.android.gms.ads.identifier.AdvertisingIdClient
import com.google.android.gms.ads.interstitial.InterstitialAd
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
import com.google.android.gms.ads.nativead.NativeAd
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import java.lang.ref.WeakReference
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
import java.util.UUID
import java.util.concurrent.ConcurrentLinkedDeque
import kotlin.random.Random
object AdmobManager {
//
private const val TAG = "AdmobManager"
//
private const val KEY_AD_INTERVAL = "adInterval"
private const val KEY_AD_INTER_INTERVAL = "adInterInterval"
private const val KEY_AD_INTER_INTERVAL_START = "adInterIntervalStart"
private const val KEY_AD_INTER_INTERVAL_END = "adInterIntervalEnd"
private const val KEY_AD_NATIVE_INTERVAL = "adNativeInterval"
private const val KEY_AD_REQUEST = "adRequest"
private const val KEY_AD_CLICK = "adClick"
private const val KEY_AD_SHOW = "openadShow"
private const val KEY_INTER_AD_SHOW = "interadShow"
private const val KEY_NATIVE_AD_SHOW = "nativeadShow"
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_BOTTOM = "isShowAdNativeBottom"
private const val KEY_NA_ADS = "naAdS"
private const val KEY_IS_SHOW_AD_INTER = "isShowAdInter"
private const val KEY_IS_LOADING_INTER = "isloadingInter"
private const val KEY_IS_SHOW_AD_BACK_INTER = "isShowAdBackInter"
private const val KEY_IS_SHOW_AD_RESULT_BACK_INTER = "isShowAdResultBackInter"
private const val DEFAULT_AD_INTERVAL = "20"
private const val DEFAULT_AD_INTER_INTERVAL = "30"
private const val DEFAULT_AD_INTER_INTERVAL_START = "40"
private const val DEFAULT_AD_INTER_INTERVAL_END = "70"
private const val DEFAULT_AD_NATIVE = "20"
private const val DEFAULT_AD_REQUEST = "100"
private const val DEFAULT_AD_CLICK = "10"
private const val DEFAULT_OPEN_AD_SHOW = "10"
private const val DEFAULT_INTER_AD_SHOW = "10"
private const val DEFAULT_NATIVE_AD_SHOW = "20"
//
private const val AD_UNIT_APP_OPEN = "openAd"
private const val AD_UNIT_INTER = "interAd"
private const val AD_UNIT_NATIVE = "nativeAd"
private const val NO_AD = "no_ad"
private const val NUMBER_REQUEST = "number_request"
private const val NUMBER_DISPLAY = "number_display"
private const val NUMBER_INTER_DISPLAY = "number_inter_display"
private const val NUMBER_NATIVE_DISPLAY = "number_native_display"
private const val NUMBER_CLICK = "number_click"
private const val LIMIT_ERROR_BLACKLIST = "limit_error_blacklist"
private const val LIMIT_ERROR_REQUEST = "limit_error_request"
private const val LIMIT_ERROR_DISPLAY = "limit_error_display"
private const val LIMIT_ERROR_CLICK = "limit_error_click"
private const val LIMIT_ERROR_INTERVAL = "limit_error_interval"
private const val SAVE_DATE = "save_date"
private var appOpenAd: AppOpenAd? = null
private var appOpenMaxAd: MaxAppOpenAd? = null
private var appOpenAdLoadTime: Long = 0
private var isLoadingAppOpenAd = false
private var interstitialAd: InterstitialAd? = null
private var interstitialMaxAd: MaxInterstitialAd? = null
private var interstitialAdLoadTime: Long = 0
private var isLoadingInterstitialAd = false
private var nativeAdLoadTime: Long = 0
private var isLoadingNativeAd = false
private val nativeCacheItems = ConcurrentLinkedDeque<NativeAd>()
private var maxAdCacheItems = ConcurrentLinkedDeque<MaxAd>()
private var maxNativeAdLoaderCacheItems = ConcurrentLinkedDeque<MaxNativeAdLoader>()
private var appOpenAdLastShowTime = 0L
get() {
return AppPreferences.getInstance().getLong("OPEN_AD_LAST_SHOW_TIME", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("OPEN_AD_LAST_SHOW_TIME", value)
}
private var interstitialAdLastShowTime = 0L
get() {
return AppPreferences.getInstance().getLong("INTER_AD_LAST_SHOW_TIME", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("INTER_AD_LAST_SHOW_TIME", value)
}
private var nativeAdLastShowTime = 0L
get() {
return AppPreferences.getInstance().getLong("NATIVE_AD_LAST_SHOW_TIME", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("NATIVE_AD_LAST_SHOW_TIME", value)
}
private var showTime
get() = AppPreferences.getInstance().getString(SAVE_DATE,"")
set(value) = AppPreferences.getInstance().put(SAVE_DATE, value)
private const val SHOW_INTER_COUNT = "showInterCount"
private var showInterCount
get() = AppPreferences.getInstance().getInt(SHOW_INTER_COUNT,0)
set(value) = AppPreferences.getInstance().put(SHOW_INTER_COUNT, value)
fun init(
context: Context,
loaded: (Int) -> Unit,
failed: () -> Unit,
) {
if (isBlacklist()) {
failed.invoke()
return
}
if (isAppOpenAdAvailable()) {
loaded.invoke(0)
return
}
if (isInterstitialAdAvailable()) {
loaded.invoke(1)
loadAppOpenAd(context)
return
}
loadAppOpenAd(
context,
{ loaded.invoke(0) },
{ loadInterstitialAd(context, { loaded.invoke(1) }, failed) }
)
}
fun Context.initMax() {
MainScope().launch(CoroutineExceptionHandler { _, _ -> } + Dispatchers.Default) {
val initConfig = AppLovinSdkInitializationConfiguration.builder(
KEY_MAX, this@initMax
).setMediationProvider(AppLovinMediationProvider.MAX)
if (BuildConfig.DEBUG) initConfig.testDeviceAdvertisingIds = arrayListOf(
AdvertisingIdClient.getAdvertisingIdInfo(this@initMax).id
)
AppLovinSdk.getInstance(this@initMax).initialize(initConfig.build()) {
}
}
}
fun loadAppOpenAd(
context: Context,
loaded: (() -> Unit?)? = null,
failed: (() -> Unit?)? = null,
) {
if (!checkAvailable(AD_UNIT_APP_OPEN)) {
failed?.invoke()
return
}
if (isLoadingAppOpenAd) {
failed?.invoke()
return
}
isLoadingAppOpenAd = true
Log.d(TAG, "app open Ad load.")
val reqId = UUID.randomUUID().toString()
ReportAdUtils.pullStartAd(
reqId,
AD_UNIT_APP_OPEN,
(context as Activity).javaClass.simpleName
)
if (isAdmob()) {
val adRequest = AdRequest.Builder().build()
AppOpenAd.load(
context,
ID_ADMOB_OPEN,
adRequest,
object : AppOpenAd.AppOpenAdLoadCallback() {
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
Log.d(TAG, "app open failed to load: ${loadAdError.message}")
isLoadingAppOpenAd = false
failed?.invoke()
ReportAdUtils.pullAd(
loadAdError.responseInfo,
AD_UNIT_APP_OPEN,
loadAdError.message,
reqId
)
}
override fun onAdLoaded(ad: AppOpenAd) {
Log.d(TAG, "app open Ad was loaded.")
appOpenAd = ad
appOpenAdLoadTime = System.currentTimeMillis()
isLoadingAppOpenAd = false
loaded?.invoke()
calculate(NUMBER_REQUEST)
ReportAdUtils.pullAd(ad.responseInfo, AD_UNIT_APP_OPEN, reqId = reqId)
ad.onPaidEventListener = ReportAdUtils.EventOnPaidEventListener(ad)
}
})
} else {
appOpenMaxAd = MaxAppOpenAd(ID_MAX_OPEN, context)
appOpenMaxAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(ad: MaxAd) {
Log.d(TAG, "app open Ad Max was loaded.")
appOpenAdLoadTime = System.currentTimeMillis()
loaded?.invoke()
calculate(NUMBER_REQUEST)
isLoadingAppOpenAd = false
}
override fun onAdDisplayed(p0: MaxAd) {
}
override fun onAdHidden(p0: MaxAd) {
}
override fun onAdClicked(p0: MaxAd) {
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
Log.d(TAG, "app open Max failed to load: $p0 ${p1.message}")
isLoadingAppOpenAd = false
failed?.invoke()
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
}
})
appOpenMaxAd?.loadAd()
}
}
fun loadInterstitialAd(
context: Context,
loaded: (() -> Unit?)? = null,
failed: (() -> Unit?)? = null,
) {
if (!checkAvailable(AD_UNIT_INTER)) {
failed?.invoke()
return
}
if (isLoadingInterstitialAd) {
failed?.invoke()
return
}
isLoadingInterstitialAd = true
Log.d(TAG, "interstitial Ad load.")
val reqId = UUID.randomUUID().toString()
ReportAdUtils.pullStartAd(
reqId,
AD_UNIT_INTER,
(context as Activity).javaClass.simpleName
)
if (isAdmob()) {
val adRequest = AdRequest.Builder().build()
InterstitialAd.load(
context,
ID_ADMOB_INTER,
adRequest,
object : InterstitialAdLoadCallback() {
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
Log.d(TAG, "interstitial Ad failed to load: ${loadAdError.message}")
interstitialAd = null
isLoadingInterstitialAd = false
failed?.invoke()
ReportAdUtils.pullAd(
loadAdError.responseInfo,
AD_UNIT_INTER,
loadAdError.message,
reqId
)
}
override fun onAdLoaded(ad: InterstitialAd) {
Log.d(TAG, "interstitial Ad was loaded.")
interstitialAd = ad
interstitialAdLoadTime = System.currentTimeMillis()
isLoadingInterstitialAd = false
loaded?.invoke()
calculate(NUMBER_REQUEST)
ReportAdUtils.pullAd(ad.responseInfo, AD_UNIT_INTER, reqId = reqId)
ad.onPaidEventListener = ReportAdUtils.EventOnPaidEventListener(ad)
}
})
} else {
interstitialMaxAd = MaxInterstitialAd(ID_MAX_INTER, context)
interstitialMaxAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) {
Log.d(TAG, "interstitial Ad Max was loaded.")
interstitialAdLoadTime = System.currentTimeMillis()
isLoadingInterstitialAd = false
loaded?.invoke()
calculate(NUMBER_REQUEST)
}
override fun onAdDisplayed(p0: MaxAd) {
}
override fun onAdHidden(p0: MaxAd) {
}
override fun onAdClicked(p0: MaxAd) {
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
Log.d(TAG, "interstitial Ad failed to load: ${p1.message}")
interstitialMaxAd = null
isLoadingInterstitialAd = false
failed?.invoke()
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
}
})
interstitialMaxAd?.loadAd()
}
}
fun loadNativeAd(activity: Activity, loaded: (() -> Unit?)? = null) {
if (isBlacklist()) {
return
}
Log.d(TAG, "native Ad load.")
val reqId = UUID.randomUUID().toString()
ReportAdUtils.pullStartAd(reqId, AD_UNIT_NATIVE, activity.javaClass.simpleName)
if (isAdmob()) {
val adLoader = AdLoader.Builder(
activity,
ID_ADMOB_NATIVE
).forNativeAd {
Log.d(TAG, "native Ad loaded.")
nativeAdLoadTime = System.currentTimeMillis()
nativeCacheItems.offer(it)
ReportAdUtils.pullAd(it.responseInfo, AD_UNIT_NATIVE, reqId = reqId)
it.setOnPaidEventListener(ReportAdUtils.EventOnPaidEventListener(it))
isLoadingNativeAd = false
loaded?.invoke()
}.withAdListener(object : AdListener() {
override fun onAdLoaded() {
super.onAdLoaded()
}
override fun onAdClicked() {
Log.d(TAG, "native Ad clicked.")
ReportAdUtils.clickAd(
nativeCacheItems.lastOrNull()?.responseInfo,
AD_UNIT_NATIVE
)
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
Log.d(TAG, "native Ad failed to load. ${loadAdError.message}")
ReportAdUtils.pullAd(
loadAdError.responseInfo,
AD_UNIT_NATIVE,
loadAdError.message,
reqId
)
}
}).build()
adLoader.loadAd(AdRequest.Builder().build())
} else {
val nativeAdLoader = MaxNativeAdLoader(ID_MAX_NATIVE, activity)
nativeAdLoader.setNativeAdListener(object : MaxNativeAdListener() {
override fun onNativeAdLoaded(nativeAdView: MaxNativeAdView?, ad: MaxAd) {
Log.d(TAG, "native Ad Max loaded.")
nativeAdLoadTime = System.currentTimeMillis()
maxAdCacheItems.offer(ad)
maxNativeAdLoaderCacheItems.offer(nativeAdLoader)
loaded?.invoke()
}
override fun onNativeAdLoadFailed(adUnitId: String, error: MaxError) {
Log.d(TAG, "native Ad Max failed to load. ${error.message}")
}
override fun onNativeAdClicked(ad: MaxAd) {
Log.d(TAG, "native Ad Max clicked.")
}
})
nativeAdLoader.loadAd()
}
}
fun showAppOpenAd(
activity: Activity,
dismissed: (() -> Unit?)? = null,
completed: (() -> Unit)? = null,
failed: (() -> Unit?)? = null,
isRetry: Boolean = false
) {
if (activity.isFinishing || activity.isDestroyed) return
if (!checkAvailable(AD_UNIT_APP_OPEN, true)) {
failed?.invoke()
return
}
if (!isRetry) ReportAdUtils.showPrepareAd(AD_UNIT_APP_OPEN)
if (!isAppOpenAdAvailable()) {
Log.d(TAG, "The app open ad is not ready yet.")
// ReportAdUtils.limitErrorAd(NO_AD, AD_UNIT_APP_OPEN)
loadAppOpenAd(activity, {
showAppOpenAd(activity, dismissed, completed, failed, true)
}, {
failed?.invoke()
})
return
}
if (isAdmob()) {
appOpenAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
Log.d(TAG, "app open Ad was clicked")
calculate(NUMBER_CLICK)
ReportAdUtils.clickAd(appOpenAd?.responseInfo, AD_UNIT_APP_OPEN)
}
override fun onAdDismissedFullScreenContent() {
Log.d(TAG, "app open Ad dismissed fullscreen content.")
appOpenAdLastShowTime = System.currentTimeMillis()
dismissed?.invoke()
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
Log.d(TAG, "app open failed to show: ${adError.message}")
appOpenAd = null
failed?.invoke()
ReportAdUtils.showErrorAd(adError.message, AD_UNIT_APP_OPEN)
loadAppOpenAd(activity)
}
override fun onAdShowedFullScreenContent() {
Log.d(TAG, "app open Ad showed fullscreen content.")
calculate(NUMBER_DISPLAY)
completed?.invoke()
ReportAdUtils.showAd(appOpenAd?.responseInfo, AD_UNIT_APP_OPEN, activity)
appOpenAd = null
loadAppOpenAd(activity)
}
}
appOpenAd?.show(activity)
} else {
appOpenMaxAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(ad: MaxAd) {
}
override fun onAdDisplayed(p0: MaxAd) {
Log.d(TAG, "app open Ad Max showed fullscreen content.")
appOpenMaxAd = null
calculate(NUMBER_DISPLAY)
completed?.invoke()
loadAppOpenAd(activity)
}
override fun onAdHidden(p0: MaxAd) {
Log.d(TAG, "app open Ad Max dismissed fullscreen content.")
appOpenAdLastShowTime = System.currentTimeMillis()
dismissed?.invoke()
}
override fun onAdClicked(p0: MaxAd) {
Log.d(TAG, "app open Ad Max was clicked")
calculate(NUMBER_CLICK)
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
Log.d(TAG, "app open Max failed to show: ${p1.message}")
appOpenMaxAd = null
failed?.invoke()
ReportAdUtils.showErrorAd(p1.message, AD_UNIT_APP_OPEN)
loadAppOpenAd(activity)
}
})
appOpenMaxAd?.showAd()
}
}
private var dialogRef: WeakReference<AdDialog>? = null
fun showInterstitialAd(
activity: Activity,
dismissed: (() -> Unit?)? = null,
completed: (() -> Unit)? = null,
failed: (() -> Unit?)? = null,
isRetry: Boolean = false
) {
if (activity.isFinishing || activity.isDestroyed) return
if (!checkAvailable(AD_UNIT_INTER, true)) {
failed?.invoke()
return
}
if (!isRetry) ReportAdUtils.showPrepareAd(AD_UNIT_INTER)
val currentDialog = dialogRef?.get()
if (currentDialog == null || !currentDialog.isShowing) {
val dialog = AdDialog(activity) { showInterAd(activity, dismissed, completed, failed) }
runCatching {
dialog.show()
dialogRef = WeakReference(dialog)
}
}
if (!isInterstitialAdAvailable()) {
Log.d(TAG, "The interstitial ad is not ready yet.")
// ReportAdUtils.limitErrorAd(NO_AD, INTERSTITIAL_AD_UNIT)
loadInterstitialAd(activity, {
showInterstitialAd(activity, dismissed, completed, failed, true)
}, {
failed?.invoke()
if (!activity.isFinishing && !activity.isDestroyed)
dialogRef?.get()?.dismiss()
})
return
}
dialogRef?.get()?.start()
}
private fun showInterAd(
activity: Activity,
dismissed: (() -> Unit?)? = null,
completed: (() -> Unit)? = null,
failed: (() -> Unit?)? = null,
) {
if (isAdmob()) {
interstitialAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
Log.d(TAG, "interstitial Ad was clicked")
calculate(NUMBER_CLICK)
ReportAdUtils.clickAd(interstitialAd?.responseInfo, AD_UNIT_INTER)
}
override fun onAdDismissedFullScreenContent() {
Log.d(TAG, "interstitial Ad was dismissed.")
interstitialAdLastShowTime = System.currentTimeMillis()
dismissed?.invoke()
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
Log.d(TAG, "interstitial Ad failed to show: ${adError.message}")
interstitialAd = null
failed?.invoke()
ReportAdUtils.showErrorAd(adError.message, AD_UNIT_INTER)
loadInterstitialAd(activity)
}
override fun onAdShowedFullScreenContent() {
Log.d(TAG, "interstitial Ad showed fullscreen content.")
completed?.invoke()
calculate(NUMBER_INTER_DISPLAY)
ReportAdUtils.showAd(
interstitialAd?.responseInfo,
AD_UNIT_INTER,
activity
)
interstitialAd = null
loadInterstitialAd(activity)
showInterCount++
}
}
interstitialAd?.show(activity)
} else {
interstitialMaxAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) {
}
override fun onAdDisplayed(p0: MaxAd) {
Log.d(TAG, "interstitial Ad Max showed fullscreen content.")
interstitialMaxAd = null
completed?.invoke()
calculate(NUMBER_INTER_DISPLAY)
loadInterstitialAd(activity)
}
override fun onAdHidden(p0: MaxAd) {
Log.d(TAG, "interstitial Ad Max was dismissed.")
interstitialAdLastShowTime = System.currentTimeMillis()
dismissed?.invoke()
}
override fun onAdClicked(p0: MaxAd) {
Log.d(TAG, "interstitial Ad Max was clicked")
calculate(NUMBER_CLICK)
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
Log.d(TAG, "interstitial Ad MaX failed to show: ${p1.message}")
interstitialMaxAd = null
failed?.invoke()
ReportAdUtils.showErrorAd(p1.message, AD_UNIT_INTER)
loadInterstitialAd(activity)
}
})
interstitialMaxAd?.showAd(activity)
}
}
fun showNativeAd(
activity: Activity,
parent: ViewGroup,
layout: Int = R.layout.layout_native_custom,
isShowAdNative: Boolean = isShowAdNative(),
isRetry: Boolean = false
) {
if (activity.isFinishing || activity.isDestroyed) return
if (!isShowAdNative || isBlacklist()) {
return
}
if (!isRetry) ReportAdUtils.showPrepareAd(AD_UNIT_NATIVE)
if (isAdmob()) {
if (!checkAvailable(AD_UNIT_NATIVE)) {
return
}
val nativeAd = getNativeAd()
if (nativeAd == null) {
Log.d(TAG, "The native ad is not ready yet.")
// ReportAdUtils.limitErrorAd(NO_AD, AD_UNIT_NATIVE)
loadNativeAd(activity) {
showNativeAd(
activity,
parent,
layout,
isShowAdNative,
true
)
}
return
}
NativeView(parent.context, layout).run {
nativeAdLastShowTime = System.currentTimeMillis()
parent.removeAllViews()
setNativeAd(nativeAd)
parent.addView(this)
parent.isVisible = true
ReportAdUtils.showAd(nativeAd.responseInfo, AD_UNIT_NATIVE, activity)
calculate(NUMBER_NATIVE_DISPLAY)
}
if (nativeCacheItems.size == 0)
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
}
NativeView(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)
}
fun checkNative(): Boolean {
val lastShowTime = nativeAdLastShowTime
var adInterval = AppPreferences.getInstance().getString(KEY_AD_NATIVE_INTERVAL, DEFAULT_AD_NATIVE)
.toInt() * 1000
val interval = adInterval
val flag = System.currentTimeMillis() - lastShowTime > interval
return flag
}
private fun getNativeAd(): NativeAd? {
val nativeAd = nativeCacheItems.poll() ?: return null
if (!isNativeAdAvailable()) {
return getNativeAd()
}
return nativeAd
}
fun showBannerAd(
context: Context,
adViewContainer: ViewGroup,
collapsible: String? = "bottom",
completed: (() -> Unit?)? = null,
failed: (() -> Unit?)? = null
) {
if (!isAdmob()) return
adViewContainer.viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
val screenPixelDensity = context.resources.displayMetrics.density
val adWidth = (adViewContainer.width / screenPixelDensity).toInt()
val adSize =
AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, adWidth)
showBannerAd(context, adViewContainer, adSize, collapsible, completed, failed)
adViewContainer.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
})
}
fun showBannerAd(
context: Context,
adViewContainer: ViewGroup,
adSize: AdSize,
collapsible: String? = "bottom",
completed: (() -> Unit?)? = null,
failed: (() -> Unit?)? = null
) {
if (!isShowAdBanner() || isBlacklist()) {
failed?.invoke()
return
}
Log.d(TAG, "banner Ad load.")
val adView = AdView(context)
adView.adUnitId = ID_ADMOB_BANNER
adView.setAdSize(adSize)
val extras = Bundle()
// extras.putString("collapsible", collapsible)
val adRequest = AdRequest.Builder()
.addNetworkExtrasBundle(AdMobAdapter::class.java, extras)
.build()
adView.loadAd(adRequest)
adView.adListener = object : AdListener() {
override fun onAdClicked() {
Log.d(TAG, "banner Ad clicked.")
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
Log.d(TAG, "banner Ad failed to load: ${loadAdError.message}")
failed?.invoke()
}
override fun onAdLoaded() {
Log.d(TAG, "banner Ad loaded.")
completed?.invoke()
}
}
adViewContainer.removeAllViews()
adViewContainer.addView(adView)
}
private fun showBannerAd(
context: Context,
adViewContainer: ViewGroup,
completed: (() -> Unit?)? = null,
failed: (() -> Unit?)? = null
) {
if (!isShowAdBanner() || isBlacklist()) {
failed?.invoke()
return
}
Log.d(TAG, "banner Ad Max load.")
val adView = MaxAdView(ID_MAX_BANNER, context)
adView.setListener(object : MaxAdViewAdListener {
override fun onAdLoaded(p0: MaxAd) {
Log.d(TAG, "banner Ad Max loaded.")
completed?.invoke()
}
override fun onAdDisplayed(p0: MaxAd) {
}
override fun onAdHidden(p0: MaxAd) {
}
override fun onAdClicked(p0: MaxAd) {
Log.d(TAG, "banner Ad Max clicked.")
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
Log.d(TAG, "banner Ad Max failed to load: ${p1.message}")
failed?.invoke()
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
}
override fun onAdExpanded(p0: MaxAd) {
}
override fun onAdCollapsed(p0: MaxAd) {
}
})
adViewContainer.removeAllViews()
adViewContainer.addView(adView)
adView.loadAd()
}
fun isShowAdBanner(): Boolean {
val isShowAdBanner =
AppPreferences.getInstance().getString(KEY_IS_SHOW_AD_BANNER, DEFAULT_SWITCH).toInt()
return isShowAdBanner == 1
}
fun isShowAdNative(): Boolean {
val isShowAdNative =
AppPreferences.getInstance().getString(KEY_IS_SHOW_AD_NATIVE, DEFAULT_SWITCH).toInt()
return isShowAdNative == 1
}
fun isShowAdNativeBottom(): Boolean {
val isShowAdNative =
AppPreferences.getInstance().getString(KEY_IS_SHOW_AD_NATIVE_BOTTOM, DEFAULT_SWITCH).toInt()
return isShowAdNative == 1
}
fun isShowNads(): Boolean {
val isShowAdNative =
AppPreferences.getInstance().getString(KEY_NA_ADS, DEFAULT_SWITCH).toInt()
return isShowAdNative == 1
}
fun isShowAdInter(): Boolean {
val isShowAdInter =
AppPreferences.getInstance().getString(KEY_IS_SHOW_AD_INTER, DEFAULT_SWITCH).toInt()
return isShowAdInter == 1
}
fun isShowLoadingAdInter(): Boolean {
val isShowAdInter =
AppPreferences.getInstance().getString(KEY_IS_LOADING_INTER, "0").toInt()
return isShowAdInter == 1
}
fun isShowAdBackInter(): Boolean {
val isShowAdBackInter =
AppPreferences.getInstance().getString(KEY_IS_SHOW_AD_BACK_INTER, "0").toInt()
return isShowAdBackInter == 1
}
fun isShowAdResultBackInter(): Boolean {
val isShowAdInter =
AppPreferences.getInstance().getString(KEY_IS_SHOW_AD_RESULT_BACK_INTER, DEFAULT_SWITCH)
.toInt()
return isShowAdInter == 1
}
fun isAppOpenAdAvailable(): Boolean {
return (if (isAdmob()) appOpenAd != null else appOpenMaxAd?.isReady == true) && wasLoadTimeLessThanNHoursAgo(
1,
appOpenAdLoadTime
)
}
fun isInterstitialAdAvailable(): Boolean {
return (if (isAdmob()) interstitialAd != null else interstitialMaxAd?.isReady == true) && wasLoadTimeLessThanNHoursAgo(
1,
interstitialAdLoadTime
)
}
fun isNativeAdAvailable(): Boolean {
return wasLoadTimeLessThanNHoursAgo(1, nativeAdLoadTime)
}
private fun wasLoadTimeLessThanNHoursAgo(numHours: Long, time: Long): Boolean {
val dateDifference: Long = System.currentTimeMillis() - time
val numMilliSecondsPerHour: Long = 3600000
return dateDifference < numMilliSecondsPerHour * numHours
}
private fun isBlacklist(): Boolean {
return useBlacklist
}
private fun isAdmob(): Boolean {
//return false
return useAdmob == 1
}
private fun checkAvailable(adUnit: String, checkIntervalTime: Boolean = false): Boolean {
if (isBlacklist()) {
ReportAdUtils.limitErrorAd(LIMIT_ERROR_BLACKLIST, adUnit)
return false
}
reset()
var displayNumber = AppPreferences.getInstance().getInt(NUMBER_DISPLAY,0)
val requestNumber = AppPreferences.getInstance().getInt(NUMBER_REQUEST,0)
val clickNumber = AppPreferences.getInstance().getInt(NUMBER_CLICK,0)
var adShow = AppPreferences.getInstance().getString(KEY_AD_SHOW, DEFAULT_OPEN_AD_SHOW).toInt()
if(adUnit== AD_UNIT_INTER){
adShow = AppPreferences.getInstance().getString(KEY_INTER_AD_SHOW, DEFAULT_INTER_AD_SHOW).toInt()
displayNumber= AppPreferences.getInstance().getInt(NUMBER_INTER_DISPLAY,0)
}else if(adUnit== AD_UNIT_NATIVE){
adShow = AppPreferences.getInstance().getString(KEY_NATIVE_AD_SHOW, DEFAULT_NATIVE_AD_SHOW).toInt()
displayNumber= AppPreferences.getInstance().getInt(NUMBER_NATIVE_DISPLAY,0)
}
val adRequest = AppPreferences.getInstance().getString(KEY_AD_REQUEST, DEFAULT_AD_REQUEST).toInt()
val adClick = AppPreferences.getInstance().getString(KEY_AD_CLICK, DEFAULT_AD_CLICK).toInt()
if (displayNumber >= adShow) {
ReportAdUtils.limitErrorAd(LIMIT_ERROR_DISPLAY, adUnit)
return false
}
if(adUnit== AD_UNIT_NATIVE){
return checkNative()
}
if (requestNumber >= adRequest) {
ReportAdUtils.limitErrorAd(LIMIT_ERROR_REQUEST, adUnit)
return false
}
if (clickNumber >= adClick) {
ReportAdUtils.limitErrorAd(LIMIT_ERROR_CLICK, adUnit)
return false
}
if (!checkIntervalTime) return true
var lastShowTime = appOpenAdLastShowTime
var adInterval =
AppPreferences.getInstance().getString(KEY_AD_INTERVAL, DEFAULT_AD_INTERVAL).toInt() * 1000
if (adUnit == AD_UNIT_INTER) {
lastShowTime = interstitialAdLastShowTime
if (showInterCount >1) {
val start = AppPreferences.getInstance()
.getString(KEY_AD_INTER_INTERVAL_START, DEFAULT_AD_INTER_INTERVAL_START).toInt()
val end = AppPreferences.getInstance()
.getString(KEY_AD_INTER_INTERVAL_END, DEFAULT_AD_INTER_INTERVAL_END).toInt()
adInterval = Random.nextInt(start, end) * 1000
} else {
adInterval = AppPreferences.getInstance()
.getString(KEY_AD_INTER_INTERVAL, DEFAULT_AD_INTER_INTERVAL).toInt() * 1000
}
}
val interval = adInterval
val flag = System.currentTimeMillis() - lastShowTime > interval
if (!flag) {
ReportAdUtils.limitErrorAd(LIMIT_ERROR_INTERVAL, adUnit)
}
return flag
}
fun Long.toFormatTime4(): String {
return SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).format(this)
}
fun areTimestampsSameDay(timestamp1: Long, timestamp2: Long): Boolean {
val calendar1 = Calendar.getInstance().apply { timeInMillis = timestamp1 }
val calendar2 = Calendar.getInstance().apply { timeInMillis = timestamp2 }
// 比较年、月、日是否相同
return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) &&
calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH) &&
calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH)
}
fun calculate(key: String) {
reset()
val value = AppPreferences.getInstance().getInt(key,0)
AppPreferences.getInstance().put(key, value + 1)
}
private fun reset() {
val currentTime = System.currentTimeMillis().toFormatTime4()
if (showTime.isEmpty() || showTime != currentTime) {
showTime = currentTime
AppPreferences.getInstance().put(NUMBER_REQUEST, 0)
AppPreferences.getInstance().put(NUMBER_DISPLAY, 0)
AppPreferences.getInstance().put(NUMBER_INTER_DISPLAY, 0)
AppPreferences.getInstance().put(NUMBER_NATIVE_DISPLAY, 0)
AppPreferences.getInstance().put(NUMBER_CLICK, 0)
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads.admob
import android.app.Activity
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.base.datarecovery.BuildConfig
import com.base.datarecovery.R
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.admob.AdmobEvent.clickAd
import com.base.datarecovery.ads.admob.AdmobEvent.pullAd
import com.base.datarecovery.ads.admob.AdmobEvent.showAd
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import com.google.android.gms.ads.AdListener
import com.google.android.gms.ads.AdLoader
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.nativead.NativeAd
import org.json.JSONObject
import java.util.UUID
object AdmobNativeUtils {
private val TAG = "AdmobNativeUtils"
private var nativeAd: NativeAd? = null
private var isLoading = false
private var nativeLoadTime = Long.MAX_VALUE
private var loadingListener: (() -> Unit)? = null
private val mRequest = AdRequest.Builder().build()
fun loadNativeAd() {
if (nativeAd != null) {
return
}
// if (isLoading) {
// return
// }
// isLoading = true
if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
return
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "nativeAd")
val adLoader = AdLoader.Builder(
BaseApplication.context,
if (BuildConfig.DEBUG) ConfigHelper.nativeAdmobIdTest else ConfigHelper.nativeAdmobId
).forNativeAd {
nativeLoadTime = System.currentTimeMillis()
nativeAd = it
LogEx.logDebug(TAG, "nativeAd=${nativeAd.toString()}")
// isLoading = false
loadingListener?.invoke()
pullAd(it.responseInfo, "nativeAd", reqId = reqId)
it.setOnPaidEventListener(AdmobEvent.EventOnPaidEventListener(it))
}.withAdListener(object : AdListener() {
override fun onAdClicked() {
clickAd(nativeAd?.responseInfo, "nativeAd")
}
override fun onAdFailedToLoad(p0: LoadAdError) {
LogEx.logDebug(TAG, "onAdFailedToLoad=${p0.message}")
nativeAd = null
// isLoading = false
pullAd(p0.responseInfo, "nativeAd", p0.message, reqId = reqId)
// Log.e("MXL", "NativeAdFailedToLoad: " + p0.message)
}
}).build()
adLoader.loadAd(mRequest)
}
fun showNativeAd(activity: Activity?, parent: ViewGroup, layout: Int = R.layout.layout_native_custom) {
if (!AdDisplayUtils.getInstance().shouldShowAd("NativeAd")) {
return
}
loadingListener = {
if (System.currentTimeMillis() - nativeLoadTime <= 1000 * 60 * 60) {
nativeAd?.let {
NativeView(parent.context, layout).run {
parent.removeAllViews()
setNativeAd(it)
parent.addView(this)
parent.isVisible = true
showAd(nativeAd?.responseInfo, "nativeAd", activity)
}
}
}
nativeAd = null
loadingListener = null
loadNativeAd()
}
if (nativeAd == null) {
loadNativeAd()
val obj2 = JSONObject()
obj2.put("reason", "no coach ad")
obj2.put("ad_unit", "nativeAd")
EventUtils.event("ad_nocache_pull", ext = obj2)
} else {
loadingListener?.invoke()
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads.admob
import android.app.Activity
import com.base.datarecovery.BuildConfig
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.admob.AdmobEvent.clickAd
import com.base.datarecovery.ads.admob.AdmobEvent.pullAd
import com.base.datarecovery.ads.admob.AdmobEvent.showAd
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.FullScreenContentCallback
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.appopen.AppOpenAd
import org.json.JSONObject
import java.util.UUID
object AdmobOpenUtils {
private val TAG = "AdmobOpenUtils"
private val mRequest = AdRequest.Builder().build()
private var openLoadTime = Long.MAX_VALUE
private var mOpenAd: AppOpenAd? = null
fun isOpenAdLoaded() = mOpenAd != null
fun loadAppOpenAd(skip: Boolean = false, onLoad: ((where: Int) -> Unit)? = null) {
if (mOpenAd != null || skip) {
onLoad?.invoke(1)
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
onLoad?.invoke(2)
return
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "openAd")
EventUtils.event("ad_pull_start", ext = obj)
AppOpenAd.load(
BaseApplication.context,
if (BuildConfig.DEBUG) ConfigHelper.openAdmobIdTest else ConfigHelper.openAdmobId,
mRequest,
object : AppOpenAd.AppOpenAdLoadCallback() {
override fun onAdLoaded(ad: AppOpenAd) {
openLoadTime = System.currentTimeMillis()
mOpenAd = ad
onLoad?.invoke(3)
pullAd(ad.responseInfo, "openAd", reqId = reqId)
ad.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(ad)
}
override fun onAdFailedToLoad(p0: LoadAdError) {
AdDisplayUtils.getInstance().incrementAdRequestFailCount()
LogEx.logDebug(TAG, "LoadAdError ${p0.message}")
mOpenAd = null
onLoad?.invoke(4)
pullAd(p0.responseInfo, "openAd", p0.message, reqId = reqId)
}
})
}
fun showAppOpenAd(
activity: Activity,
isRetry: Boolean = false,
showBefore: ((flag: Boolean) -> Unit)? = null, onHidden: ((where: Int) -> Unit)? = null
) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
onHidden?.invoke(1)
return
}
if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) {
LogEx.logDebug(TAG, "openLoadTime out time")
mOpenAd = null
loadAppOpenAd()
onHidden?.invoke(2)
val obj2 = JSONObject()
obj2.put("ad_unit", "openAd")
EventUtils.event("ad_expire", ext = obj2)
return
}
if (!isRetry) {
val obj1 = JSONObject()
obj1.put("ad_unit", "openAd")
EventUtils.event("ad_prepare_show", ext = obj1)
}
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)
}
}
thisMOpenAd?.show(activity)
} else {
LogEx.logDebug(TAG, "mOpenAd=null")
// onHidden?.invoke(5)
// loadAppOpenAd()
// val obj = JSONObject()
// obj.put("reason", "no_ad")
// obj.put("ad_unit", "openAd")
// EventUtils.event("ad_show_error", ext = obj)
loadAppOpenAd {
if (mOpenAd != null) {
showAppOpenAd(activity, true, showBefore, onHidden)
} else {
val obj = JSONObject()
obj.put("reason", "no_ad")
obj.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj)
onHidden?.invoke(5)
}
}
}
}
}
\ No newline at end of file
...@@ -9,19 +9,42 @@ import android.widget.Button ...@@ -9,19 +9,42 @@ 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.base.datarecovery.R import com.base.datarecovery.R
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
class NativeView @JvmOverloads constructor( class NativeView @JvmOverloads constructor(
context: Context, val layout: Int, attrs: AttributeSet? = null context: Context, val layout: Int, attrs: AttributeSet? = null
) : FrameLayout(context, attrs) { ): FrameLayout(context, attrs) {
init { init {
layoutParams = LayoutParams( layoutParams = LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
ViewGroup.LayoutParams.MATCH_PARENT, }
ViewGroup.LayoutParams.WRAP_CONTENT
) 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_app_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)
} }
fun setNativeAd(nativeAd: NativeAd?) { fun setNativeAd(nativeAd: NativeAd?) {
...@@ -30,32 +53,35 @@ class NativeView @JvmOverloads constructor( ...@@ -30,32 +53,35 @@ class NativeView @JvmOverloads constructor(
val adView = LayoutInflater.from(context) val adView = LayoutInflater.from(context)
.inflate(layout, this, false) as NativeAdView .inflate(layout, this, false) as NativeAdView
// runCatching {
// adView.advertiserView = adView.findViewById(R.id.ad_advertiser)
// }
adView.mediaView = adView.findViewById(R.id.ad_media) adView.mediaView = adView.findViewById(R.id.ad_media)
adView.headlineView = adView.findViewById(R.id.ad_headline) adView.headlineView = adView.findViewById(R.id.ad_headline)
adView.bodyView = adView.findViewById(R.id.ad_body) adView.bodyView = adView.findViewById(R.id.ad_body)
adView.callToActionView = adView.findViewById(R.id.ad_call_to_action) adView.callToActionView = adView.findViewById(R.id.ad_call_to_action)
adView.iconView = adView.findViewById(R.id.ad_app_icon) adView.iconView = adView.findViewById(R.id.ad_app_icon)
(adView.headlineView as TextView?)?.text = nativeAd.headline (adView.headlineView as TextView?)?.text = nativeAd.headline
adView.mediaView!!.mediaContent = nativeAd.mediaContent adView.mediaView?.mediaContent = nativeAd.mediaContent
if (nativeAd.body == null) { if (nativeAd.body == null) {
adView.bodyView!!.visibility = View.INVISIBLE adView.bodyView?.visibility = View.INVISIBLE
} else { } else {
adView.bodyView!!.visibility = View.VISIBLE adView.bodyView?.visibility = View.VISIBLE
(adView.bodyView as TextView?)?.text = nativeAd.body (adView.bodyView as TextView?)?.text = nativeAd.body
} }
if (nativeAd.callToAction == null) { if (nativeAd.callToAction == null) {
adView.callToActionView!!.visibility = View.INVISIBLE adView.callToActionView?.visibility = View.INVISIBLE
} else { } else {
adView.callToActionView!!.visibility = View.VISIBLE adView.callToActionView?.visibility = View.VISIBLE
(adView.callToActionView as Button?)?.text = nativeAd.callToAction (adView.callToActionView as Button?)?.text = nativeAd.callToAction
} }
if (nativeAd.icon == null) { if (nativeAd.icon == null) {
adView.iconView!!.visibility = View.GONE adView.iconView?.visibility = View.GONE
} else { } else {
(adView.iconView as ImageView?)?.setImageDrawable( (adView.iconView as ImageView?)?.setImageDrawable(
nativeAd.icon!!.drawable nativeAd.icon?.drawable
) )
adView.iconView!!.visibility = View.VISIBLE adView.iconView?.visibility = View.VISIBLE
} }
adView.setNativeAd(nativeAd) adView.setNativeAd(nativeAd)
......
...@@ -8,6 +8,7 @@ import com.base.datarecovery.utils.EventUtils ...@@ -8,6 +8,7 @@ import com.base.datarecovery.utils.EventUtils
import com.facebook.appevents.AppEventsConstants import com.facebook.appevents.AppEventsConstants
import com.facebook.appevents.AppEventsLogger import com.facebook.appevents.AppEventsLogger
import com.google.android.gms.ads.AdValue import com.google.android.gms.ads.AdValue
import com.google.android.gms.ads.AdView
import com.google.android.gms.ads.OnPaidEventListener import com.google.android.gms.ads.OnPaidEventListener
import com.google.android.gms.ads.ResponseInfo import com.google.android.gms.ads.ResponseInfo
import com.google.android.gms.ads.appopen.AppOpenAd import com.google.android.gms.ads.appopen.AppOpenAd
...@@ -20,7 +21,28 @@ import com.google.firebase.ktx.Firebase ...@@ -20,7 +21,28 @@ import com.google.firebase.ktx.Firebase
import org.json.JSONObject import org.json.JSONObject
import kotlin.random.Random import kotlin.random.Random
object AdmobEvent { object ReportAdUtils {
private val taichiPref by lazy {
BaseApplication.context.getSharedPreferences("TaichiTroasCache", 0)
}
private val taichiSharedPreferencesEditor by lazy {
taichiPref.edit()
}
fun pullStartAd(
reqId: String,
adUnit: String,
className: String,
) {
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_unit", adUnit)
obj.put("from", className)
EventUtils.event("ad_pull_start", "", ext = obj)
}
fun pullAd( fun pullAd(
responseInfo: ResponseInfo?, responseInfo: ResponseInfo?,
adUnit: String, adUnit: String,
...@@ -52,15 +74,7 @@ object AdmobEvent { ...@@ -52,15 +74,7 @@ object AdmobEvent {
obj.put("errMsg", error) obj.put("errMsg", error)
obj.put("status", "2") obj.put("status", "2")
} }
EventUtils.event("ad_pull", ext = obj) EventUtils.event("ad_pull", "", ext = obj)
}
private val taichiPref by lazy {
BaseApplication.context.getSharedPreferences("TaichiTroasCache", 0)
}
private val taichiSharedPreferencesEditor by lazy {
taichiPref.edit()
} }
class EventOnPaidEventListener(private val ad: Any?) : OnPaidEventListener { class EventOnPaidEventListener(private val ad: Any?) : OnPaidEventListener {
...@@ -73,6 +87,7 @@ object AdmobEvent { ...@@ -73,6 +87,7 @@ object AdmobEvent {
EventUtils.event("ad_price_limit") EventUtils.event("ad_price_limit")
return return
} }
val valueMicros = adValue.valueMicros val valueMicros = adValue.valueMicros
val currencyCode = adValue.currencyCode val currencyCode = adValue.currencyCode
val precision = adValue.precisionType val precision = adValue.precisionType
...@@ -102,8 +117,8 @@ object AdmobEvent { ...@@ -102,8 +117,8 @@ object AdmobEvent {
val previousTaichiTroasCache = taichiPref.getFloat("TaichiTroasCache", 0f) val previousTaichiTroasCache = taichiPref.getFloat("TaichiTroasCache", 0f)
val currentTaichiTroasCache = (previousTaichiTroasCache + val currentTaichiTroasCache = (previousTaichiTroasCache +
currentImpressionRevenue).toFloat() currentImpressionRevenue).toFloat()
val adValue = AppPreferences.getInstance().getString("adValue", "1").toInt() / 100f val value = AppPreferences.getInstance().getString("adValue", "1").toInt() / 100f
if (currentTaichiTroasCache >= adValue) {//如果超过0.01就触发一次tROAS taichi事件 if (currentTaichiTroasCache >= value) {//如果超过0.01就触发一次tROAS taichi事件
val roasbundle = Bundle() val roasbundle = Bundle()
roasbundle.putDouble( roasbundle.putDouble(
FirebaseAnalytics.Param.VALUE, FirebaseAnalytics.Param.VALUE,
...@@ -111,6 +126,7 @@ object AdmobEvent { ...@@ -111,6 +126,7 @@ object AdmobEvent {
) )
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, adValue.valueMicros)
taichiSharedPreferencesEditor.putFloat("TaichiTroasCache", 0f)//重新清零,开始计算 taichiSharedPreferencesEditor.putFloat("TaichiTroasCache", 0f)//重新清零,开始计算
val logger = AppEventsLogger.newLogger(BaseApplication.context) val logger = AppEventsLogger.newLogger(BaseApplication.context)
...@@ -213,13 +229,39 @@ object AdmobEvent { ...@@ -213,13 +229,39 @@ object AdmobEvent {
obj.put("mediationABTestVariant", mediationABTestVariant) obj.put("mediationABTestVariant", mediationABTestVariant)
obj.put("session_id", sessionId) obj.put("session_id", sessionId)
} }
else -> {
runCatching {
val adView = ad as AdView
val adUnitId = adView.adUnitId
val loadedAdapterResponseInfo = adView.responseInfo?.loadedAdapterResponseInfo
val adSourceName = loadedAdapterResponseInfo?.adSourceName
val adSourceId = loadedAdapterResponseInfo?.adSourceId
val adSourceInstanceName = loadedAdapterResponseInfo?.adSourceInstanceName
val adSourceInstanceId = loadedAdapterResponseInfo?.adSourceInstanceId
val sessionId = adView.responseInfo?.responseId
val extras = adView.responseInfo?.responseExtras
val mediationGroupName = extras?.getString("mediation_group_name")
val mediationABTestName = extras?.getString("mediation_ab_test_name")
val mediationABTestVariant = extras?.getString("mediation_ab_test_variant")
obj.put("ad_unit", "banner")
obj.put("adUnitId", adUnitId)
obj.put("adSourceName", adSourceName)
obj.put("adSourceId", adSourceId)
obj.put("adSourceInstanceName", adSourceInstanceName)
obj.put("adSourceInstanceId", adSourceInstanceId)
obj.put("mediationGroupName", mediationGroupName)
obj.put("mediationABTestName", mediationABTestName)
obj.put("mediationABTestVariant", mediationABTestVariant)
obj.put("session_id", sessionId)
}
}
} }
EventUtils.event("ad_price", ext = obj) EventUtils.event("ad_price", ext = obj)
} }
} }
fun clickAd(responseInfo: ResponseInfo?, adUnit: String) { fun clickAd(responseInfo: ResponseInfo?, adUnit: String) {
val response = responseInfo?.adapterResponses?.getOrNull(0) val response = responseInfo?.adapterResponses?.getOrNull(0)
val obj = JSONObject() val obj = JSONObject()
obj.put("source", response?.adSourceName) obj.put("source", response?.adSourceName)
...@@ -234,7 +276,7 @@ object AdmobEvent { ...@@ -234,7 +276,7 @@ object AdmobEvent {
obj.put("session_id", responseInfo?.responseId) obj.put("session_id", responseInfo?.responseId)
obj.put("networkname", responseInfo?.mediationAdapterClassName) obj.put("networkname", responseInfo?.mediationAdapterClassName)
obj.put("mediation", "admob") obj.put("mediation", "admob")
EventUtils.event("ad_click", ext = obj) EventUtils.event("ad_click", "", ext = obj)
} }
fun showAd(responseInfo: ResponseInfo?, adUnit: String, activity: Activity? = null) { fun showAd(responseInfo: ResponseInfo?, adUnit: String, activity: Activity? = null) {
...@@ -252,6 +294,26 @@ object AdmobEvent { ...@@ -252,6 +294,26 @@ object AdmobEvent {
obj.put("session_id", responseInfo?.responseId) obj.put("session_id", responseInfo?.responseId)
obj.put("from", activity?.javaClass?.simpleName) obj.put("from", activity?.javaClass?.simpleName)
obj.put("mediation", "admob") obj.put("mediation", "admob")
EventUtils.event("ad_show", ext = obj) EventUtils.event("ad_show", "", ext = obj)
}
fun showErrorAd(reason: String, adUnit: String) {
val obj = JSONObject()
obj.put("reason", reason)
obj.put("ad_unit", adUnit)
EventUtils.event("ad_show_error", "", ext = obj)
}
fun showPrepareAd(adUnit: String) {
val obj = JSONObject()
obj.put("ad_unit", adUnit)
EventUtils.event("ad_prepare_show", "", ext = obj)
}
fun limitErrorAd(reason: String, adUnit: String) {
val obj = JSONObject()
obj.put("reason", reason)
obj.put("ad_unit", adUnit)
EventUtils.event("ad_limit_error", "", ext = obj)
} }
} }
\ No newline at end of file
package com.base.datarecovery.ads.max
import android.os.Bundle
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdRevenueListener
import com.applovin.sdk.AppLovinSdk
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import com.facebook.FacebookSdk
import com.facebook.appevents.AppEventsConstants
import com.facebook.appevents.AppEventsLogger
import com.google.firebase.analytics.FirebaseAnalytics
import org.json.JSONObject
object AdMaxEvent {
fun pullAd(ad: MaxAd?, adUnit: String, error: String? = null, reqId: String? = null, code: Int? = null) {
val obj = JSONObject()
obj.put("UnitId", ad?.adUnitId)
obj.put("ad_unit", adUnit)
obj.put(
"creativeId",
ad?.creativeId
)
obj.put("req_id", reqId)
obj.put("status", if (ad == null) "0" else "1")
obj.put("networkname", ad?.networkName)
obj.put("placement", ad?.placement)
obj.put("networkplacement", ad?.networkPlacement)
obj.put("latency", ad?.requestLatencyMillis)
obj.put("valueMicros", ad?.revenue)
obj.put("mediation", "applovin")
if (error == null) {
obj.put("status", "1")
} else {
obj.put("code", code)
obj.put("errMsg", error)
obj.put("status", "2")
}
EventUtils.event("ad_pull", ext = obj)
}
fun clickAd(ad: MaxAd?, adUnit: String) {
val obj = JSONObject()
obj.put("UnitId", ad?.adUnitId)
obj.put("ad_unit", adUnit)
obj.put(
"creativeId",
ad?.creativeId
)
obj.put("networkname", ad?.networkName)
obj.put("placement", ad?.placement)
obj.put("networkplacement", ad?.networkPlacement)
obj.put("latency", ad?.requestLatencyMillis)
obj.put("valueMicros", ad?.revenue)
obj.put("mediation", "applovin")
if (!adUnit.equals("nativeAd")) {
EventUtils.event("ad_click", ext = obj)
} else {
EventUtils.event("big_imgad_click", ext = obj)
}
}
fun showAd(ad: MaxAd?, adUnit: String, activity: String?) {
val obj = JSONObject()
obj.put("UnitId", ad?.adUnitId)
obj.put("ad_unit", adUnit)
obj.put(
"creativeId",
ad?.creativeId
)
obj.put("networkname", ad?.networkName)
obj.put("placement", ad?.placement)
obj.put("networkplacement", ad?.networkPlacement)
obj.put("latency", ad?.requestLatencyMillis)
obj.put("valueMicros", ad?.revenue)
obj.put("from", activity)
obj.put("mediation", "applovin")
LogEx.logDebug("glc", "from: $activity")
if (!adUnit.equals("nativeAd")) {
EventUtils.event("ad_show", ext = obj)
} else {
EventUtils.event("big_img_show", ext = obj)
}
}
private val taichiPref = FacebookSdk.getApplicationContext()
.getSharedPreferences("TaichiTroasCache", 0)
private val taichiSharedPreferencesEditor = taichiPref.edit()
class EventOnPaidEventListener : MaxAdRevenueListener {
override fun onAdRevenuePaid(ad: MaxAd) {
LogEx.logDebug("glc", "onAdRevenuePaid")
val params = Bundle()
val currentImpressionRevenue: Double = ad.revenue // In USD
val mFirebaseAnalytics = FirebaseAnalytics.getInstance(BaseApplication.context)
params.putString(FirebaseAnalytics.Param.AD_PLATFORM, "appLovin")
params.putString(FirebaseAnalytics.Param.AD_SOURCE, ad.networkName)
params.putString(FirebaseAnalytics.Param.AD_FORMAT, ad.format.getDisplayName())
params.putString(FirebaseAnalytics.Param.AD_UNIT_NAME, ad.adUnitId)
params.putDouble(FirebaseAnalytics.Param.VALUE, currentImpressionRevenue)
params.putString(FirebaseAnalytics.Param.CURRENCY, "USD")
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION, params)
mFirebaseAnalytics.logEvent("Ad_Impression_Revenue", params)
val previousTaichiTroasCache = taichiPref.getFloat("TaichiTroasCache", 0f)
val currentTaichiTroasCache = previousTaichiTroasCache + currentImpressionRevenue
if (currentTaichiTroasCache >= 0.01) {
val roasbundle = Bundle()
roasbundle.putDouble(FirebaseAnalytics.Param.VALUE, currentTaichiTroasCache)
roasbundle.putString(FirebaseAnalytics.Param.CURRENCY, "USD")///(Required)tROAS事件必须
mFirebaseAnalytics.logEvent("Total_Ads_Revenue_001", roasbundle) // 给Taichi用
taichiSharedPreferencesEditor.putFloat("TaichiTroasCache", 0f)//重新清零,开始计算
val logger = AppEventsLogger.newLogger(BaseApplication.context)
val parameters = Bundle()
parameters.putString(AppEventsConstants.EVENT_PARAM_CURRENCY, "USD")
logger.logEvent("ad_value", currentTaichiTroasCache, parameters)
} else {
taichiSharedPreferencesEditor.putFloat(
"TaichiTroasCache",
currentTaichiTroasCache.toFloat()
)
taichiSharedPreferencesEditor.commit()
}
val obj = JSONObject()
val revenue = ad.revenue
val countryCode =
AppLovinSdk.getInstance(BaseApplication.context).configuration.countryCode
val networkName = ad.networkName
val adUnitId = ad.adUnitId
val adFormat = ad.format
val placement = ad.placement
val networkPlacement = ad.networkPlacement
obj.put("valueMicros", revenue)
obj.put("currencyCode", countryCode)
obj.put("adUnitId", adUnitId)
obj.put("networkName", networkName)
obj.put("adFormat", adFormat)
obj.put("placement", placement)
obj.put("networkPlacement", networkPlacement)
// com.base.datarecovery.utils.EventUtils.com.base.datarecovery.utils.event("ad_price", ext = obj)
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads.max
import android.content.Context
import android.util.Log
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkInitializationConfiguration
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.ads.AdmobMaxHelper.isAdInit
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import com.google.android.gms.ads.identifier.AdvertisingIdClient
import org.json.JSONObject
import java.util.Collections
import java.util.concurrent.Executors
import java.util.concurrent.atomic.AtomicBoolean
object AdMaxInit {
private val TAG = "AdMaxInit"
var maxInitAction: (() -> Unit)? = null
fun Context.initAdMax() {
Log.d(TAG, "initAdMax")
// If you want to test your own AppLovin SDK key, change the value here and update the package name in the build.gradle
// val YOUR_SDK_KEY = "05TMDQ5tZabpXQ45_UTbmEGNUtVAzSTzT6KmWQc5_CuWdzccS4DCITZoL3yIWUG3bbq60QC_d4WF28tUC4gVTF"
val YOUR_SDK_KEY = "GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
val executor = Executors.newSingleThreadExecutor();
executor.execute {
val initConfigBuilder = AppLovinSdkInitializationConfiguration.builder(YOUR_SDK_KEY, this)
initConfigBuilder.mediationProvider = AppLovinMediationProvider.MAX
// Enable test mode by default for the current device. Cannot be run on the main thread.
// AppLovinSdk.getInstance( this ).showMediationDebugger()
// val currentGaid = AdvertisingIdClient.getAdvertisingIdInfo(this).id
// if (currentGaid != null) {
// initConfigBuilder.testDeviceAdvertisingIds = Collections.singletonList(currentGaid)
// }
// Initialize the AppLovin SDK
val sdk = AppLovinSdk.getInstance(this)
sdk.initialize(initConfigBuilder.build()) {
LogEx.logDebug(TAG, "max init")
isAdInit.set(true)
maxInitAction?.invoke()
maxInitAction = null
EventUtils.event("MaxInit", "MaxInit")
}
executor.shutdown()
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads.max
import android.app.Activity
import android.app.Dialog
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxInterstitialAd
import com.base.datarecovery.MyApplication.Companion.isInterOpenShowing
import com.base.datarecovery.R
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.AdmobMaxHelper.isAdInit
import com.base.datarecovery.ads.AdmobMaxHelper.lastShowedOnHiddenTime
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.CustomDialog
import org.json.JSONObject
import java.util.UUID
object AdMaxInterstitialUtils {
private val TAG = "AdMaxInterstitialUtils"
private var interstitialAd: MaxInterstitialAd? = null
private var interLoadTime = Long.MAX_VALUE
private var onHidden: (() -> Unit)? = null
private var loadingListener: (() -> Unit)? = null
private var activityString: String = ""
private fun setListener(activity: Activity) {
activityString = activity::class.java.toString().split(".").last()
if (interstitialAd == null) {
interstitialAd = MaxInterstitialAd(ConfigHelper.interAdMaxId, activity)
interstitialAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdLoaded")
loadingListener?.invoke()
loadingListener = null
interLoadTime = System.currentTimeMillis()
val reqId = UUID.randomUUID().toString()
AdMaxEvent.pullAd(p0, "interAd", reqId = reqId)
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p0)
LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p1.message.toString())
LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p1.code)
val reqId = UUID.randomUUID().toString()
AdMaxEvent.pullAd(null, "interAd", reqId = reqId, error = p1.message, code = p1.code)
AdDisplayUtils.getInstance().incrementAdRequestFailCount()
loadingListener?.invoke()
loadingListener = null
}
override fun onAdDisplayed(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdDisplayed")
AdDisplayUtils.getInstance().incrementAdDisplayCount()
AdMaxEvent.showAd(p0, "interAd", activityString)
isInterOpenShowing = true
}
override fun onAdHidden(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdHidden")
onHidden?.invoke()
onHidden = null
AdMaxOpenUtils.loadAppOpenAd(activity)
// loadInterstitialAd(activity)
isInterOpenShowing = false
lastShowedOnHiddenTime = System.currentTimeMillis()
}
override fun onAdClicked(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdClicked activity=$activityString")
AdDisplayUtils.getInstance().incrementAdClickCount()
AdMaxEvent.clickAd(p0, "interAd")
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
LogEx.logDebug(TAG, "onAdDisplayFailed")
onHidden?.invoke()
onHidden = null
val obj2 = JSONObject()
obj2.put("code", p1.code)
obj2.put("reason", p1.message)
obj2.put("ad_unit", "interAd")
EventUtils.event("ad_show_error", ext = obj2)
isInterOpenShowing = false
}
})
interstitialAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
}
}
fun showInterstitialAd(activity: Activity, onHidden: (() -> Unit)? = null) {
setListener(activity)
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
onHidden?.invoke()
return
}
if (isAdExpired()) {
val obj2 = JSONObject()
obj2.put("ad_unit", "interAd")
EventUtils.event("ad_expire", ext = obj2)
loadInterstitialAd(activity)
onHidden?.invoke()
return
}
LogEx.logDebug(TAG, "showInterstitialAd,展示插屏广告")
val obj1 = JSONObject()
obj1.put("ad_unit", "interAd")
EventUtils.event("ad_prepare_show", ext = obj1)
isInterOpenShowing = false
if (interstitialAd?.isReady == true) {
LogEx.logDebug(TAG, "有缓存直接播放。")
this.onHidden = onHidden
interstitialAd?.showAd(activity)
} else {
LogEx.logDebug(TAG, "展示广告时,没有缓存,需要拉取。")
val obj2 = JSONObject()
obj2.put("reason", "no cache ad")
obj2.put("ad_unit", "interAd")
EventUtils.event("ad_nocache_pull", ext = obj2)
val loaded = loadInterstitialAd(activity)
if (loaded) {
LogEx.logDebug(TAG, "loaded=true")
val dialog = showAdDialogAndLoadInterstitial(activity)
loadingListener = {
dialog?.dismiss()
if (interstitialAd?.isReady == true) {
this.onHidden = onHidden
interstitialAd?.showAd(activity)
} else {
onHidden?.invoke()
}
}
} else {
LogEx.logDebug(TAG, "loaded=false")
onHidden?.invoke()
}
}
}
private fun isAdExpired(): Boolean {
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)
if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
return false
}
if (interstitialAd?.isReady == true) {
return false
}
// if (isAdInit.get()) {
LogEx.logDebug(TAG, "loadInterstitialAd")
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "interAd")
EventUtils.event("ad_pull_start", ext = obj)
interstitialAd?.loadAd()
AdDisplayUtils.getInstance().incrementAdRequestCount()
return true
// } else {
// LogEx.logDebug(TAG, "isAdInit=$isAdInit")
// EventUtils.event("isAdInit", value = "loadInterstitialAd isAdInit=${isAdInit.get()}")
// }
// return false
}
}
\ No newline at end of file
import android.app.Activity
import android.content.Context
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxError
import com.applovin.mediation.nativeAds.MaxNativeAdListener
import com.applovin.mediation.nativeAds.MaxNativeAdLoader
import com.applovin.mediation.nativeAds.MaxNativeAdView
import com.applovin.mediation.nativeAds.MaxNativeAdViewBinder
import com.base.datarecovery.R
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.max.AdMaxEvent
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import org.json.JSONObject
object AdMaxNativeUtils {
private val TAG = "AdMaxNativeUtils"
private var nativeAdLoader: MaxNativeAdLoader = MaxNativeAdLoader(ConfigHelper.nativeAdMaxId, BaseApplication.context)
private var nativeAd: MaxAd? = null
private var nativeLoadTime = Long.MAX_VALUE
private var haveSetAdListener: Boolean = false
private var loadingListener: (() -> Unit)? = null
private var activityString: String = ""
private fun setNativeAdListener() {
if (!haveSetAdListener) {
//加载展示监听
nativeAdLoader.setNativeAdListener(object : MaxNativeAdListener() {
override fun onNativeAdLoaded(nativeAdView: MaxNativeAdView?, ad: MaxAd) {
LogEx.logDebug(TAG, "onNativeAdLoaded")
// Cleanup any pre-existing native ad to prevent memory leaks.
if (nativeAd?.nativeAd?.isExpired == true) {
nativeAdLoader.destroy(nativeAd)
}
// Save ad to be rendered later.
nativeAd = ad
nativeLoadTime = System.currentTimeMillis()
loadingListener?.invoke()
}
override fun onNativeAdLoadFailed(p0: String, p1: MaxError) {
super.onNativeAdLoadFailed(p0, p1)
LogEx.logDebug(TAG, "onNativeAdLoadFailed")
val obj2 = JSONObject()
obj2.put("reason", "no_ad")
obj2.put("ad_unit", "nativeAd")
EventUtils.event("ad_show_error", ext = obj2)
}
override fun onNativeAdClicked(p0: MaxAd) {
super.onNativeAdClicked(p0)
LogEx.logDebug(TAG, "onNativeAdClicked")
nativeAd?.let { AdMaxEvent.clickAd(it, "nativeAd") }
}
override fun onNativeAdExpired(p0: MaxAd) {
super.onNativeAdExpired(p0)
}
})
//广告价格监听
nativeAdLoader.setRevenueListener { ad ->
}
haveSetAdListener = true
}
}
private fun createNativeAdView(context: Context, layout: Int): MaxNativeAdView {
// val binder: MaxNativeAdViewBinder = MaxNativeAdViewBinder.Builder(R.layout.layout_max_native_custom)
// .setTitleTextViewId(R.id.title_text_view)
// .setBodyTextViewId(R.id.body_text_view)
// .setAdvertiserTextViewId(R.id.advertiser_text_view)
// .setIconImageViewId(R.id.icon_image_view)
// .setMediaContentViewGroupId(R.id.media_view_container)
// .setOptionsContentViewGroupId(R.id.options_view)
// .setStarRatingContentViewGroupId(R.id.star_rating_view)
// .setCallToActionButtonId(R.id.cta_button)
// .build()
// return MaxNativeAdView(binder, context)
val binder: MaxNativeAdViewBinder = MaxNativeAdViewBinder.Builder(layout)
.setTitleTextViewId(R.id.ad_headline)
.setBodyTextViewId(R.id.ad_body)
// .setAdvertiserTextViewId(R.id.advertiser_text_view)
.setIconImageViewId(R.id.ad_app_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()
return MaxNativeAdView(binder, context)
}
fun showNativeAd(activity: Activity, parent: ViewGroup, layout: Int) {
activityString = activity::class.java.toString().split(".").last()
setNativeAdListener()
if (!AdDisplayUtils.getInstance().shouldShowAd("nativeAd")) {
return
}
loadingListener = {
if (System.currentTimeMillis() - nativeLoadTime <= 1000 * 60 * 60) {
//是否已经加载渲染
if (nativeAd?.nativeAd?.isExpired == true) {
nativeAdLoader.destroy(nativeAd)
nativeAdLoader.loadAd()
} else {
//展示广告
val adView = createNativeAdView(activity, layout)
parent.isVisible = true
nativeAdLoader.render(adView, nativeAd)
parent.removeAllViews()
parent.addView(adView)
nativeAd?.let { AdMaxEvent.showAd(it, "nativeAd", activityString) }
}
}
loadingListener = null
nativeAdLoader.loadAd()
LogEx.logDebug(TAG, "loadingListener finish")
}
if (nativeAd == null) {
nativeAdLoader.loadAd()
val obj2 = JSONObject()
obj2.put("reason", "no_cache_ad")
obj2.put("ad_unit", "nativeAd")
EventUtils.event("ad_nocache_pull", ext = obj2)
} else {
loadingListener?.invoke()
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads.max
import android.app.Activity
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAppOpenAd
import com.base.datarecovery.MyApplication.Companion.isInterOpenShowing
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import org.json.JSONObject
import java.util.UUID
object AdMaxOpenUtils {
private val TAG = "AdMaxOpenUtils"
private var appOpenAd: MaxAppOpenAd? = null
private var openLoadTime = Long.MAX_VALUE
private var onHidden: (() -> Unit)? = null
private var loadingListener: ((flag: Boolean) -> Unit)? = null
private var activityString = ""
private fun setListener(activity: Activity) {
activityString = activity::class.java.toString().split(".").last()
if (appOpenAd == null) {
appOpenAd = MaxAppOpenAd(ConfigHelper.openAdMaxId, activity)
appOpenAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) {
LogEx.logDebug(TAG, "广告拉取成功")
openLoadTime = System.currentTimeMillis()
loadingListener?.invoke(true)
loadingListener = null
AdMaxEvent.pullAd(p0, "openAd")
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p1.message.toString())
LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p0)
LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p1.code)
loadingListener?.invoke(false)
loadingListener = null
AdDisplayUtils.getInstance().incrementAdRequestFailCount()
val reqId = UUID.randomUUID().toString()
AdMaxEvent.pullAd(null, "openAd", reqId = reqId, error = p1.message, code = p1.code)
}
override fun onAdDisplayed(p0: MaxAd) {
AdDisplayUtils.getInstance().incrementAdDisplayCount()
AdMaxEvent.showAd(p0, "openAd", activityString)
isInterOpenShowing = true
}
override fun onAdHidden(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdHidden")
onHidden?.invoke()
onHidden = null
loadAppOpenAd(activity)
isInterOpenShowing = false
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
LogEx.logDebug(TAG, "onAdDisplayFailed")
onHidden?.invoke()
onHidden = null
loadAppOpenAd(activity)
val obj = JSONObject()
obj.put("code", p1.code)
obj.put("reason", p1.message)
obj.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj)
isInterOpenShowing = false
}
override fun onAdClicked(p0: MaxAd) {
AdDisplayUtils.getInstance().incrementAdClickCount()
AdMaxEvent.clickAd(p0, "openAd")
}
})
appOpenAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
}
}
fun showAppOpenAd(
activity: Activity,
loadCallBack: ((flag: Boolean) -> Unit)? = null,
onHidden: (() -> Unit)? = null
) {
setListener(activity)
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
LogEx.logDebug(TAG, "!shouldShowAd")
onHidden?.invoke()
return
}
if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) {
LogEx.logDebug(TAG, "openLoadTime > ")
onHidden?.invoke()
val obj2 = JSONObject()
obj2.put("ad_unit", "openAd")
EventUtils.event("ad_expire", ext = obj2)
appOpenAd?.loadAd()
}
// if (!isAdInit.get()) {
// EventUtils.event("isAdInit", value = "showAppOpenAd isAdInit=${isAdInit.get()}")
// onHidden?.invoke()
// return
// }
LogEx.logDebug(TAG, "showAppOpenAd")
val obj1 = JSONObject()
obj1.put("ad_unit", "openAd")
EventUtils.event("ad_prepare_show", ext = obj1)
if (appOpenAd?.isReady == true) {
LogEx.logDebug(TAG, "广告准备好了,展示广告")
AdMaxOpenUtils.onHidden = onHidden
appOpenAd?.showAd()
} else {
val obj = JSONObject()
obj.put("reason", "no cache ad")
obj.put("ad_unit", "openAd")
EventUtils.event("ad_nocache_pull", ext = obj)
LogEx.logDebug(TAG, "展示时候,发现广告需要拉取")
val loaded = loadAppOpenAd(activity)
if (loaded) {
loadingListener = { loadResult ->
loadCallBack?.invoke(loadResult)
LogEx.logDebug(TAG, "loadingListener callback")
if (appOpenAd?.isReady == true) {
AdMaxOpenUtils.onHidden = onHidden
appOpenAd?.showAd()
} else {
onHidden?.invoke()
}
}
} else {
onHidden?.invoke()
}
}
}
fun loadAppOpenAd(activity: Activity): Boolean {
setListener(activity)
if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
LogEx.logDebug(TAG, "!shouldShowAd")
return false
}
if (appOpenAd?.isReady == true) {
LogEx.logDebug(TAG, "appOpenAd?.isReady == true")
return false
}
// if (isAdInit.get()) {
// EventUtils.event("isAdInit", value = "loadAppOpenAd isAdInit=${isAdInit.get()}")
LogEx.logDebug(TAG, "appOpenAd loadAd")
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "openAd")
EventUtils.event("ad_pull_start", ext = obj)
appOpenAd?.loadAd()
AdDisplayUtils.getInstance().incrementAdRequestCount()
return true
// }
// return false
}
fun isOpenAdLoaded(): Boolean {
return appOpenAd?.isReady == true
}
}
...@@ -16,7 +16,7 @@ object ConstObject { ...@@ -16,7 +16,7 @@ object ConstObject {
// const val ID_APP_PROCESS = 13011 // const val ID_APP_PROCESS = 13011
const val ID_APP_MANAGER = 12076 const val ID_APP_MANAGER = 12076
const val ID_BATTERY_INFO = 12086 const val ID_BATTERY_INFO = 12086
const val ID_XINGZUO = 12087 // const val ID_XINGZUO = 12087
const val ID_WEATHER = 12088 const val ID_WEATHER = 12088
......
package com.base.datarecovery.bean
data class SelectBean(
val imageRes: Int,
val name: String,
var isSelect: Boolean = false
)
...@@ -4,7 +4,6 @@ import android.content.Context ...@@ -4,7 +4,6 @@ import android.content.Context
import android.util.Log import android.util.Log
import com.base.datarecovery.utils.AppPreferences import com.base.datarecovery.utils.AppPreferences
import com.base.datarecovery.utils.EventUtils.event import com.base.datarecovery.utils.EventUtils.event
import com.base.datarecovery.utils.LogEx
import com.google.android.gms.tasks.OnCompleteListener import com.google.android.gms.tasks.OnCompleteListener
import com.google.android.gms.tasks.Task import com.google.android.gms.tasks.Task
import com.google.firebase.FirebaseApp import com.google.firebase.FirebaseApp
...@@ -43,22 +42,18 @@ object FCMManager { ...@@ -43,22 +42,18 @@ object FCMManager {
FirebaseMessaging.getInstance().token FirebaseMessaging.getInstance().token
.addOnCompleteListener(object : OnCompleteListener<String> { .addOnCompleteListener(object : OnCompleteListener<String> {
override fun onComplete(task: Task<String>) { override fun onComplete(task: Task<String>) {
LogEx.logDebug("FCM", "onComplete ${task.isSuccessful}")
if (!task.isSuccessful) { if (!task.isSuccessful) {
Log.e("FCM", "Fetching FCM registration token failed", task.exception)
return return
} }
// Get new FCM registration token val times = AppPreferences.getInstance().getInt("token_success", 0)
val token: String = task.result val token: String = task.result
LogEx.logDebug("FCM", "token=$token") if (times < 2||(token != AppPreferences.getInstance().getString("fc_token","")).apply { if(this){ AppPreferences.getInstance().put("token_success", 0) } }) {
val json = JSONObject() Log.e("MXL", "上报token: " )
json.put("token", token) val json = JSONObject()
event("fcm_message_received", ext = json) json.put("token", token)
event("fcm_message_received", ext = json)
AppPreferences.getInstance().put("token", token) AppPreferences.getInstance().put("fc_token", token)
}
// Handle new token
Log.d("FCM", "FCM Registration Token: $token")
} }
}) })
} }
......
...@@ -17,7 +17,6 @@ import com.base.datarecovery.MyApplication ...@@ -17,7 +17,6 @@ import com.base.datarecovery.MyApplication
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.activity.splash.Splash2Activity import com.base.datarecovery.activity.splash.Splash2Activity
import com.base.datarecovery.ads.AdDisplayUtils import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.bean.ConstObject.ID_APP_MANAGER
import com.base.datarecovery.bean.ConstObject.ID_BATTERY_INFO import com.base.datarecovery.bean.ConstObject.ID_BATTERY_INFO
import com.base.datarecovery.bean.ConstObject.ID_JUNK_CLEAN_PUSH import com.base.datarecovery.bean.ConstObject.ID_JUNK_CLEAN_PUSH
import com.base.datarecovery.bean.ConstObject.ID_LARGE_FILE import com.base.datarecovery.bean.ConstObject.ID_LARGE_FILE
...@@ -28,8 +27,6 @@ import com.base.datarecovery.bean.ConstObject.ID_RECOVERY_VIDEOS ...@@ -28,8 +27,6 @@ import com.base.datarecovery.bean.ConstObject.ID_RECOVERY_VIDEOS
import com.base.datarecovery.bean.ConstObject.ID_SCREENSHOT_CLEAN import com.base.datarecovery.bean.ConstObject.ID_SCREENSHOT_CLEAN
import com.base.datarecovery.bean.ConstObject.ID_SIMILAR_IMAGE import com.base.datarecovery.bean.ConstObject.ID_SIMILAR_IMAGE
import com.base.datarecovery.bean.ConstObject.ID_WEATHER import com.base.datarecovery.bean.ConstObject.ID_WEATHER
import com.base.datarecovery.bean.ConstObject.ID_XINGZUO
import com.base.datarecovery.utils.AppManagerStringManager
import com.base.datarecovery.utils.AppPreferences import com.base.datarecovery.utils.AppPreferences
import com.base.datarecovery.utils.BatteryInfoStringManager import com.base.datarecovery.utils.BatteryInfoStringManager
import com.base.datarecovery.utils.CleanJunkStringResourceManager import com.base.datarecovery.utils.CleanJunkStringResourceManager
...@@ -43,7 +40,6 @@ import com.base.datarecovery.utils.PrivacySpaceStringManager ...@@ -43,7 +40,6 @@ import com.base.datarecovery.utils.PrivacySpaceStringManager
import com.base.datarecovery.utils.ScreenshotCleanupStringManager import com.base.datarecovery.utils.ScreenshotCleanupStringManager
import com.base.datarecovery.utils.VideoRecoveryStringManager import com.base.datarecovery.utils.VideoRecoveryStringManager
import com.base.datarecovery.utils.WeatherInfoStringManager import com.base.datarecovery.utils.WeatherInfoStringManager
import com.base.datarecovery.utils.XingzuoStringManager
import java.util.Random import java.util.Random
/** /**
...@@ -285,24 +281,6 @@ object NotificationUtil { ...@@ -285,24 +281,6 @@ object NotificationUtil {
// smallRemoteViews // smallRemoteViews
// ) // )
// } // }
ID_APP_MANAGER -> {
val icon = R.mipmap.h_appmanager
val desc = AppManagerStringManager.getNextDesc()
val btn = "Uninstall App"
bigRemoteViews.setImageViewResource(R.id.iv_icon, icon)
bigRemoteViews.setTextViewText(R.id.tv_desc, desc)
bigRemoteViews.setTextViewText(R.id.id_tv_btn, btn)
smallRemoteViews.setImageViewResource(R.id.iv_icon, icon)
smallRemoteViews.setTextViewText(R.id.tv_desc, desc)
smallRemoteViews.setTextViewText(R.id.id_tv_btn, btn)
sendCustomNotification(
context,
actionId,
intent,
bigRemoteViews,
smallRemoteViews
)
}
ID_BATTERY_INFO -> { ID_BATTERY_INFO -> {
val icon = R.mipmap.h_battery val icon = R.mipmap.h_battery
val desc = BatteryInfoStringManager.getNextDesc() val desc = BatteryInfoStringManager.getNextDesc()
...@@ -339,26 +317,7 @@ object NotificationUtil { ...@@ -339,26 +317,7 @@ object NotificationUtil {
smallRemoteViews smallRemoteViews
) )
} }
ID_XINGZUO -> {
//val icon = R.mipmap.xingzuoicon
val desc = XingzuoStringManager.getNextDesc()
val btn = XingzuoStringManager.getNextTitle()
val smallRemoteViewsVar =
RemoteViews(context.packageName, R.layout.notify_layout_xingzuo_small)
smallRemoteViewsVar.setTextViewText(R.id.tv_desc, btn)
smallRemoteViewsVar.setTextViewText(R.id.tv_btn, desc)
val bigRemoteViewsVar =
RemoteViews(context.packageName, R.layout.notify_layout_xingzuo_big)
bigRemoteViewsVar.setTextViewText(R.id.id_title, btn)
bigRemoteViewsVar.setTextViewText(R.id.tv_desc, desc)
sendCustomNotification(
context,
actionId,
intent,
bigRemoteViewsVar,
smallRemoteViewsVar
)
}
else -> { else -> {
return return
...@@ -524,9 +483,7 @@ object NotificationUtil { ...@@ -524,9 +483,7 @@ object NotificationUtil {
ID_RECOVERY_DOCUMENTS, ID_RECOVERY_DOCUMENTS,
ID_PRIVACY_SPACE, ID_PRIVACY_SPACE,
ID_LARGE_FILE, ID_LARGE_FILE,
ID_APP_MANAGER,
ID_BATTERY_INFO, ID_BATTERY_INFO,
ID_WEATHER, ID_WEATHER
ID_XINGZUO
) )
} }
\ No newline at end of file
package com.base.datarecovery.fragment
import android.annotation.SuppressLint
import android.content.Intent
import com.base.datarecovery.R
import com.base.datarecovery.activity.MainActivity
import com.base.datarecovery.activity.guide.GuideActivity
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.bean.ConstObject.isGuide
import com.base.datarecovery.databinding.FragmentGuideBinding
import com.base.datarecovery.help.BaseFragment
class GuideFragment : BaseFragment<FragmentGuideBinding>() {
var page: Int = 1
override val binding: FragmentGuideBinding by lazy {
FragmentGuideBinding.inflate(layoutInflater)
}
@SuppressLint("SetTextI18n")
override fun setView() {
if (page == 1) {
binding.iv.setImageResource(R.mipmap.ydytu1)
binding.tv0.text = "All Free"
binding.tvBtn.text = "Next"
// binding.flSkip.visibility = View.VISIBLE
} else {
binding.iv.setImageResource(R.mipmap.ydytu2)
binding.tv0.text = "Effective recovery"
binding.tvBtn.text = "Start"
// binding.flSkip.visibility = View.GONE
}
}
override fun setListener() {
super.setListener()
binding.tvBtn.setOnClickListener {
if (page == 1) {
(requireActivity() as GuideActivity).setPosition(1)
} else {
jumpMain()
}
}
binding.flSkip.setOnClickListener {
jumpMain()
}
}
private fun jumpMain() {
// val showAd = AppPreferences.getInstance().getString("isShowGuideAd", "0")?.toInt()
// if (showAd == 1) {
//
// } else {
// startActivity(Intent(requireContext(), MainActivity::class.java))
// requireActivity().finish()
// isGuide = true
// }
AdmobMaxHelper.admobMaxShowInterstitialAd(requireActivity(),false) {
startActivity(Intent(requireContext(), MainActivity::class.java))
requireActivity().finish()
isGuide = true
}
}
}
\ No newline at end of file
...@@ -24,11 +24,9 @@ import com.base.datarecovery.activity.junkclean.ScanJunkActivity ...@@ -24,11 +24,9 @@ import com.base.datarecovery.activity.junkclean.ScanJunkActivity
import com.base.datarecovery.activity.largefile.LargeFileAnimationActivity import com.base.datarecovery.activity.largefile.LargeFileAnimationActivity
import com.base.datarecovery.activity.newfunction.WeatherInterface import com.base.datarecovery.activity.newfunction.WeatherInterface
import com.base.datarecovery.activity.newfunction.WeatherUtils import com.base.datarecovery.activity.newfunction.WeatherUtils
import com.base.datarecovery.activity.newfunction.XingzuoLoadingActivity
import com.base.datarecovery.activity.repeat.RepeatAnimationActivity import com.base.datarecovery.activity.repeat.RepeatAnimationActivity
import com.base.datarecovery.activity.screenshot.ScreenShotAnimationActivity import com.base.datarecovery.activity.screenshot.ScreenShotAnimationActivity
import com.base.datarecovery.activity.videomanager.VideoCleanAnimationActivity import com.base.datarecovery.activity.videomanager.VideoCleanAnimationActivity
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.databinding.FragmentHomeBinding import com.base.datarecovery.databinding.FragmentHomeBinding
import com.base.datarecovery.help.BaseFragment import com.base.datarecovery.help.BaseFragment
import com.base.datarecovery.help.KotlinExt.toFormatSize import com.base.datarecovery.help.KotlinExt.toFormatSize
...@@ -125,9 +123,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() { ...@@ -125,9 +123,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
i++ i++
lastClickTime = System.currentTimeMillis() lastClickTime = System.currentTimeMillis()
} }
binding.idXz.setOnClickListener {
startActivity(Intent(requireActivity(), XingzuoLoadingActivity::class.java))
}
binding.llWeather.setOnClickListener { binding.llWeather.setOnClickListener {
startActivity(Intent(requireActivity(), WeatherInterface::class.java)) startActivity(Intent(requireActivity(), WeatherInterface::class.java))
} }
...@@ -180,7 +176,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() { ...@@ -180,7 +176,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
AdmobMaxHelper.admobMaxShowNativeAd(requireActivity(), binding.idFlNative, 1) // AdmobManager.showNativeAd(requireActivity(), binding.idFlNative, 1)
animatorSet.resume() animatorSet.resume()
val bean = WeatherUtils.getWeatherEntity()?.list?.get(0) val bean = WeatherUtils.getWeatherEntity()?.list?.get(0)
bean?.let { bean?.let {
......
...@@ -5,7 +5,7 @@ import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity ...@@ -5,7 +5,7 @@ import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity
import com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity import com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity
import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
import com.base.datarecovery.activity.recovery.FileScanResultActivity import com.base.datarecovery.activity.recovery.FileScanResultActivity
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject import com.base.datarecovery.bean.ConstObject
import com.base.datarecovery.databinding.FragmentRecoveryBinding import com.base.datarecovery.databinding.FragmentRecoveryBinding
import com.base.datarecovery.help.BaseFragment import com.base.datarecovery.help.BaseFragment
...@@ -19,6 +19,7 @@ class RecoveryFragment : BaseFragment<FragmentRecoveryBinding>() { ...@@ -19,6 +19,7 @@ class RecoveryFragment : BaseFragment<FragmentRecoveryBinding>() {
override fun setView() { override fun setView() {
AdmobManager.showNativeAd(requireActivity(),binding.flAd)
} }
override fun setListener() { override fun setListener() {
...@@ -43,13 +44,11 @@ class RecoveryFragment : BaseFragment<FragmentRecoveryBinding>() { ...@@ -43,13 +44,11 @@ class RecoveryFragment : BaseFragment<FragmentRecoveryBinding>() {
}) })
} }
binding.cardPrivacySpace.setOnClickListener { binding.cardPrivacySpace.setOnClickListener {
AdmobMaxHelper.admobMaxShowInterstitialAd(requireActivity()){ if (ConstObject.privacyPinPassword.isNotEmpty()) {
if (ConstObject.privacyPinPassword.isNotEmpty()) { startActivity(Intent(requireContext(), PrivacyPinOneActivity::class.java))
startActivity(Intent(requireContext(), PrivacyPinOneActivity::class.java)) } else {
} else { startActivity(Intent(requireContext(), PrivacySpaceActivity::class.java).apply {
startActivity(Intent(requireContext(), PrivacySpaceActivity::class.java).apply { })
})
}
} }
} }
binding.cardPhotosManager.setOnClickListener { binding.cardPhotosManager.setOnClickListener {
...@@ -60,7 +59,7 @@ class RecoveryFragment : BaseFragment<FragmentRecoveryBinding>() { ...@@ -60,7 +59,7 @@ class RecoveryFragment : BaseFragment<FragmentRecoveryBinding>() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
AdmobMaxHelper.admobMaxShowNativeAd(requireActivity(), binding.flAd, 2)
} }
} }
\ No newline at end of file
...@@ -6,6 +6,7 @@ import android.os.Bundle ...@@ -6,6 +6,7 @@ import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import com.base.datarecovery.activity.MainActivity import com.base.datarecovery.activity.MainActivity
import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.utils.ActivityManagerUtils import com.base.datarecovery.utils.ActivityManagerUtils
import com.base.datarecovery.utils.EventUtils import com.base.datarecovery.utils.EventUtils
...@@ -48,5 +49,26 @@ abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() { ...@@ -48,5 +49,26 @@ abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
dialog = null dialog = null
} }
} }
fun admobMaxShowInterstitialAd(
isShow: Boolean = AdmobManager.isShowLoadingAdInter(),
complete: (() -> Unit)? = null
) {
if (this.isFinishing || this.isDestroyed ) return
if (isShow) {
AdmobManager.showInterstitialAd(
this,
dismissed = {
complete?.invoke()
},
completed = {
},
failed = {
complete?.invoke()
}
)
}else{
complete?.invoke()
}
}
} }
\ No newline at end of file
...@@ -2,7 +2,7 @@ package com.base.datarecovery.help ...@@ -2,7 +2,7 @@ package com.base.datarecovery.help
import android.os.Build import android.os.Build
import com.base.datarecovery.BuildConfig import com.base.datarecovery.BuildConfig
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.GlobalConfig
import com.base.datarecovery.utils.AESHelper import com.base.datarecovery.utils.AESHelper
import com.base.datarecovery.utils.AppPreferences import com.base.datarecovery.utils.AppPreferences
import com.base.datarecovery.utils.LogEx import com.base.datarecovery.utils.LogEx
...@@ -22,9 +22,9 @@ object BlackUtils { ...@@ -22,9 +22,9 @@ object BlackUtils {
private val TAG = "BlackUtils" private val TAG = "BlackUtils"
private val blcurl by lazy { private val blcurl by lazy {
val pkg = ConfigHelper.packageName val pkg = GlobalConfig.PACKAGE_NAME
val url = StringBuilder( val url = StringBuilder(
"${ConfigHelper.apiUrl}/${ "${GlobalConfig.URL_API}/${
pkg.filter { it.isLowerCase() }.substring(4, 9) pkg.filter { it.isLowerCase() }.substring(4, 9)
}cl" }cl"
) )
...@@ -33,7 +33,7 @@ object BlackUtils { ...@@ -33,7 +33,7 @@ object BlackUtils {
} }
fun requestBlack() { fun requestBlack() {
val pkg = ConfigHelper.packageName val pkg = GlobalConfig.PACKAGE_NAME
val s = JSONObject() val s = JSONObject()
val s2 = JSONObject() val s2 = JSONObject()
.put("${pkg}_3", AppPreferences.getInstance().getString("Equipment", "")) .put("${pkg}_3", AppPreferences.getInstance().getString("Equipment", ""))
...@@ -76,7 +76,7 @@ object BlackUtils { ...@@ -76,7 +76,7 @@ object BlackUtils {
i!!.groupValues[1].let { i!!.groupValues[1].let {
val str = AESHelper.decrypt(it) val str = AESHelper.decrypt(it)
LogEx.logDebug(TAG, "black str=$str") LogEx.logDebug(TAG, "black str=$str")
AdmobMaxHelper.isBlack = str.equals("true") GlobalConfig.useBlacklist = str.equals("true")
} }
} }
} }
......
...@@ -6,11 +6,11 @@ import com.base.datarecovery.activity.splash.Splash2Activity ...@@ -6,11 +6,11 @@ import com.base.datarecovery.activity.splash.Splash2Activity
object ConfigHelper { object ConfigHelper {
const val privacyPolicy = "https://sites.google.com/view/recpri/rec" // const val privacyPolicy = "https://sites.google.com/view/recpri/rec"
// 域名 // 域名
const val eventUrl = "https://rp.rocioxyn.xyz" // const val eventUrl = "https://rp.rocioxyn.xyz"
const val apiUrl = "https://api.rocioxyn.xyz" // const val apiUrl = "https://api.rocioxyn.xyz"
//admob test id //admob test id
const val openAdmobIdTest = "ca-app-pub-3940256099942544/9257395921" const val openAdmobIdTest = "ca-app-pub-3940256099942544/9257395921"
...@@ -31,10 +31,10 @@ object ConfigHelper { ...@@ -31,10 +31,10 @@ object ConfigHelper {
const val bannerMaxId = "" const val bannerMaxId = ""
//一定展示大图广告 //一定展示大图广告
var mustShowNativeAd: Boolean = false //var mustShowNativeAd: Boolean = false
// 正式包名 // 正式包名
const val packageName = "com.cleaner.recovery.tencgog" // const val packageName = "com.cleaner.recovery.tencgog"
val noLoadingActivities = listOf( val noLoadingActivities = listOf(
"full", // 过滤全屏广告 "full", // 过滤全屏广告
......
package com.base.datarecovery.utils package com.base.datarecovery.utils
import android.util.Base64 import android.util.Base64
import com.base.datarecovery.GlobalConfig
import java.security.SecureRandom import java.security.SecureRandom
import javax.crypto.Cipher import javax.crypto.Cipher
import javax.crypto.spec.GCMParameterSpec import javax.crypto.spec.GCMParameterSpec
...@@ -8,7 +9,6 @@ import javax.crypto.spec.SecretKeySpec ...@@ -8,7 +9,6 @@ import javax.crypto.spec.SecretKeySpec
object AESHelper { object AESHelper {
private const val aesKey = "5s1q2jusawhorcz0"
private val cipher by lazy { private val cipher by lazy {
Cipher.getInstance("AES/GCM/NoPadding") Cipher.getInstance("AES/GCM/NoPadding")
...@@ -57,6 +57,6 @@ object AESHelper { ...@@ -57,6 +57,6 @@ object AESHelper {
} }
private val secretKey by lazy { private val secretKey by lazy {
SecretKeySpec(aesKey.toByteArray(), "AES") SecretKeySpec(GlobalConfig.KEY_AES.toByteArray(), "AES")
} }
} }
\ No newline at end of file
...@@ -14,7 +14,7 @@ public class DuplicatePhotoStringResourceManager { ...@@ -14,7 +14,7 @@ public class DuplicatePhotoStringResourceManager {
// duplicatePhotoCopyList.add("Find and remove duplicate photos to instantly gain more storage."); // duplicatePhotoCopyList.add("Find and remove duplicate photos to instantly gain more storage.");
duplicatePhotoCopyList.add("Identify and delete them easily with our app."); duplicatePhotoCopyList.add("Identify and delete them easily with our app.");
duplicatePhotoCopyList.add("Spot and remove look-alike photos to free up your phone."); duplicatePhotoCopyList.add("Spot and remove look-alike photos to free up your phone.");
duplicatePhotoCopyList.add("Clean up similar photos now."); duplicatePhotoCopyList.add("Clean up Duplocate Photos now.");
duplicatePhotoCopyList.add("Find and delete duplicate photos to reclaim your space."); duplicatePhotoCopyList.add("Find and delete duplicate photos to reclaim your space.");
} }
......
package com.base.datarecovery.utils package com.base.datarecovery.utils
import android.os.Build import android.os.Build
import android.util.Log
import com.base.datarecovery.BuildConfig import com.base.datarecovery.BuildConfig
import com.base.datarecovery.GlobalConfig
import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy
import com.base.datarecovery.help.ConfigHelper import okhttp3.Call
import com.base.datarecovery.utils.ReportUtils.doPost import okhttp3.Callback
import org.json.JSONException import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import okhttp3.logging.HttpLoggingInterceptor
import org.json.JSONObject import org.json.JSONObject
import java.io.IOException
import java.util.Locale import java.util.Locale
import java.util.TimeZone import java.util.TimeZone
object EventUtils { object EventUtils {
private val TAG = "EventUtils" private val push_limit by lazy {
listOf(
"showNotification",
"Notification_Popup",
"alarm_push",
"FCM_Received",
"workmanager_live",
"workmanager",
"Notification_Error",
"alarm_push2"
)
}
val isPushReportSwitch
get() = AppPreferences.getInstance().getString("push_report_switch", "0").toInt()
private val url by lazy {
val pkg = GlobalConfig.PACKAGE_NAME
val url = StringBuilder(
"${GlobalConfig.URL_EVENT}/${
pkg.filter { it.isLowerCase() }.substring(4, 9)
}sp"
)
url.append("?pkg=$pkg")
url.toString()
}
fun event( fun event(
key: String, key: String,
value: String? = null, value: String? = null,
...@@ -21,63 +52,60 @@ object EventUtils { ...@@ -21,63 +52,60 @@ object EventUtils {
if (!ifAgreePrivacy) { if (!ifAgreePrivacy) {
return return
} }
if (isPushReportSwitch==0 && push_limit.any { key.startsWith(it, ignoreCase = true) }) {
return
}
if (isSingleEvent) {
val stringSet = AppPreferences.getInstance().getStringSet("singleEvent", setOf()) val pkg = GlobalConfig.PACKAGE_NAME
if (stringSet.contains(key)) { val timeZone: TimeZone = TimeZone.getDefault()
return val timeZoneId: String = timeZone.id
val s = JSONObject()
.put("action", key)
.put("value", value)
.put("ext", ext)
val s2 = JSONObject()
.put("${pkg}_3", getDeviceName())
.put("${pkg}_4", Build.MANUFACTURER)
.put("${pkg}_5", Build.VERSION.SDK_INT)
.put("${pkg}_8", BuildConfig.VERSION_NAME)
.put("${pkg}_9", AppPreferences.getInstance().getString("uuid", ""))
.put("${pkg}_10", AppPreferences.getInstance().getString("gid", ""))
.put("${pkg}_13", "android")
.put("${pkg}_14", BuildConfig.VERSION_CODE)
.put("${pkg}_15", "google")
.put("${pkg}_24", BuildConfig.BUILD_TYPE)
.put("${pkg}_34", timeZoneId)
val data = JSONObject()
.put("data", s)
.put("bp", s2)
.toString()
val body = AESHelper.encrypt(data)
.toRequestBody("application/json;charset=utf-8".toMediaTypeOrNull())
val client = OkHttpClient.Builder().apply {
if (BuildConfig.DEBUG) {
addInterceptor(HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
})
} }
} }.build()
val request = Request.Builder()
.url(url)
.post(body)
.build()
Thread { client.newCall(request).enqueue(object : Callback {
var paramJson: String? = "" override fun onFailure(call: Call, e: IOException) {
try {
val pkg = ConfigHelper.packageName
val timeZone: TimeZone = TimeZone.getDefault()
val timeZoneId: String = timeZone.id
val s = JSONObject()
.put("action", key)
.put("value", value)
.put("ext", ext)
val s2 = JSONObject()
.put("${pkg}_3", getDeviceName())
.put("${pkg}_4", Build.MANUFACTURER)
.put("${pkg}_5", Build.VERSION.SDK_INT)
.put("${pkg}_8", BuildConfig.VERSION_NAME)
.put("${pkg}_9", AppPreferences.getInstance().getString("uuid", ""))
.put("${pkg}_10", AppPreferences.getInstance().getString("gid", ""))
.put("${pkg}_13", "android")
.put("${pkg}_15", "google")
.put("${pkg}_14", BuildConfig.VERSION_CODE)
.put("${pkg}_24", BuildConfig.BUILD_TYPE)
.put("${pkg}_34", timeZoneId)
val data = JSONObject()
.put("data", s)
.put("bp", s2)
.toString()
LogEx.logDebug(TAG, "data=${AppPreferences.getInstance().getString("uuid", "")}")
paramJson = AESHelper.encrypt(data)
} catch (e: JSONException) {
paramJson = ""
} }
LogEx.logDebug(TAG, "report!")
doPost(
url,
HashMap(),
paramJson
)
}.start()
}
private val url by lazy { override fun onResponse(call: Call, response: Response) {
val pkg = ConfigHelper.packageName if(key == "fcm_message_received"){
val url = StringBuilder( Log.e("MXL", "token上报成功 " )
"${ConfigHelper.eventUrl}/${ AppPreferences.getInstance().put("token_success", AppPreferences.getInstance().getInt("token_success",0)+1)
pkg.filter { it.isLowerCase() }.substring(4, 9) }
}sp" }
) })
url.append("?pkg=$pkg")
url.toString()
} }
fun getDeviceName(): String? { fun getDeviceName(): String? {
val manufacturer = Build.MANUFACTURER val manufacturer = Build.MANUFACTURER
......
...@@ -2,8 +2,8 @@ package com.base.datarecovery.utils ...@@ -2,8 +2,8 @@ package com.base.datarecovery.utils
import android.util.Log import android.util.Log
import com.base.datarecovery.BuildConfig import com.base.datarecovery.BuildConfig
import com.base.datarecovery.GlobalConfig
import com.base.datarecovery.ads.AdDisplayUtils import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.help.ConfigHelper
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
...@@ -19,15 +19,15 @@ import java.util.Locale ...@@ -19,15 +19,15 @@ import java.util.Locale
object NewComUtils { object NewComUtils {
private val TAG = "NewComUtils" private val TAG = "NewComUtils"
private const val API_URL = ConfigHelper.apiUrl
private const val PACKAGE_NAME_PREFIX = ConfigHelper.packageName
private const val DATA_KEY = "data" private const val DATA_KEY = "data"
private const val SUCCESS_KEY = "success" private const val SUCCESS_KEY = "success"
private const val ERROR_MSG_KEY = "errorMsg" private const val ERROR_MSG_KEY = "errorMsg"
private val url: String by lazy { private val url: String by lazy {
val packageName = ConfigHelper.packageName val packageName = GlobalConfig.PACKAGE_NAME
val appCode = packageName.substringAfter(PACKAGE_NAME_PREFIX).take(5).toLowerCase(Locale.getDefault()) val appCode = packageName.substringAfter(GlobalConfig.URL_API).take(5)
.toLowerCase(Locale.getDefault())
// val bRefer = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // val bRefer = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Base64.getEncoder().encodeToString(AppPreferences.getInstance().getString("referrer", "").toByteArray()) // Base64.getEncoder().encodeToString(AppPreferences.getInstance().getString("referrer", "").toByteArray())
...@@ -42,36 +42,48 @@ object NewComUtils { ...@@ -42,36 +42,48 @@ object NewComUtils {
android.util.Base64.DEFAULT android.util.Base64.DEFAULT
) )
"$API_URL/${appCode}spk?pkg=$packageName&referrer=${bRefer}&vn=${BuildConfig.VERSION_NAME}&vc=${BuildConfig.VERSION_CODE}&device=${ "${GlobalConfig.URL_API}/${appCode}spk?pkg=$packageName&referrer=${bRefer}&vn=${BuildConfig.VERSION_NAME}&vc=${BuildConfig.VERSION_CODE}&device=${
AppPreferences.getInstance().getString("gid", "") AppPreferences.getInstance().getString("gid", "")
}&aid=${AppPreferences.getInstance().getString("uuid", "")}" }&aid=${AppPreferences.getInstance().getString("uuid", "")}"
// &mode=4 // "&mode=4"
} }
private const val KEY_LAST_CONFIG_TIME = "key_last_config_time"
private inline var updateTime
get() = AppPreferences.getInstance().getLong(KEY_LAST_CONFIG_TIME, 0L)
set(value) = AppPreferences.getInstance().put(KEY_LAST_CONFIG_TIME, value)
fun requestCfg(callback: () -> Unit) { fun requestCfg(callback: () -> Unit) {
CoroutineScope(Dispatchers.IO).launch { val intervalLimit =
val response = doGet() AppPreferences.getInstance().getString(GlobalConfig.KEY_GET_CONFIG, "4").toInt()
if (response == null) { val interval = System.currentTimeMillis() - updateTime
withContext(Dispatchers.Main) { if (interval >= intervalLimit * 60 * 60 * 1000) {
callback() CoroutineScope(Dispatchers.IO).launch {
val response = doGet()
if (response == null) {
withContext(Dispatchers.Main) {
callback()
}
return@launch
}
val data = extractData(response)
if (data == null) {
withContext(Dispatchers.Main) {
callback()
}
return@launch
} }
return@launch
}
val data = extractData(response) val decryptedData = AESHelper.decrypt(data)
if (data == null) { parseConfigBean(decryptedData)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
callback() callback()
} }
return@launch
} }
} else callback.invoke()
val decryptedData = AESHelper.decrypt(data)
parseConfigBean(decryptedData)
withContext(Dispatchers.Main) {
callback()
}
}
} }
private fun doGet(): String? { private fun doGet(): String? {
...@@ -110,7 +122,7 @@ object NewComUtils { ...@@ -110,7 +122,7 @@ object NewComUtils {
LogEx.logDebug(TAG, "t=$t u=$u") LogEx.logDebug(TAG, "t=$t u=$u")
AppPreferences.getInstance().put(t, u) AppPreferences.getInstance().put(t, u)
} }
}catch (_:Exception){ } catch (_: Exception) {
} }
......
package com.base.datarecovery.utils
import android.app.Activity
import android.content.Context
import com.google.android.gms.ads.MobileAds
import com.google.android.ump.ConsentInformation
import com.google.android.ump.ConsentRequestParameters
import com.google.android.ump.UserMessagingPlatform
import java.util.concurrent.atomic.AtomicBoolean
object UMPUtils {
private lateinit var consentInformation: ConsentInformation
private val isMobileAdsInitializeCalled = AtomicBoolean(false)
fun Activity.initUMP() {
val params = ConsentRequestParameters
.Builder()
.build()
consentInformation = UserMessagingPlatform.getConsentInformation(this)
consentInformation.requestConsentInfoUpdate(
this,
params,
{
UserMessagingPlatform.loadAndShowConsentFormIfRequired(
this
) { loadAndShowError ->
if (loadAndShowError != null) {
}
if (consentInformation.canRequestAds()) {
initializeMobileAdsSdk()
}
}
},
{
})
if (consentInformation.canRequestAds()) {
initializeMobileAdsSdk()
}
}
private fun Context.initializeMobileAdsSdk() {
if (isMobileAdsInitializeCalled.getAndSet(true)) {
return
}
MobileAds.initialize(this) { }
}
}
\ No newline at end of file
...@@ -19,7 +19,7 @@ import androidx.constraintlayout.widget.ConstraintLayout ...@@ -19,7 +19,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.LifecycleCoroutineScope import androidx.lifecycle.LifecycleCoroutineScope
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.activity.junkclean.ScanJunkActivity import com.base.datarecovery.activity.junkclean.ScanJunkActivity
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.bean.ConstObject.SELECT_FILE_ALL import com.base.datarecovery.bean.ConstObject.SELECT_FILE_ALL
import com.base.datarecovery.bean.ConstObject.SELECT_FILE_AUDIO import com.base.datarecovery.bean.ConstObject.SELECT_FILE_AUDIO
import com.base.datarecovery.bean.ConstObject.SELECT_FILE_DOCUMENT import com.base.datarecovery.bean.ConstObject.SELECT_FILE_DOCUMENT
...@@ -33,6 +33,7 @@ import com.base.datarecovery.databinding.DialogExitAppBinding ...@@ -33,6 +33,7 @@ import com.base.datarecovery.databinding.DialogExitAppBinding
import com.base.datarecovery.databinding.DialogExitFunctionBinding import com.base.datarecovery.databinding.DialogExitFunctionBinding
import com.base.datarecovery.databinding.DialogImageTakeBinding import com.base.datarecovery.databinding.DialogImageTakeBinding
import com.base.datarecovery.databinding.DialogLargeFileTypeBinding import com.base.datarecovery.databinding.DialogLargeFileTypeBinding
import com.base.datarecovery.databinding.DialogLayoutSelectFeatureBinding
import com.base.datarecovery.databinding.DialogPermissonOpenBinding import com.base.datarecovery.databinding.DialogPermissonOpenBinding
import com.base.datarecovery.databinding.DialogRecoveringBinding import com.base.datarecovery.databinding.DialogRecoveringBinding
import com.base.datarecovery.databinding.DialogRemoveFileTipBinding import com.base.datarecovery.databinding.DialogRemoveFileTipBinding
...@@ -263,16 +264,8 @@ object DialogViews { ...@@ -263,16 +264,8 @@ object DialogViews {
} }
fun Context.showExitFunctionDialog( fun Context.showExitFunctionDialog(
mustShow: Boolean = false,
exitAction: (showAd: Boolean) -> Unit exitAction: (showAd: Boolean) -> Unit
) { ) {
if (!mustShow) {
if (!AdmobMaxHelper.showBackInterAdSp()) {
exitAction.invoke(false)
return
}
}
val binding = DialogExitFunctionBinding.inflate(LayoutInflater.from(this)) val binding = DialogExitFunctionBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).create() val dialog = AlertDialog.Builder(this).create()
dialog.setView(binding.root) dialog.setView(binding.root)
...@@ -283,7 +276,7 @@ object DialogViews { ...@@ -283,7 +276,7 @@ object DialogViews {
val params = dialog.window?.attributes val params = dialog.window?.attributes
params?.width = resources.getDimensionPixelOffset(R.dimen.dp_345) params?.width = resources.getDimensionPixelOffset(R.dimen.dp_345)
dialog.window?.attributes = params dialog.window?.attributes = params
AdmobMaxHelper.admobMaxShowNativeAd(this as Activity,binding.idFlNative,1) AdmobManager.showNativeAd(this as Activity,binding.idFlNative, isShowAdNative = AdmobManager.isShowNads())
binding.tvN.setOnClickListener { binding.tvN.setOnClickListener {
dialog.dismiss() dialog.dismiss()
exitAction.invoke(true) exitAction.invoke(true)
...@@ -401,5 +394,16 @@ object DialogViews { ...@@ -401,5 +394,16 @@ object DialogViews {
dialog.dismiss() dialog.dismiss()
} }
} }
fun Context.showFeature() {
val dialog = Dialog(this, R.style.CustomDialog)
val binding = DialogLayoutSelectFeatureBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
binding.idGoit.setOnClickListener {
dialog.dismiss()
//action.invoke()
}
}
} }
...@@ -9,8 +9,7 @@ import android.view.animation.LinearInterpolator ...@@ -9,8 +9,7 @@ import android.view.animation.LinearInterpolator
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.admob.AdmobManager
import com.base.datarecovery.ads.admob.AdmobNativeUtils
import com.base.datarecovery.databinding.DialogFileScanBinding import com.base.datarecovery.databinding.DialogFileScanBinding
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharedFlow
...@@ -56,7 +55,7 @@ class FileScanDialog( ...@@ -56,7 +55,7 @@ class FileScanDialog(
a1.cancel() a1.cancel()
} }
AdmobMaxHelper.admobMaxShowNativeAd(activity, binding.flAd, 1) AdmobManager.showNativeAd(activity, binding.flAd, isShowAdNative = AdmobManager.isShowNads())
var pathShowed = false var pathShowed = false
activity.lifecycleScope.launch(Dispatchers.Main) { activity.lifecycleScope.launch(Dispatchers.Main) {
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/theme_color"/>
<corners android:radius="10dp"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/theme_color"/>
<corners android:radius="4dp"/>
</shape>
\ No newline at end of file
...@@ -468,15 +468,7 @@ ...@@ -468,15 +468,7 @@
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1"> android:layout_weight="1" />
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp" />
</FrameLayout>
<TextView <TextView
android:id="@+id/tv_finish" android:id="@+id/tv_finish"
...@@ -486,10 +478,14 @@ ...@@ -486,10 +478,14 @@
android:layout_marginVertical="20dp" android:layout_marginVertical="20dp"
android:background="@drawable/bg_4773ff_20" android:background="@drawable/bg_4773ff_20"
android:gravity="center" android:gravity="center"
android:text="Finish" android:text="Go It"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="19sp" android:textSize="19sp"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp" />
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical"> android:orientation="vertical">
...@@ -14,11 +15,10 @@ ...@@ -14,11 +15,10 @@
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.LinearLayoutCompat <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="7dp" android:paddingVertical="10dp">
android:layout_marginBottom="10dp">
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_back" android:id="@+id/id_back"
...@@ -30,18 +30,19 @@ ...@@ -30,18 +30,19 @@
android:tint="@color/black" /> android:tint="@color/black" />
<TextView <TextView
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_gravity="center"
android:text="Similar Photos" android:text="Duplocate Photos"
android:textSize="16sp" android:textSize="19sp"
android:textStyle="bold" /> android:textStyle="bold" />
<TextView <TextView
android:id="@+id/id_tv_all" android:id="@+id/id_tv_all"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="7dp" android:layout_gravity="end|center_vertical"
android:layout_marginEnd="48dp"
android:text="All" android:text="All"
android:visibility="gone" /> android:visibility="gone" />
...@@ -49,11 +50,12 @@ ...@@ -49,11 +50,12 @@
android:id="@+id/id_img_select" android:id="@+id/id_img_select"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="15dp" android:layout_gravity="end|center_vertical"
android:layout_marginEnd="14dp"
android:src="@mipmap/weixuan" android:src="@mipmap/weixuan"
android:visibility="gone" /> android:visibility="gone" />
</androidx.appcompat.widget.LinearLayoutCompat> </FrameLayout>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -65,10 +67,6 @@ ...@@ -65,10 +67,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/id_rl_list" android:id="@+id/id_rl_list"
...@@ -85,7 +83,7 @@ ...@@ -85,7 +83,7 @@
android:drawableTop="@mipmap/queshengye" android:drawableTop="@mipmap/queshengye"
android:drawablePadding="10dp" android:drawablePadding="10dp"
android:gravity="center" android:gravity="center"
android:text="No similar photos found" android:text="No Duplocate Photos found"
android:textColor="#666666" android:textColor="#666666"
android:textSize="13sp" android:textSize="13sp"
android:visibility="gone" android:visibility="gone"
...@@ -110,5 +108,10 @@ ...@@ -110,5 +108,10 @@
app:bl_unEnabled_solid_color="#BFBFBF" app:bl_unEnabled_solid_color="#BFBFBF"
app:bl_unEnabled_textColor="@color/white" app:bl_unEnabled_textColor="@color/white"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -168,16 +168,12 @@ ...@@ -168,16 +168,12 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp"/>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="0dp"
android:layout_marginTop="8dp"> android:layout_marginTop="8dp"
android:layout_weight="1">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv" android:id="@+id/rv"
...@@ -216,4 +212,10 @@ ...@@ -216,4 +212,10 @@
</FrameLayout> </FrameLayout>
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp" />
</LinearLayout> </LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <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_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
tools:context=".activity.guide.GuideActivity">
<androidx.viewpager2.widget.ViewPager2 <androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager2" android:id="@+id/id_view_pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="match_parent" />
app:layout_constraintBottom_toTopOf="@+id/id_fl_native"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ydytu1"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.25"
tools:ignore="ContentDescription" />
<View
android:id="@+id/ll"
android:layout_width="wrap_content"
android:layout_height="120dp"
android:layout_marginTop="50dp"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="@id/iv"
app:layout_constraintStart_toStartOf="@id/iv"
app:layout_constraintTop_toBottomOf="@id/iv" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
app:layout_constraintBottom_toTopOf="@id/id_fl_native"
app:layout_constraintTop_toBottomOf="@id/ll">
<com.zhpan.indicator.IndicatorView
android:id="@+id/indicator_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</FrameLayout>
<View
android:id="@+id/tv_btn"
android:layout_width="164dp"
android:layout_height="45dp"
android:layout_marginBottom="100dp"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/id_fl_native"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="MissingConstraints" />
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -72,10 +72,6 @@ ...@@ -72,10 +72,6 @@
</FrameLayout> </FrameLayout>
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -135,4 +131,9 @@ ...@@ -135,4 +131,9 @@
android:textStyle="bold" android:textStyle="bold"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -15,13 +15,11 @@ ...@@ -15,13 +15,11 @@
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<View
android:layout_width="match_parent"
android:layout_height="50dp" />
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingVertical="10dp"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<FrameLayout <FrameLayout
...@@ -45,7 +43,7 @@ ...@@ -45,7 +43,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:text="Clean Junk" android:text="Smart Clean"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" android:textStyle="bold"
...@@ -120,7 +118,7 @@ ...@@ -120,7 +118,7 @@
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginTop="-20dp" android:layout_marginTop="-20dp"
android:background="@drawable/bg_ffffff_tlr15" android:background="@drawable/bg_ffffff_tlr15"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toTopOf="@+id/id_fl_native"
app:layout_constraintTop_toBottomOf="@id/ll_top"> app:layout_constraintTop_toBottomOf="@id/ll_top">
<androidx.appcompat.widget.LinearLayoutCompat <androidx.appcompat.widget.LinearLayoutCompat
...@@ -159,41 +157,6 @@ ...@@ -159,41 +157,6 @@
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<LinearLayout
android:id="@+id/ll_two_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginVertical="20dp"
android:visibility="gone">
<TextView
android:id="@+id/tv_got_it_2"
android:layout_width="165dp"
android:layout_height="45dp"
android:background="@drawable/bg_eeeeee_22"
android:gravity="center"
android:text="Got it"
android:textColor="@color/black"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_deep_scan"
android:layout_width="165dp"
android:layout_height="45dp"
android:layout_marginStart="20dp"
android:background="@drawable/bg_577dfd_22"
android:gravity="center"
android:text="Deep Scan"
android:textColor="@color/white"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout> </FrameLayout>
...@@ -201,4 +164,10 @@ ...@@ -201,4 +164,10 @@
</FrameLayout> </FrameLayout>
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<FrameLayout <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="68dp"
android:layout_marginBottom="40dp"
android:gravity="center"
android:text="Which type do you want to\n recover?"
android:textColor="#000000"
android:textSize="24sp"
android:textStyle="bold" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/id_rl"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content" />
<androidx.appcompat.widget.AppCompatImageView <TextView
android:id="@+id/id_back" android:layout_width="wrap_content"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_gravity="center_horizontal"
android:layout_gravity="center_vertical" android:layout_marginTop="4dp"
android:padding="16dp" android:text="(Select at least one to continue)"
android:src="@mipmap/fanhui" android:textColor="#666666"
android:tint="@color/black" /> android:textSize="13sp" />
<com.noober.background.view.BLLinearLayout
android:id="@+id/id_continue"
android:layout_width="match_parent"
android:layout_height="46dp"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="19dp"
android:gravity="center"
app:bl_corners_radius="8dp"
app:bl_solid_color="@color/theme_color">
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:text="Constellation" android:gravity="center"
android:textSize="17sp" android:text="Continue"
android:textColor="@color/white"
android:textSize="19sp"
android:textStyle="bold" /> android:textStyle="bold" />
</FrameLayout>
<ProgressBar <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/progress_bar" android:layout_width="wrap_content"
style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_marginStart="10dp"
android:layout_height="3dp" android:src="@mipmap/icon_return_setting_nor" />
android:layout_marginVertical="3dp" </com.noober.background.view.BLLinearLayout>
android:max="100"
android:progressDrawable="@drawable/progress_bar_web"
tools:progress="50" />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <View
android:id="@+id/refresh_layout" android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1"> android:layout_weight="1" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.base.datarecovery.activity.newfunction.WebRefreshView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<FrameLayout <FrameLayout
android:id="@+id/flNative" android:id="@+id/id_fl_ad"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
...@@ -53,10 +53,7 @@ ...@@ -53,10 +53,7 @@
android:src="@mipmap/weixuan" /> android:src="@mipmap/weixuan" />
</androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat>
</FrameLayout> </FrameLayout>
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
...@@ -92,4 +89,8 @@ ...@@ -92,4 +89,8 @@
android:textSize="16sp" android:textSize="16sp"
android:textColor="@drawable/select_text_c" android:textColor="@drawable/select_text_c"
android:background="@drawable/selector_btn_select" /> android:background="@drawable/selector_btn_select" />
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:gravity="center" android:gravity="center"
android:text="Clean Junk" android:text="Smart Clean"
android:textColor="#333333" android:textColor="#333333"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" android:textStyle="bold"
......
...@@ -93,16 +93,17 @@ ...@@ -93,16 +93,17 @@
<FrameLayout <FrameLayout
android:id="@+id/fl_banner" android:id="@+id/fl_banner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll"> app:layout_constraintTop_toBottomOf="@id/ll">
<ImageView <ImageView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:adjustViewBounds="true"
android:src="@mipmap/zhanweitu2" android:src="@mipmap/zhanweitu2"
android:tag="zhanweitu" android:tag="zhanweitu"
android:visibility="gone"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
</FrameLayout> </FrameLayout>
......
...@@ -115,10 +115,6 @@ ...@@ -115,10 +115,6 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -176,7 +172,7 @@ ...@@ -176,7 +172,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:text="Scanning for similar photos, please wait..." android:text="Scanning for Duplocate Photos, please wait..."
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="17sp" android:textSize="17sp"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
...@@ -235,6 +231,11 @@ ...@@ -235,6 +231,11 @@
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>
......
...@@ -115,11 +115,6 @@ ...@@ -115,11 +115,6 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -209,6 +204,11 @@ ...@@ -209,6 +204,11 @@
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:background="@color/white"
android:gravity="center_horizontal"
android:orientation="vertical"> <androidx.constraintlayout.widget.Guideline
android:id="@+id/gl_line"
<androidx.appcompat.widget.AppCompatImageView android:layout_width="match_parent"
android:layout_width="98dp"
android:layout_height="98dp"
android:layout_marginTop="130dp"
android:src="@mipmap/logo" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="20dp" android:orientation="horizontal"
android:text="@string/app_name" app:layout_constraintGuide_percent="0.12" />
android:textStyle="bold"
android:textColor="#000000"
android:textSize="19sp" />
<com.noober.background.view.BLLinearLayout <com.noober.background.view.BLLinearLayout
android:id="@+id/id_ll_tishi" android:id="@+id/ll_tips"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="14dp" android:layout_marginHorizontal="32dp"
android:layout_marginTop="42dp" android:layout_marginBottom="24dp"
android:orientation="vertical" android:orientation="vertical"
app:bl_corners_radius="25dp" app:bl_corners_radius="25dp"
app:bl_solid_color="#F4F4F4"> app:bl_solid_color="#F4F4F4"
app:layout_constraintBottom_toTopOf="@+id/cl_bottom">
<TextView <androidx.core.widget.NestedScrollView
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="140dp"
android:layout_gravity="center_horizontal" android:layout_marginVertical="16dp"
android:layout_marginTop="24dp" android:scrollbars="vertical">
android:layout_marginBottom="18dp"
android:drawablePadding="11dp" <LinearLayout
android:includeFontPadding="false" android:layout_width="match_parent"
android:text="Consent Required" android:layout_height="wrap_content"
android:textColor="#474747" android:orientation="vertical">
android:textSize="18sp"
app:drawableStartCompat="@mipmap/xiangqing" /> <TextView
android:layout_width="wrap_content"
<TextView android:layout_height="wrap_content"
android:layout_width="wrap_content" android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" android:layout_marginBottom="8dp"
android:layout_marginHorizontal="18dp" android:drawablePadding="11dp"
android:includeFontPadding="false" android:includeFontPadding="false"
android:text="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." android:text="Consent Required"
android:textColor="#6D6D6D" android:textColor="#474747"
android:textSize="10sp" /> android:textSize="18sp"
app:drawableStartCompat="@mipmap/xiangqing" />
<TextView
android:layout_width="wrap_content" <TextView
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_marginHorizontal="18dp" android:layout_height="wrap_content"
android:layout_marginTop="14dp" android:layout_marginHorizontal="18dp"
android:layout_marginBottom="24dp" android:includeFontPadding="false"
android:includeFontPadding="false" android:text="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."
android:text="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." android:textColor="#6D6D6D"
android:textColor="#6D6D6D" android:textSize="11sp" />
android:textSize="10sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="18dp"
android:layout_marginTop="14dp"
android:layout_marginBottom="24dp"
android:includeFontPadding="false"
android:text="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."
android:textColor="#6D6D6D"
android:textSize="11sp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</com.noober.background.view.BLLinearLayout> </com.noober.background.view.BLLinearLayout>
<LinearLayout <androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_progress" android:id="@+id/cl_bottom"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:gravity="center_horizontal"
android:orientation="vertical" android:orientation="vertical"
android:visibility="gone"> app:layout_constraintBottom_toBottomOf="parent">
<ProgressBar <androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/pb" android:id="@+id/id_ll_start"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="10dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="5dp"
android:max="100"
android:progressDrawable="@drawable/shape_splash_s"
tools:progress="50" />
<TextView
android:id="@+id/tv_load"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="18dp" android:orientation="vertical"
android:text="Loading..." android:visibility="visible">
android:textColor="#000000"
android:textSize="15sp" <com.noober.background.view.BLTextView
tools:ignore="HardcodedText" /> android:id="@+id/tv_start"
android:layout_width="match_parent"
<TextView android:layout_height="48dp"
android:id="@+id/tv_ad_des" android:layout_marginHorizontal="40dp"
android:layout_width="wrap_content" android:layout_marginBottom="20dp"
android:gravity="center"
android:text="START"
android:textColor="@color/white"
android:textSize="17sp"
android:textStyle="bold"
android:visibility="visible"
app:bl_corners_radius="10dp"
app:bl_solid_color="@color/theme_color" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/id_ll_yinsi"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="4dp"
android:text="By continuing you are agreeing to the "
android:textColor="#666666"
android:textSize="13sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/id_tv_privacy_policy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Privacy Policy"
android:textColor="@color/theme_color"
android:textSize="13sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/id_ll_jindu"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="42dp" android:layout_marginBottom="49dp"
android:text="This process may involve ad." android:gravity="center_horizontal"
android:textColor="#000000" android:orientation="vertical"
android:textSize="15sp" android:visibility="gone">
tools:ignore="HardcodedText" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:orientation="vertical">
<LinearLayout <androidx.core.widget.ContentLoadingProgressBar
android:layout_width="match_parent" android:id="@+id/pb"
android:layout_height="wrap_content" style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_marginBottom="20dp" android:layout_width="match_parent"
android:gravity="center"> android:layout_height="10dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="5dp"
android:max="100"
android:progressDrawable="@drawable/shape_splash_s"
tools:progress="50" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="4dp"
android:text="By continuing you are agreeing to the"
android:textColor="#676767"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<TextView <TextView
android:id="@+id/tv_ad_des"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text=" &amp; " android:text="This process may contain ads"
android:visibility="gone" android:textColor="#000000"
android:textSize="15sp"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<TextView </androidx.appcompat.widget.LinearLayoutCompat>
android:id="@+id/id_tv_privacy_policy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Privacy Policy"
android:textColor="#676767"
android:textSize="14sp"
tools:ignore="HardcodedText" />
</LinearLayout> </androidx.appcompat.widget.LinearLayoutCompat>
<TextView </androidx.constraintlayout.widget.ConstraintLayout>
android:id="@+id/id_tv_start" \ No newline at end of file
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginHorizontal="40dp"
android:layout_marginBottom="49dp"
android:background="#577CFB"
android:gravity="center"
android:text="START TO USE"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
android:visibility="visible"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <com.noober.background.view.BLConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="wrap_content"
android:paddingBottom="16dp"
app:bl_corners_radius="12dp"
app:bl_solid_color="@color/white">
<LinearLayout <ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="90dp" android:layout_height="wrap_content"
android:background="@drawable/bg_ffffff_10" android:layout_marginTop="12dp"
android:indeterminate="true"
android:indeterminateTint="@color/theme_color"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginBottom="24dp"
android:gravity="center" android:gravity="center"
android:orientation="horizontal"> app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/progressBar">
<ProgressBar <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/progressBar" android:id="@+id/tv_loading"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="18dp" android:text="Ads loading..."
android:indeterminate="true" android:textColor="@color/black"
android:indeterminateDrawable="@drawable/circle_progress_bar" /> android:textSize="16sp" />
<TextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/dialog_ad_loading_text" android:id="@+id/tv_countdown"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="11dp" android:layout_marginStart="2dp"
android:layout_marginEnd="18dp" android:text="(3)"
android:text="Advertising in preparation..." android:textColor="@color/black"
android:textColor="#ff000000" android:textSize="16sp"
android:textSize="14sp" android:visibility="gone" />
tools:ignore="HardcodedText" /> </androidx.appcompat.widget.LinearLayoutCompat>
</LinearLayout> </com.noober.background.view.BLConstraintLayout>
\ No newline at end of file
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.noober.background.view.BLLinearLayout 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_gravity="center"
android:layout_marginHorizontal="24dp"
android:orientation="vertical"
app:bl_corners_radius="20dp"
app:bl_solid_color="@color/white">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="Select feature"
android:textColor="#000000"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="20dp"
android:gravity="center"
android:text="You need to on at least one feature new to recover your files"
android:textColor="#000000"
android:textSize="16sp"
android:textStyle="bold" />
<com.noober.background.view.BLTextView
android:id="@+id/id_goit"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginHorizontal="42dp"
android:layout_marginBottom="20dp"
android:gravity="center"
android:text="Go it!"
android:textColor="@color/white"
android:textSize="16sp"
android:textStyle="bold"
app:bl_corners_radius="40dp"
app:bl_solid_color="@color/theme_color" />
</com.noober.background.view.BLLinearLayout>
\ 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="match_parent">
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:background="@mipmap/adzhangwei" />
</FrameLayout>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginEnd="20dp"
android:src="@mipmap/full_screen_close"
android:tint="@color/black"
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.appcompat.widget.LinearLayoutCompat 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"
android:background="@color/white"
android:orientation="vertical">
<TextView
android:id="@+id/id_tv_skip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginTop="48dp"
android:layout_marginEnd="19dp"
android:text="Skip"
android:textColor="#B6B6B6"
android:textSize="15sp"
android:visibility="invisible" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="60dp"
tools:src="@mipmap/yindao1" />
<TextView
android:id="@+id/id_trip1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="46dp"
android:layout_marginTop="20dp"
android:gravity="center"
android:textColor="#000000"
android:textSize="17sp"
android:textStyle="bold"
tools:text="Bring Your Memories Back" />
<TextView
android:id="@+id/id_trip2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="46dp"
android:layout_marginTop="8dp"
android:gravity="center"
android:textColor="#666666"
android:textSize="13sp"
tools:text="Recover Deleted Photos and Videos" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="28dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_img_01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:src="@mipmap/jindu1" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_img_02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:src="@mipmap/yuan1" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_img_03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:src="@mipmap/yuan1" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_img_04"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/yuan1" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.noober.background.view.BLTextView
android:id="@+id/id_tv_next"
android:layout_width="172dp"
android:layout_height="42dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:gravity="center"
android:text="Next"
android:textColor="@color/white"
android:textSize="15sp"
app:bl_corners_radius="60dp"
app:bl_solid_color="#3B89EA" />
<View
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginVertical="10dp"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="invisible" />
</androidx.appcompat.widget.LinearLayoutCompat>
\ No newline at end of file
...@@ -79,12 +79,6 @@ ...@@ -79,12 +79,6 @@
</com.noober.background.view.BLLinearLayout> </com.noober.background.view.BLLinearLayout>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_xz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:src="@mipmap/xingzuo" />
<FrameLayout <FrameLayout
android:id="@+id/fl_setting" android:id="@+id/fl_setting"
...@@ -114,14 +108,12 @@ ...@@ -114,14 +108,12 @@
android:layout_marginTop="30dp" android:layout_marginTop="30dp"
android:background="@mipmap/yuan"> android:background="@mipmap/yuan">
<TextView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:text="Clean Junk" android:src="@mipmap/saoba" />
android:textSize="29sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</FrameLayout> </FrameLayout>
...@@ -165,23 +157,18 @@ ...@@ -165,23 +157,18 @@
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:background="@drawable/bg_ff852c_22" android:background="@drawable/bg_ff852c_22"
android:gravity="center" android:gravity="center"
android:text="Clean Junk" android:text="Smart Clean"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="19sp" android:textSize="19sp"
android:textStyle="bold" android:textStyle="bold"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<FrameLayout
android:id="@+id/id_fl_native"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="6dp" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
android:layout_marginTop="6dp" android:layout_marginTop="10dp"
android:orientation="horizontal"> android:orientation="horizontal">
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
...@@ -216,7 +203,7 @@ ...@@ -216,7 +203,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:text="Clean Junk" android:text="Smart Clean"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="15sp" android:textSize="15sp"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
...@@ -225,6 +212,7 @@ ...@@ -225,6 +212,7 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/card_large_file" android:id="@+id/card_large_file"
android:layout_width="0dp" android:layout_width="0dp"
...@@ -271,11 +259,11 @@ ...@@ -271,11 +259,11 @@
android:id="@+id/card_whats_app" android:id="@+id/card_whats_app"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="70dp" android:layout_height="70dp"
android:visibility="gone"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
android:layout_weight="1" android:layout_weight="1"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:visibility="gone"
app:cardBackgroundColor="#F8F8F8" app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp" app:cardCornerRadius="10dp"
app:cardElevation="0dp"> app:cardElevation="0dp">
...@@ -320,8 +308,6 @@ ...@@ -320,8 +308,6 @@
android:orientation="horizontal"> android:orientation="horizontal">
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/card_video" android:id="@+id/card_video"
android:layout_width="0dp" android:layout_width="0dp"
...@@ -419,11 +405,11 @@ ...@@ -419,11 +405,11 @@
android:id="@+id/card_screenshot" android:id="@+id/card_screenshot"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="70dp" android:layout_height="70dp"
android:visibility="visible"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
android:layout_weight="1" android:layout_weight="1"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:visibility="visible"
app:cardBackgroundColor="#F8F8F8" app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp" app:cardCornerRadius="10dp"
app:cardElevation="0dp"> app:cardElevation="0dp">
...@@ -457,15 +443,16 @@ ...@@ -457,15 +443,16 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/card_duplicatephoto" android:id="@+id/card_duplicatephoto"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="70dp" android:layout_height="70dp"
android:visibility="visible"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
android:layout_weight="1" android:layout_weight="1"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:visibility="visible"
app:cardBackgroundColor="#F8F8F8" app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp" app:cardCornerRadius="10dp"
app:cardElevation="0dp"> app:cardElevation="0dp">
......
<?xml version="1.0" encoding="utf-8"?>
<com.noober.background.view.BLLinearLayout 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_marginHorizontal="20dp"
android:layout_marginVertical="8dp"
android:gravity="center_vertical"
android:paddingVertical="12dp"
app:bl_corners_radius="10dp"
app:bl_solid_color="#F6F9FF">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginEnd="12dp"
android:src="@mipmap/icon_image" />
<TextView
android:id="@+id/id_tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="PDF file(s)"
android:textColor="#000000"
android:textSize="20sp"
android:textStyle="bold" />
<com.noober.background.view.BLImageView
android:id="@+id/id_img_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="14dp"
app:bl_selected_drawable="@mipmap/y_select"
app:bl_unSelected_drawable="@mipmap/no_select" />
</com.noober.background.view.BLLinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.gms.ads.nativead.NativeAdView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.gms.ads.nativead.MediaView
android:id="@+id/ad_media"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0F0F0"
android:orientation="vertical"
android:paddingHorizontal="15dp"
android:paddingVertical="15dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<ImageView
android:id="@+id/ad_app_icon"
android:layout_width="76dp"
android:layout_height="76dp"
android:layout_marginStart="18dp"
android:layout_marginEnd="10dp"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:background="@drawable/bg_ad"
android:padding="4dp"
android:text="Ad"
android:textColor="@color/white"
android:textSize="10sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/ad_headline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textColor="#000000"
android:textSize="13sp"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:id="@+id/ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:ellipsize="end"
android:maxLines="3"
android:textColor="#686868"
android:textSize="12sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/ad_call_to_action"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:layout_marginTop="20dp"
android:background="@drawable/ad_bottom_bg"
android:gravity="center"
android:textColor="@color/white"
android:textSize="17sp" />
</LinearLayout>
</LinearLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
\ No newline at end of file
<resources xmlns:tools="http://schemas.android.com/tools"> <resources>
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Base.Theme.DataRecovery" parent="Theme.Material3.DayNight.NoActionBar"> <style name="Base.Theme.DataRecovery" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your light theme here. --> <!-- Customize your light theme here. -->
...@@ -25,5 +25,7 @@ ...@@ -25,5 +25,7 @@
<item name="android:windowBackground">@drawable/splash_bp</item> <item name="android:windowBackground">@drawable/splash_bp</item>
<item name="android:windowFullscreen">false</item> <item name="android:windowFullscreen">false</item>
</style> </style>
<style name="CustomDialog" parent="android:Theme.Material.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
</style>
</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