Commit 230eb832 authored by wanglei's avatar wanglei

...

parent c1d33939
......@@ -47,18 +47,6 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activity.appmanager.AppManagerActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.appmanager.AppManagerAnimationActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.battery.BatteryInfoAnimationActivity"
android:exported="false"
......@@ -83,18 +71,6 @@
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.appprocess.AppProcessAnimationActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.appprocess.AppProcessActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.photomanager.PhotoManagerAnimationActivity"
android:exported="false"
......@@ -178,47 +154,6 @@
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.whatsapp.WhatsAppCleanerActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.whatsapp.WhatsAppCleanerAnimationActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.whatsapp.WhatsAppMessageCleanActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" /> <!-- <activity -->
<!-- android:name=".activity.privacyspace.PrivacyPinTwoActivity" -->
<!-- android:exported="false" -->
<!-- android:launchMode="singleTop" -->
<!-- android:screenOrientation="portrait" -->
<!-- tools:ignore="DiscouragedApi,LockedOrientationActivity" /> -->
<!-- <activity -->
<!-- android:name=".activity.privacyspace.PrivacyPinOneActivity" -->
<!-- android:exported="false" -->
<!-- android:launchMode="singleTop" -->
<!-- android:screenOrientation="portrait" -->
<!-- tools:ignore="DiscouragedApi,LockedOrientationActivity" /> -->
<!-- <activity -->
<!-- android:name=".activity.privacyspace.PrivacyImportActivity" -->
<!-- android:exported="false" -->
<!-- android:launchMode="singleTop" -->
<!-- android:screenOrientation="portrait" -->
<!-- tools:ignore="DiscouragedApi,LockedOrientationActivity" /> -->
<!-- <activity -->
<!-- android:name=".activity.privacyspace.PrivacySpaceActivity" -->
<!-- android:exported="false" -->
<!-- android:launchMode="singleTop" -->
<!-- android:screenOrientation="portrait" -->
<!-- tools:ignore="DiscouragedApi,LockedOrientationActivity" /> -->
<activity
android:name=".activity.recovery.FileRecoveredActivity"
android:exported="false"
......@@ -239,19 +174,24 @@
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".fragment.WebBrowserActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.junkclean.ScanJunk2Activity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".view.WeatherInterface"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.guide.CleanGuideActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.XzLoadingActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<meta-data
android:name="com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"
......@@ -262,10 +202,6 @@
<meta-data
android:name="com.google.android.gms.ads.flag.NATIVE_AD_DEBUGGER_ENABLED"
android:value="false" />
<!-- 常驻通知栏 -->
<!-- <service-->
<!-- android:name=".service.StayNotificationService"-->
<!-- android:foregroundServiceType="dataSync" />-->
<service
android:name=".service.StayJobService"
android:exported="false"
......
package com.base.filerecoveryrecyclebin.activity.appmanager
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
import android.graphics.Color
import android.net.Uri
import android.view.View
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope
import com.base.filerecoveryrecyclebin.adapter.AppManagerAdapter
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.bean.AppBean
import com.base.filerecoveryrecyclebin.databinding.ActivityAppManagerBinding
import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.utils.RamUtils.ramPair
import com.base.filerecoveryrecyclebin.view.DialogViews.showExitFunctionDialog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class AppManagerActivity : BaseActivity<ActivityAppManagerBinding>() {
var uninstallTimes = 0
override val binding: ActivityAppManagerBinding by lazy {
ActivityAppManagerBinding.inflate(layoutInflater)
}
private lateinit var adapter: AppManagerAdapter
private var ePercent = 0
@SuppressLint("SetTextI18n")
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
val ramPair = ramPair()
val percent = ((ramPair.first.toFloat() / ramPair.second.toFloat()) * 100).toInt()
ePercent = percent
adapter = AppManagerAdapter(true) { pkg ->
if (uninstallTimes % 3 == 0 && uninstallTimes > 0) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this, isLoading = false) { unInstall(pkg) }
} else {
unInstall(pkg)
}
}
binding.rv.adapter = adapter
initData()
}
private fun unInstall(pkg: String) {
val intent = Intent(Intent.ACTION_DELETE, Uri.parse("package:${pkg}"))
launcher.launch(intent) {
if (!isInstalled(this, pkg)) {
adapter.removeBean(pkg)
uninstallTimes++
}
}
}
private fun isInstalled(context: Context, pkg: String, error: (() -> Unit)? = null): Boolean {
return try {
context.packageManager.getPackageInfo(pkg, 0)
true
} catch (e: Exception) {
error?.invoke()
false
}
}
override fun initListener() {
super.initListener()
onBackPressedDispatcher.addCallback {
showExitFunctionDialog(this@AppManagerActivity){showAd ->
if (showAd){
AdmobMaxHelper.admobMaxShowInterstitialAd(this@AppManagerActivity, isLoading = false) {
finishToMain()
}
}else{
finishToMain()
}
}
}
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
}
@SuppressLint("QueryPermissionsNeeded")
private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
val pm = packageManager
val packages = pm.getInstalledPackages(0)
val list = arrayListOf<AppBean>()
packages.forEach { app ->
if (isLaunchApp(this@AppManagerActivity, app)) {
val appBean = AppBean(
app.applicationInfo.loadIcon(pm),
app.applicationInfo.loadLabel(pm).toString(),
app.applicationInfo.packageName
)
list.add(appBean)
}
}
launch(Dispatchers.Main) {
binding.pbLoading.visibility = View.GONE
adapter.setData(list)
}
}
private fun isLaunchApp(context: Context, app: PackageInfo, filterSystem: Boolean = true): Boolean {
val flagSystem = (app.applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) < 1
val flag = if (filterSystem) flagSystem else true
return flag && app.applicationInfo.packageName != context.packageName
}
}
\ No newline at end of file
package com.base.filerecoveryrecyclebin.activity.appmanager
import android.annotation.SuppressLint
import android.content.Intent
import android.view.View
import android.widget.Toast
import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.databinding.ActivityAppProcessAnimationBinding
import com.base.filerecoveryrecyclebin.help.BaseActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlin.random.Random
class AppManagerAnimationActivity : BaseActivity<ActivityAppProcessAnimationBinding>() {
override val binding: ActivityAppProcessAnimationBinding by lazy {
ActivityAppProcessAnimationBinding.inflate(layoutInflater)
}
private var job: Job? = null
override fun initView() {
playLottie()
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative)
}
override fun initListener() {
onBackPressedDispatcher.addCallback {
Toast.makeText(this@AppManagerAnimationActivity, "wait a moment", Toast.LENGTH_SHORT).show()
}
}
@SuppressLint("SetTextI18n")
private fun playLottie() {
binding.lottie.imageAssetsFolder = "app_manager/images/"
binding.lottie.setAnimation("app_manager/data.json")
binding.lottie.playAnimation()
}
@SuppressLint("SetTextI18n")
fun jumpJob() = lifecycleScope.launch(Dispatchers.Main) {
delay(Random.nextLong(4000, 6000))
binding.lottie.visibility = View.GONE
binding.lottieCompleted.visibility = View.VISIBLE
binding.lottieCompleted.playAnimation()
binding.tv.text = "Completed!"
delay(1000)
AdmobMaxHelper.admobMaxShowInterstitialAd(this@AppManagerAnimationActivity) {
startActivity(Intent(this@AppManagerAnimationActivity, AppManagerActivity::class.java))
finish()
}
}
override fun onResume() {
super.onResume()
if (job?.isActive == false || job == null) {
job = jumpJob()
}
}
override fun onPause() {
super.onPause()
job?.cancel()
job = null
}
}
\ No newline at end of file
package com.base.filerecoveryrecyclebin.activity.appprocess
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
import android.graphics.Color
import android.net.Uri
import android.provider.Settings
import android.view.View
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope
import com.base.filerecoveryrecyclebin.adapter.AppManagerAdapter
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.showBackInterAdSp
import com.base.filerecoveryrecyclebin.bean.AppBean
import com.base.filerecoveryrecyclebin.databinding.ActivityAppProcessBinding
import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatSize
import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.utils.RamUtils.ramPair
import com.base.filerecoveryrecyclebin.view.DialogViews.showAppProcessExitDialog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class AppProcessActivity : BaseActivity<ActivityAppProcessBinding>() {
override val binding: ActivityAppProcessBinding by lazy {
ActivityAppProcessBinding.inflate(layoutInflater)
}
private lateinit var adapter: AppManagerAdapter
private var ePercent = 0
@SuppressLint("SetTextI18n")
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
val ramPair = ramPair()
val percent = ((ramPair.first.toFloat() / ramPair.second.toFloat()) * 100).toInt()
ePercent = percent
binding.tvPercent.text = percent.toString()
binding.pbRam.progress = percent
binding.tvSize.text = "${ramPair.first.toFormatSize()}/${ramPair.second.toFormatSize()}"
adapter = AppManagerAdapter { pkg ->
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri = Uri.fromParts("package", pkg, null) // 替换为需要跳转的应用包名
intent.setData(uri)
startActivity(intent)
}
binding.rv.adapter = adapter
initData()
}
override fun initListener() {
super.initListener()
onBackPressedDispatcher.addCallback {
showAppProcessExitDialog(ePercent) {
if (showBackInterAdSp()) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@AppProcessActivity, false) {
finishToMain()
}
} else {
finishToMain()
}
}
}
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
}
@SuppressLint("QueryPermissionsNeeded")
private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
val pm = packageManager
val packages = pm.getInstalledPackages(0)
val list = arrayListOf<AppBean>()
packages.forEach { app ->
if (isLaunchApp(this@AppProcessActivity, app)) {
val appBean = AppBean(
app.applicationInfo.loadIcon(pm),
app.applicationInfo.loadLabel(pm).toString(),
app.applicationInfo.packageName
)
list.add(appBean)
}
}
launch(Dispatchers.Main) {
binding.pbLoading.visibility = View.GONE
adapter.setData(list)
}
}
private fun isLaunchApp(context: Context, app: PackageInfo, filterSystem: Boolean = true): Boolean {
val flagSystem = (app.applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) < 1
val flag = if (filterSystem) flagSystem else true
return flag && app.applicationInfo.packageName != context.packageName
}
}
\ No newline at end of file
package com.base.filerecoveryrecyclebin.activity.appprocess
import android.annotation.SuppressLint
import android.content.Intent
import android.view.View
import android.widget.Toast
import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.databinding.ActivityAppProcessAnimationBinding
import com.base.filerecoveryrecyclebin.help.BaseActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlin.random.Random
class AppProcessAnimationActivity : BaseActivity<ActivityAppProcessAnimationBinding>() {
override val binding: ActivityAppProcessAnimationBinding by lazy {
ActivityAppProcessAnimationBinding.inflate(layoutInflater)
}
private var job: Job? = null
override fun initView() {
playLottie()
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative)
}
override fun initListener() {
onBackPressedDispatcher.addCallback {
Toast.makeText(this@AppProcessAnimationActivity, "wait a moment", Toast.LENGTH_SHORT).show()
}
}
@SuppressLint("SetTextI18n")
private fun playLottie() {
binding.lottie.imageAssetsFolder = "app_manager/images/"
binding.lottie.setAnimation("app_manager/data.json")
binding.lottie.playAnimation()
}
@SuppressLint("SetTextI18n")
fun jumpJob() = lifecycleScope.launch(Dispatchers.Main) {
delay(Random.nextLong(4000, 6000))
binding.lottie.visibility = View.GONE
binding.lottieCompleted.visibility = View.VISIBLE
binding.lottieCompleted.playAnimation()
binding.tv.text = "Completed!"
delay(1000)
AdmobMaxHelper.admobMaxShowInterstitialAd(this@AppProcessAnimationActivity) {
startActivity(Intent(this@AppProcessAnimationActivity, AppProcessActivity::class.java))
finish()
}
}
override fun onResume() {
super.onResume()
if (job?.isActive == false || job == null) {
job = jumpJob()
}
}
override fun onPause() {
super.onPause()
job?.cancel()
job = null
}
}
\ No newline at end of file
......@@ -2,35 +2,35 @@ package com.base.filerecoveryrecyclebin.activity.guide
import android.content.Intent
import android.graphics.Color
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.databinding.ActivityGuideBinding
import com.base.filerecoveryrecyclebin.fragment.GuideFragment
import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.help.PermissionHelp.requestStorePermission
import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.zhpan.indicator.enums.IndicatorSlideMode
import com.zhpan.indicator.enums.IndicatorStyle
class GuideActivity : BaseActivity<ActivityGuideBinding>() {
private val page1: GuideFragment by lazy {
GuideFragment().apply { page = 1 }
GuideFragment().apply { page = 0 }
}
private val page2: GuideFragment by lazy {
GuideFragment().apply { page = 2 }
GuideFragment().apply { page = 1 }
}
private val pageNative: NativeFullFragment by lazy {
NativeFullFragment()
}
private val page3: GuideFragment by lazy {
GuideFragment().apply { page = 3 }
}
private val fragments by lazy {
mutableListOf(page1, page2, page3)
mutableListOf(page1, page2, pageNative, page3)
}
private var currentIndex = 0
override val binding: ActivityGuideBinding by lazy {
ActivityGuideBinding.inflate(layoutInflater)
......@@ -44,7 +44,7 @@ class GuideActivity : BaseActivity<ActivityGuideBinding>() {
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.idFlNative)
binding.viewpager2.run {
adapter = object : FragmentStateAdapter(this@GuideActivity) {
override fun getItemCount(): Int {
......@@ -59,25 +59,27 @@ class GuideActivity : BaseActivity<ActivityGuideBinding>() {
binding.viewpager2.registerOnPageChangeCallback(object :
ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
currentIndex = position
}
})
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 lauchPermisson() {
startActivity(Intent(this, CleanGuideActivity::class.java))
finish()
requestStorePermission(launcher) {
fun next(page: Int) {
if (page == 0) {
binding.viewpager2.currentItem = 1
return
}
if (page == 1) {
binding.viewpager2.currentItem = 2
return
}
if (page == 3) {
startActivity(Intent(this, CleanGuideActivity::class.java))
finish()
}
}
}
\ No newline at end of file
......@@ -5,17 +5,12 @@ import android.content.Intent
import android.util.Log
import com.base.filerecoveryrecyclebin.activity.MainActivity
import com.base.filerecoveryrecyclebin.activity.XzLoadingActivity
import com.base.filerecoveryrecyclebin.activity.appmanager.AppManagerAnimationActivity
import com.base.filerecoveryrecyclebin.activity.appprocess.AppProcessAnimationActivity
import com.base.filerecoveryrecyclebin.activity.battery.BatteryInfoAnimationActivity
import com.base.filerecoveryrecyclebin.activity.guide.GuideActivity
import com.base.filerecoveryrecyclebin.activity.guide.WhichWantGuideActivity
import com.base.filerecoveryrecyclebin.activity.junkclean.ScanJunkActivity
import com.base.filerecoveryrecyclebin.activity.photomanager.PhotoManagerAnimationActivity
import com.base.filerecoveryrecyclebin.activity.recovery.FileScanResultActivity
import com.base.filerecoveryrecyclebin.activity.whatsapp.WhatsAppCleanerAnimationActivity
import com.base.filerecoveryrecyclebin.bean.ConstObject
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_APP_MANAGER
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_APP_PROCESS
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_BATTERY_INFO
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_JUNK_CLEAN_PUSH
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_DOCUMENTS
......@@ -23,7 +18,6 @@ import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_PHOTOS
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_VIDEOS
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_SCREENSHOT_CLEAN
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_SIMILAR_IMAGE
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_WHATSAPP
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_WHEATHER
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_XINGZUO
import com.base.filerecoveryrecyclebin.bean.ConstObject.isGuide
......@@ -50,37 +44,21 @@ object StartUtils {
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 -> {
context.startActivity(Intent(context, WhatsAppCleanerAnimationActivity::class.java))
}
ID_APP_PROCESS->{
context.startActivity(Intent(context, AppProcessAnimationActivity::class.java))
}
ID_APP_MANAGER->{
context.startActivity(Intent(context, AppManagerAnimationActivity::class.java))
}
ID_BATTERY_INFO -> {
context.startActivity(Intent(context, BatteryInfoAnimationActivity::class.java))
}
......@@ -98,7 +76,8 @@ object StartUtils {
val isHotLaunch = context.intent?.extras?.getBoolean("isHotLaunch", false) ?: false
if (!isHotLaunch) {
if (!isGuide) {
context.startActivity(Intent(context, GuideActivity::class.java))
// context.startActivity(Intent(context, GuideActivity::class.java))
context.startActivity(Intent(context, WhichWantGuideActivity::class.java))
isGuide = true
} else {
context.startActivity(Intent(context, MainActivity::class.java))
......
package com.base.filerecoveryrecyclebin.activity.whatsapp
import android.content.Intent
import android.graphics.Color
import android.os.Environment
import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.ResultActivity
import com.base.filerecoveryrecyclebin.adapter.WhatsAppCleanerAdapter
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.bean.ConstObject.WHATSAPP_CLEANER
import com.base.filerecoveryrecyclebin.bean.WhatsAppCleanerBean
import com.base.filerecoveryrecyclebin.databinding.ActivityWhatsAppCleanerBinding
import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.help.FileHelp.getDirFiles
import com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatSize
import com.base.filerecoveryrecyclebin.help.PermissionHelp.checkStorePermission
import com.base.filerecoveryrecyclebin.help.PermissionHelp.requestStorePermission
import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.utils.FileHexEx.isImage
import com.base.filerecoveryrecyclebin.utils.FileHexEx.isVideo
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.base.filerecoveryrecyclebin.view.DialogViews.showExitFunctionDialog
import com.base.filerecoveryrecyclebin.view.DialogViews.showGerPermission
import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class WhatsAppCleanerActivity : BaseActivity<ActivityWhatsAppCleanerBinding>() {
private val TAG = "WhatsAppCleanerActivity"
private lateinit var adapter: WhatsAppCleanerAdapter
private val whatsAppMediaDir = "${Environment.getExternalStorageDirectory()}/Android/media/com.whatsapp/WhatsApp/Media/"
override val binding: ActivityWhatsAppCleanerBinding by lazy {
ActivityWhatsAppCleanerBinding.inflate(layoutInflater)
}
override fun initView() {
setupStatusBar()
setupAdapter()
checkAndRequestPermissions()
showNativeAd()
}
private fun setupStatusBar() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
}
private fun setupAdapter() {
adapter = WhatsAppCleanerAdapter { item ->
navigateToWhatsAppMessageCleanActivity(item)
}
binding.rv.adapter = adapter
}
private fun checkAndRequestPermissions() {
if (checkStorePermission()) {
initData()
} else {
requestStoragePermissionWithDialog()
}
}
private fun requestStoragePermissionWithDialog() {
showGerPermission(
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.",
deny = {
finishToMain()
},
allow = {
requestStorePermission(
launcher,
result = { flag ->
if (flag) {
initData()
} else {
finishToMain()
}
}
)
})
}
private fun navigateToWhatsAppMessageCleanActivity(item: WhatsAppCleanerBean) {
val intent = Intent(this, WhatsAppMessageCleanActivity::class.java).apply {
putExtra("PathList", Gson().toJson(item.subFile.toTypedArray()))
putExtra("Tittle", item.tittle)
}
startActivity(intent)
}
private fun showNativeAd() {
AdmobMaxHelper.admobMaxShowNativeAd(this, binding.flAd, 0)
}
override fun initListener() {
setupBackButton()
binding.tvGotIt.setOnClickListener {
startActivity(Intent(this, ResultActivity::class.java).apply {
putExtra("from", WHATSAPP_CLEANER)
})
finish()
}
}
private fun setupBackButton() {
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
showInterstitialAdAndFinish()
}
}
private fun showInterstitialAdAndFinish() {
showExitFunctionDialog(this) { showAd ->
if (showAd) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this, false) {
finishToMain()
}
} else {
finishToMain()
}
}
}
private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
val list = arrayListOf<WhatsAppCleanerBean>()
list.add(WhatsAppCleanerBean(R.mipmap.videomessages, "Video Messages"))
list.add(WhatsAppCleanerBean(R.mipmap.imagemessages, "Image Messages"))
list.add(WhatsAppCleanerBean(R.mipmap.audiomessages, "Audio Messages"))
var totalSize = 0L
File(whatsAppMediaDir).listFiles()?.forEach { file ->
if (file.name == "WhatsApp Video") {
LogEx.logDebug(TAG, "whatsapp file=${file.absolutePath}")
val bean = list.find { it.tittle == "Video Messages" }
val subFile = getDirFiles(file).filter { isVideo(it) }
val size = subFile.sumOf { it.length() }
bean?.size = size
totalSize += size
bean?.subFile = subFile.map { it.absolutePath }
// subFile.forEach { path ->
// LogEx.logDebug(TAG, "path=$path")
// }
}
if (file.name == "WhatsApp Images") {
val bean = list.find { it.tittle == "Image Messages" }
val subFile = getDirFiles(file).filter { isImage(it) }
val size = subFile.sumOf { it.length() }
bean?.size = size
totalSize += size
bean?.subFile = subFile.map { it.absolutePath }
}
if (file.name == "WhatsApp Audio") {
val bean = list.find { it.tittle == "Audio Messages" }
val subFile = getDirFiles(file).filter { it.name.contains(".mp3") }
val size = subFile.sumOf { it.length() }
bean?.size = size
totalSize += size
bean?.subFile = subFile.map { it.absolutePath }
}
}
launch(Dispatchers.Main) {
adapter.setData(list)
updateTotalSizeUI(list)
}
}
private fun updateTotalSizeUI(list: List<WhatsAppCleanerBean>) {
val totalSize = list.sumOf { it.size }
val formattedSize = totalSize.toFormatSize()
binding.tvSize.text = formattedSize.split(" ")[0]
binding.tvUnit.text = formattedSize.split(" ")[1]
}
}
\ No newline at end of file
package com.base.filerecoveryrecyclebin.activity.whatsapp
import android.annotation.SuppressLint
import android.content.Intent
import android.view.View
import android.widget.Toast
import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.databinding.ActivityWhatsAppCleanerAnimationBinding
import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.utils.LogEx
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class WhatsAppCleanerAnimationActivity : BaseActivity<ActivityWhatsAppCleanerAnimationBinding>() {
private val TAG = "WhatsAppCleanerAnimationActivity"
override val binding: ActivityWhatsAppCleanerAnimationBinding by lazy {
ActivityWhatsAppCleanerAnimationBinding.inflate(layoutInflater)
}
private var job: Job? = null
override fun initView() {
playLottie()
AdmobMaxHelper.admobMaxShowNativeAd(this,binding.idFlNative)
}
override fun initListener() {
onBackPressedDispatcher.addCallback {
Toast.makeText(this@WhatsAppCleanerAnimationActivity, "wait a moment", Toast.LENGTH_SHORT).show()
}
}
@SuppressLint("SetTextI18n")
private fun playLottie() {
binding.lottie.imageAssetsFolder = "whupscan/images/"
binding.lottie.setAnimation("whupscan/data.json")
binding.lottie.playAnimation()
}
@SuppressLint("SetTextI18n")
fun jumpJob() = lifecycleScope.launch(Dispatchers.Main) {
delay(5000)
LogEx.logDebug(TAG, "delay over")
binding.lottie.cancelAnimation()
binding.lottie.visibility = View.GONE
binding.lottieCompleted.visibility = View.VISIBLE
binding.lottieCompleted.playAnimation()
binding.tv.text = "Completed!"
delay(1000)
AdmobMaxHelper.admobMaxShowInterstitialAd(this@WhatsAppCleanerAnimationActivity) {
startActivity(Intent(this@WhatsAppCleanerAnimationActivity, WhatsAppCleanerActivity::class.java))
finish()
}
}
override fun onResume() {
super.onResume()
LogEx.logDebug(TAG, "onResume")
if (job?.isActive == false || job == null) {
job = jumpJob()
}
}
override fun onPause() {
super.onPause()
LogEx.logDebug(TAG, "onPause")
job?.cancel()
job = null
}
}
\ No newline at end of file
package com.base.filerecoveryrecyclebin.activity.whatsapp
import android.content.Intent
import android.graphics.Color
import androidx.activity.addCallback
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.base.filerecoveryrecyclebin.activity.ResultActivity
import com.base.filerecoveryrecyclebin.adapter.WhatsAppMediaAdapter
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import com.base.filerecoveryrecyclebin.bean.ConstObject
import com.base.filerecoveryrecyclebin.bean.MediaBean
import com.base.filerecoveryrecyclebin.databinding.ActivityWhatsAppMessageCleanBinding
import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatSize
import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.view.DialogViews.showExitFunctionDialog
import com.google.gson.Gson
import java.io.File
class WhatsAppMessageCleanActivity : BaseActivity<ActivityWhatsAppMessageCleanBinding>() {
private val pathList by lazy {
val json = intent.extras?.getString("PathList")
val list = Gson().fromJson(json, Array<String>::class.java)
list.map { MediaBean(it) }
}
private lateinit var adapter: WhatsAppMediaAdapter
override val binding: ActivityWhatsAppMessageCleanBinding by lazy {
ActivityWhatsAppMessageCleanBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
val tittle = intent.extras?.getString("Tittle") ?: ""
binding.tvTitle.text = tittle
var isList = false
when (tittle) {
"Audio Messages" -> {
binding.rv.layoutManager = LinearLayoutManager(this)
isList = true
}
else -> {
binding.rv.layoutManager = GridLayoutManager(this, 3)
}
}
adapter = WhatsAppMediaAdapter(isList) {
binding.llSelectAll.isSelected = it
binding.tvClean.isEnabled = adapter.getSelectData().isNotEmpty()
val split = adapter.getSelectDataSize().toFormatSize().split(" ")
binding.tvSize.text = split[0]
binding.tvUnit.text = split[1]
}
binding.rv.adapter = adapter
adapter.setData(pathList)
}
override fun initListener() {
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
showExitFunctionDialog(this@WhatsAppMessageCleanActivity) { showAd ->
if (showAd) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@WhatsAppMessageCleanActivity, isLoading = false) {
finishToMain()
}
} else {
finishToMain()
}
}
}
binding.llSelectAll.setOnClickListener {
it.isSelected = !it.isSelected
adapter.toggleSelect(it.isSelected)
binding.tvClean.isEnabled = it.isSelected
val split = adapter.getSelectDataSize().toFormatSize().split(" ")
binding.tvSize.text = split[0]
binding.tvUnit.text = split[1]
}
binding.tvClean.setOnClickListener {
AdmobInterstitialUtils.showInterstitialAd(this) {
val list = adapter.getSelectData()
runCatching {
list.forEach { File(it).delete() }
}
startActivity(Intent(this@WhatsAppMessageCleanActivity, ResultActivity::class.java).apply {
putExtra("from", ConstObject.WHATSAPP_CLEANER)
})
finish()
}
}
}
}
\ No newline at end of file
package com.base.filerecoveryrecyclebin.ads
//object AdmobCommonUtils {
//
// private var lastAd: Any? = null
// private var maxMultiClick = AppPreferences.getInstance().getString("maxMultiClick", "10").toInt()
// private var multiClick = 0
// fun isMultiClick(currentAd: Any?) {
// if (currentAd == null) {
// return
// }
// if (lastAd == currentAd) {
// multiClick++
// if (multiClick >= maxMultiClick) {
// AdDisplayUtils.getInstance()
// .setAdClickCount(AdDisplayUtils.getInstance().maxAdClickCount)
// ActivityManagerUtils.getInstance().finishAllActivity()
// return
// }
// } else {
// multiClick = 0
// }
//
// lastAd = currentAd
//
// }
//}
\ No newline at end of file
......@@ -7,6 +7,10 @@ import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import com.base.filerecoveryrecyclebin.ads.admob.AdmobOpenUtils
import com.base.filerecoveryrecyclebin.ads.max.AdMaxInit.initAdMax
import com.base.filerecoveryrecyclebin.ads.max.AdMaxInterstitialUtils
import com.base.filerecoveryrecyclebin.ads.max.AdMaxNativeUtils
import com.base.filerecoveryrecyclebin.ads.max.AdMaxOpenUtils
import com.base.filerecoveryrecyclebin.help.BaseApplication
import com.base.filerecoveryrecyclebin.utils.AppPreferences
import com.base.filerecoveryrecyclebin.utils.EventUtils
......@@ -19,15 +23,21 @@ object AdmobMaxHelper {
var isAdInit = AtomicBoolean(false)
var isBlack: Boolean = false
fun haveSpAdmobTrueMaxFalse(): Boolean {
return AppPreferences.getInstance().getString("admobTrueMaxFalse", "-1").toInt() != -1
}
private fun getSpAdmobTrueMaxFalse(): Boolean {
fun getSpAdmobTrueMaxFalse(): Boolean {
val ss = AppPreferences.getInstance().getString("admobTrueMaxFalse", "1").toInt()
return ss == 1
}
fun showExitNativeSp(): Boolean {
val isShowExitNative = AppPreferences.getInstance().getString("isShowExitNative", "0").toInt()
return isShowExitNative == 1
}
fun showGuideNativeSp(): Boolean {
val isShowGuideNative = AppPreferences.getInstance().getString("isShowGuideNative", "0").toInt()
return isShowGuideNative == 1
}
fun showBackInterAdSp(): Boolean {
val isShowBackIntAd = AppPreferences.getInstance().getString("isShowBackIntAd", "0").toInt()
//1要看插屏 0不看
......@@ -46,7 +56,7 @@ object AdmobMaxHelper {
if (isBlack) {
return
}
if (true) {
if (getSpAdmobTrueMaxFalse()) {
if (!isAdInit.get()) {
LogEx.logDebug(TAG, "init sp Admob")
MobileAds.initialize(BaseApplication.context) { initializationStatus ->
......@@ -54,21 +64,20 @@ object AdmobMaxHelper {
}
}
} else {
// if (!isAdInit.get()) {
// LogEx.logDebug(TAG, "init sp AdMax")
// BaseApplication.context.initAdMax()
// }
if (!isAdInit.get()) {
LogEx.logDebug(TAG, "init sp AdMax")
BaseApplication.context.initAdMax()
}
}
}
//End end
fun isOpenAdLoaded(): Boolean {
// if (getSpAdmobTrueMaxFalse()) {
//
// } else {
// AdMaxOpenUtils.isOpenAdLoaded()
// }
return AdmobOpenUtils.isOpenAdLoaded()
if (getSpAdmobTrueMaxFalse()) {
return AdmobOpenUtils.isOpenAdLoaded()
} else {
return AdMaxOpenUtils.isOpenAdLoaded()
}
}
//展示广告关闭时赋值
......@@ -96,14 +105,14 @@ object AdmobMaxHelper {
return
}
if (true) {
if (getSpAdmobTrueMaxFalse()) {
AdmobInterstitialUtils.showInterstitialAd(activity) {
onHidden?.invoke()
}
} else {
// AdMaxInterstitialUtils.showInterstitialAd(activity) {
// onHidden?.invoke()
// }
AdMaxInterstitialUtils.showInterstitialAd(activity) {
onHidden?.invoke()
}
}
}
......@@ -116,47 +125,40 @@ object AdmobMaxHelper {
onHidden?.invoke()
return
}
if (true) {
if (getSpAdmobTrueMaxFalse()) {
AdmobOpenUtils.showAppOpenAd(activity, showBefore = showBeforeAction) {
onHidden?.invoke()
}
} else {
// AdMaxOpenUtils.showAppOpenAd(activity, loadCallBack = showBeforeAction) {
// onHidden?.invoke()
// }
AdMaxOpenUtils.showAppOpenAd(activity, showBefore = showBeforeAction, loadCallBack = showBeforeAction) {
onHidden?.invoke()
}
}
}
fun admobMaxShowNativeAd(activity: Activity, parent: ViewGroup, where: Int = 0) {
fun admobMaxShowNativeAd(activity: Activity, parent: ViewGroup, where: Int = -1) {
if (isBlack) {
return
}
val isShowResultNaAd =
AppPreferences.getInstance().getString("isShowResultNaAd", "0").toInt()
Log.e("MXL", "admobMaxShowNativeAd: $isShowResultNaAd")
if (isShowResultNaAd == 0)
return
var layout = R.layout.layout_native_custom
when (where) {
0 -> layout = R.layout.layout_native_custom
1 -> layout = R.layout.layout_nativie_custom2
if (getSpAdmobTrueMaxFalse()) {
val layout = when (where) {
0 -> R.layout.layout_native_custom
1 -> R.layout.layout_nativie_custom2
3 -> R.layout.layout_native_full
else -> R.layout.layout_native_custom
}
AdmobNativeUtils.showNativeAd(activity, parent, layout)
} else {
val layout = when (where) {
0 -> R.layout.layout_max_native_small_f8f8f8
1 -> R.layout.layout_max_native_big
2 -> R.layout.layout_max_native_big_2
3 -> R.layout.layout_max_native_full
else -> R.layout.layout_max_native_small_f8f8f8
}
AdMaxNativeUtils.showNativeAd(activity, parent, layout)
}
AdmobNativeUtils.showNativeAd(activity, parent, layout)
// if (true) {
// 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 preloadAd(activity: Activity) {
......@@ -164,19 +166,18 @@ object AdmobMaxHelper {
return
}
if (true) {
if (getSpAdmobTrueMaxFalse()) {
// AdmobOpenUtils.loadAppOpenAd()
AdmobInterstitialUtils.loadInterstitialAd(activity)
} else {
if (isAdInit.get()) {
// AdMaxOpenUtils.loadAppOpenAd(activity)
// AdMaxInterstitialUtils.loadInterstitialAd(activity)
AdMaxOpenUtils.loadAppOpenAd(activity)
AdMaxInterstitialUtils.loadInterstitialAd(activity)
} else {
// AdMaxInit.maxInitAction = {
Log.d(TAG, "max init suc")
// AdMaxOpenUtils.loadAppOpenAd(activity)
// AdMaxInterstitialUtils.loadInterstitialAd(activity)
// }
AdMaxOpenUtils.loadAppOpenAd(activity)
AdMaxInterstitialUtils.loadInterstitialAd(activity)
}
}
}
......
......@@ -9,6 +9,7 @@ import android.view.ViewTreeObserver
import androidx.core.view.children
import com.base.filerecoveryrecyclebin.BuildConfig
import com.base.filerecoveryrecyclebin.GlobalConfig
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.utils.AppPreferences
import com.base.filerecoveryrecyclebin.utils.LogEx
......@@ -26,6 +27,9 @@ object AdmobBannerUtils {
private var listener: ViewTreeObserver.OnGlobalLayoutListener? = null
fun showCollapsibleBannerAd(context: Context, parent: ViewGroup) {
if (!AdmobMaxHelper.getSpAdmobTrueMaxFalse()) return
val isShowBanner = AppPreferences.getInstance().getString("isShowBanner", "0").toInt()
if (isShowBanner == 0) {
return
......
//package com.base.filerecoveryrecyclebin.ads.max
//
//import android.os.Bundle
//import com.applovin.mediation.MaxAd
//import com.applovin.mediation.MaxAdRevenueListener
//import com.applovin.sdk.AppLovinSdk
//import com.base.filerecoveryrecyclebin.help.BaseApplication
//import com.base.filerecoveryrecyclebin.utils.EventUtils
//import com.base.filerecoveryrecyclebin.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)
// if (error == null) {
// obj.put("status", "1")
// } else {
// 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)
// 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 != "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) {
// 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)
// EventUtils.event("ad_price", ext = obj)
// }
//
// }
//}
\ No newline at end of file
package com.base.filerecoveryrecyclebin.ads.max
import android.os.Bundle
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdRevenueListener
import com.applovin.sdk.AppLovinSdk
import com.base.filerecoveryrecyclebin.help.BaseApplication
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.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)
if (error == null) {
obj.put("status", "1")
} else {
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)
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 != "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) {
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)
EventUtils.event("ad_price", ext = obj)
}
}
}
\ No newline at end of file
//package com.base.filerecoveryrecyclebin.ads.max
//
//import android.content.Context
//import com.applovin.sdk.AppLovinMediationProvider
//import com.applovin.sdk.AppLovinSdk
//import com.applovin.sdk.AppLovinSdkInitializationConfiguration
//import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.isAdInit
//import com.base.filerecoveryrecyclebin.utils.EventUtils
//import com.base.filerecoveryrecyclebin.utils.LogEx
//import java.util.concurrent.Executors
//
//object AdMaxInit {
//
// private val TAG = "AdMaxInit"
// var maxInitAction: (() -> Unit)? = null
//
// fun Context.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.
//// 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.filerecoveryrecyclebin.ads.max
import android.content.Context
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkInitializationConfiguration
import com.base.filerecoveryrecyclebin.BuildConfig
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.isAdInit
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.google.android.gms.ads.identifier.AdvertisingIdClient
import java.util.Collections
import java.util.concurrent.Executors
object AdMaxInit {
private val TAG = "AdMaxInit"
var maxInitAction: (() -> Unit)? = null
fun Context.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.
if (BuildConfig.DEBUG) {
kotlin.runCatching {
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.filerecoveryrecyclebin.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.filerecoveryrecyclebin.MyApplication.Companion.isInterOpenShowing
//import com.base.filerecoveryrecyclebin.R
//import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
//import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.isAdInit
//import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.lastShowedOnHiddenTime
//import com.base.filerecoveryrecyclebin.help.ConfigHelper
//import com.base.filerecoveryrecyclebin.utils.EventUtils
//import com.base.filerecoveryrecyclebin.utils.LogEx
//import com.base.filerecoveryrecyclebin.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")
// 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 (isAdExpired()) {
// val obj2 = JSONObject()
// obj2.put("ad_unit", "interAd")
// EventUtils.event("ad_expire", ext = obj2)
// onHidden?.invoke()
// loadInterstitialAd(activity)
// return
// }
//
//
// if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
// 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
// }
//
// 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
// }
//
//
//}
\ No newline at end of file
package com.base.filerecoveryrecyclebin.ads.max
import android.animation.ObjectAnimator
import android.app.Activity
import android.app.Dialog
import android.os.Handler
import android.os.Looper
import android.view.View
import android.view.Window
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxInterstitialAd
import com.base.filerecoveryrecyclebin.GlobalConfig
import com.base.filerecoveryrecyclebin.MyApplication.Companion.isInterOpenShowing
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.lastShowedOnHiddenTime
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.base.filerecoveryrecyclebin.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(GlobalConfig.ID_MAX_INTER, 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")
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 (isAdExpired()) {
val obj2 = JSONObject()
obj2.put("ad_unit", "interAd")
EventUtils.event("ad_expire", ext = obj2)
onHidden?.invoke()
loadInterstitialAd(activity)
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
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
showLoadingScreen(activity) {
startCountdownAndShowAd {
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)
showLoadingScreen(activity) {}
if (loaded) {
LogEx.logDebug(TAG, "loaded=true")
loadingListener = {
LogEx.logDebug(TAG, "loadingListener")
if (interstitialAd?.isReady == true) {
this.onHidden = onHidden
startCountdownAndShowAd {
loadingDialog?.dismiss()
interstitialAd?.showAd(activity)
}
} else {
loadingDialog?.dismiss()
onHidden?.invoke()
}
}
} else {
loadingDialog?.dismiss()
LogEx.logDebug(TAG, "loaded=false")
onHidden?.invoke()
}
}
}
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
}
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
}
private fun showLoadingScreen(activity: Activity, callBack: (() -> Unit)) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (loadingDialog == null) {
loadingDialog = Dialog(activity).apply {
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.dialog_loading)
setCancelable(false)
window?.setBackgroundDrawable(ContextCompat.getDrawable(activity, R.drawable.bg_loadingads))
}
}
val imageView = loadingDialog?.findViewById<ImageView>(R.id.loading_image)
val countdownTextView = loadingDialog?.findViewById<TextView>(R.id.countdown_text)
imageView?.let { startRotateAnimation(it) } // 开始旋转动画
// 控制倒计时文本是否显示
countdownTextView?.visibility = View.VISIBLE
loadingDialog?.show()
callBack.invoke()
}
private fun startRotateAnimation(imageView: ImageView) {
ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f).apply {
duration = 3000 // 持续 3 秒
repeatCount = ObjectAnimator.INFINITE // 无限循环
start()
}
}
private var countdown = 3 // 初始倒计时
private var countdownHandler: Handler? = null
private var loadingDialog: Dialog? = null
private fun startCountdownAndShowAd(callBack: (() -> Unit)?) {
countdown = 3
updateCountdownText(count = countdown) // 显示倒计时文本
countdownHandler?.removeCallbacksAndMessages(null)
countdownHandler = Handler(Looper.getMainLooper())
countdownHandler?.post(object : Runnable {
override fun run() {
if (countdown <= 0) {
loadingDialog?.dismiss()
loadingDialog = null
callBack?.invoke()
} else {
updateCountdownText(countdown) // 更新倒计时文本
countdown--
countdownHandler?.postDelayed(this, 1000)
}
}
})
}
// 更新倒计时文本并控制是否显示括号和数字
private fun updateCountdownText(count: Int) {
val countdownTextView = loadingDialog?.findViewById<TextView>(R.id.countdown_text)
// LogEx.logDebug(AdmobOpenUtils.TAG, "updateCountdownText $count countdownTextView=$countdownTextView")
countdownTextView?.text = "Ads are about to be shown($count)"
countdownTextView?.visibility = View.VISIBLE
}
}
//package com.base.filerecoveryrecyclebin.ads.max
//
//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.filerecoveryrecyclebin.R
//import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
//import com.base.filerecoveryrecyclebin.help.BaseApplication
//import com.base.filerecoveryrecyclebin.help.ConfigHelper
//import com.base.filerecoveryrecyclebin.utils.EventUtils
//import com.base.filerecoveryrecyclebin.utils.LogEx
//import 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()
// loadingListener = null
// }
//
// override fun onNativeAdLoadFailed(p0: String, p1: MaxError) {
// super.onNativeAdLoadFailed(p0, p1)
// loadingListener?.invoke()
// loadingListener = null
// LogEx.logDebug(TAG, "onNativeAdLoadFailed")
// LogEx.logDebug(TAG, "code=${p1.code}")
// LogEx.logDebug(TAG, "message=${p1.message}")
//// AdDisplayUtils.getInstance().incrementAdRequestFailCount()
// 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")
//// AdDisplayUtils.getInstance().incrementAdClickCount()
// 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)
package com.base.filerecoveryrecyclebin.ads.max
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.filerecoveryrecyclebin.BuildConfig
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.help.BaseApplication
import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
import 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()
loadingListener = null
}
override fun onNativeAdLoadFailed(p0: String, p1: MaxError) {
super.onNativeAdLoadFailed(p0, p1)
loadingListener?.invoke()
loadingListener = null
LogEx.logDebug(TAG, "onNativeAdLoadFailed")
LogEx.logDebug(TAG, "code=${p1.code}")
LogEx.logDebug(TAG, "message=${p1.message}")
// AdDisplayUtils.getInstance().incrementAdRequestFailCount()
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")
// AdDisplayUtils.getInstance().incrementAdClickCount()
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)
// }
//
// fun loadNativeAd() {
// setNativeAdListener()
// if (!AdDisplayUtils.getInstance().shouldShowAd("nativeAd")) {
// return
// }
// nativeAdLoader.loadAd()
// }
//
//
// fun showNativeAd(activity: Activity, parent: ViewGroup, layout: Int) {
// activityString = activity::class.java.toString().split(".").last()
// LogEx.logDebug(TAG, "activityString=$activityString")
// setNativeAdListener()
//
// if (!AdDisplayUtils.getInstance().shouldShowAd("nativeAd")) {
// LogEx.logDebug(TAG, "!shouldShowAd")
// return
// }
//
// if (nativeAd?.nativeAd?.isExpired == true || nativeAd == null) {
// LogEx.logDebug(TAG, "nativeAd?.nativeAd?.isExpired == true")
// nativeAdLoader.destroy(nativeAd)
// nativeAdLoader.loadAd()
// loadingListener = {
// if (nativeAd != null) {
// showReadyNative(activity, parent, layout)
// }
// }
// } else {
// showReadyNative(activity, parent, layout)
// }
//
// }
//
// private fun showReadyNative(activity: Activity, parent: ViewGroup, layout: Int) {
// val adView = createNativeAdView(activity, layout)
//
// LogEx.logDebug(TAG, "showReadNative adUnitId=${nativeAd?.adUnitId}")
// parent.isVisible = true
// parent.removeAllViews()
// nativeAdLoader.render(adView, nativeAd)
// parent.addView(adView)
// nativeAd?.let { AdMaxEvent.showAd(it, "nativeAd", activityString) }
//// AdDisplayUtils.getInstance().incrementAdDisplayCount()
//
// LogEx.logDebug(TAG, "loadingListener finish")
// }
//
//}
\ No newline at end of file
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 loadNativeAd() {
setNativeAdListener()
if (!AdDisplayUtils.getInstance().shouldShowAd("nativeAd")) {
return
}
nativeAdLoader.loadAd()
}
fun showNativeAd(activity: Activity, parent: ViewGroup, layout: Int) {
activityString = activity::class.java.toString().split(".").last()
LogEx.logDebug(TAG, "activityString=$activityString")
setNativeAdListener()
if (!BuildConfig.DEBUG) {
if (!AdDisplayUtils.getInstance().shouldShowAd("nativeAd")) {
LogEx.logDebug(TAG, "!shouldShowAd")
return
}
}
if (nativeAd?.nativeAd?.isExpired == true || nativeAd == null) {
LogEx.logDebug(TAG, "nativeAd?.nativeAd?.isExpired == true")
nativeAdLoader.destroy(nativeAd)
nativeAdLoader.loadAd()
loadingListener = {
LogEx.logDebug(TAG, "loadingListener nativeAd==$nativeAd")
if (nativeAd != null) {
showReadyNative(activity, parent, layout)
}
}
} else {
showReadyNative(activity, parent, layout)
}
}
private fun showReadyNative(activity: Activity, parent: ViewGroup, layout: Int) {
val adView = createNativeAdView(activity, layout)
LogEx.logDebug(TAG, "showReadNative adUnitId=${nativeAd?.adUnitId}")
parent.isVisible = true
parent.removeAllViews()
nativeAdLoader.render(adView, nativeAd)
parent.addView(adView)
nativeAd?.let { AdMaxEvent.showAd(it, "nativeAd", activityString) }
// AdDisplayUtils.getInstance().incrementAdDisplayCount()
LogEx.logDebug(TAG, "loadingListener finish")
}
}
\ No newline at end of file
//package com.base.filerecoveryrecyclebin.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.filerecoveryrecyclebin.MyApplication.Companion.isInterOpenShowing
//import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
//import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.isAdInit
//import com.base.filerecoveryrecyclebin.help.ConfigHelper
//import com.base.filerecoveryrecyclebin.utils.EventUtils
//import com.base.filerecoveryrecyclebin.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:" + p0)
// LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p1.message.toString())
// 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: ((loaded: 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()
// }
//
//
//
// LogEx.logDebug(TAG, "showAppOpenAd")
// val obj1 = JSONObject()
// obj1.put("ad_unit", "openAd")
// EventUtils.event("ad_prepare_show", ext = obj1)
//
// isInterOpenShowing = false
//
// 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
// }
//
// 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
// }
//
// fun isOpenAdLoaded(): Boolean {
// return appOpenAd?.isReady == true
// }
//
//}
//
package com.base.filerecoveryrecyclebin.ads.max
import android.animation.ObjectAnimator
import android.app.Activity
import android.app.Dialog
import android.os.Handler
import android.os.Looper
import android.view.View
import android.view.Window
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAppOpenAd
import com.base.filerecoveryrecyclebin.MyApplication.Companion.isInterOpenShowing
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.splash.Splash2Activity
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.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:" + p0)
LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p1.message.toString())
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,
showBefore: ((flag: Boolean) -> Unit)? = null,
loadCallBack: ((loaded: 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()
}
LogEx.logDebug(TAG, "showAppOpenAd")
val obj1 = JSONObject()
obj1.put("ad_unit", "openAd")
EventUtils.event("ad_prepare_show", ext = obj1)
isInterOpenShowing = false
if (appOpenAd?.isReady == true) {
LogEx.logDebug(TAG, "广告准备好了,展示广告")
AdMaxOpenUtils.onHidden = onHidden
LogEx.logDebug(TAG, "Splash2Activity.isSplashHot=${Splash2Activity.isSplashHot}")
showBefore?.invoke(true)
if (Splash2Activity.isSplashHot) {
startCountdownAndShowAd {
appOpenAd?.showAd()
}
} else {
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
showBefore?.invoke(true)
LogEx.logDebug(TAG, "Splash2Activity.isSplashHot=${Splash2Activity.isSplashHot}")
if (Splash2Activity.isSplashHot) {
startCountdownAndShowAd {
appOpenAd?.showAd()
}
} else {
appOpenAd?.showAd()
}
} else {
showBefore?.invoke(false)
onHidden?.invoke()
}
}
} else {
onHidden?.invoke()
}
}
}
fun loadAppOpenAd(activity: Activity): Boolean {
setListener(activity)
if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
LogEx.logDebug(TAG, "!shouldShowAd")
return false
}
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
}
fun isOpenAdLoaded(): Boolean {
return appOpenAd?.isReady == true
}
private fun showLoadingScreen(activity: Activity, callBack: (() -> Unit)) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (loadingDialog == null) {
loadingDialog = Dialog(activity).apply {
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.dialog_loading)
setCancelable(false)
window?.setBackgroundDrawable(ContextCompat.getDrawable(activity, R.drawable.bg_loadingads))
}
}
val imageView = loadingDialog?.findViewById<ImageView>(R.id.loading_image)
val countdownTextView = loadingDialog?.findViewById<TextView>(R.id.countdown_text)
imageView?.let { startRotateAnimation(it) } // 开始旋转动画
// 控制倒计时文本是否显示
countdownTextView?.visibility = View.VISIBLE
loadingDialog?.show()
startCountdownAndShowAd(callBack = callBack)
}
private fun startRotateAnimation(imageView: ImageView) {
ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f).apply {
duration = 3000 // 持续 3 秒
repeatCount = ObjectAnimator.INFINITE // 无限循环
start()
}
}
private var countdown = 3 // 初始倒计时
private var countdownHandler: Handler? = null
private var loadingDialog: Dialog? = null
private fun startCountdownAndShowAd(callBack: (() -> Unit)?) {
countdown = 3
updateCountdownText(count = countdown) // 显示倒计时文本
countdownHandler?.removeCallbacksAndMessages(null)
countdownHandler = Handler(Looper.getMainLooper())
countdownHandler?.post(object : Runnable {
override fun run() {
if (countdown <= 0) {
loadingDialog?.dismiss()
Splash2Activity.progressCallBack = null
callBack?.invoke()
} else {
Splash2Activity.progressCallBack?.invoke()
updateCountdownText(countdown) // 更新倒计时文本
countdown--
LogEx.logDebug(TAG, "startCountdownAndShowAd countdown=$countdown")
countdownHandler?.postDelayed(this, 1000)
}
}
})
}
// 更新倒计时文本并控制是否显示括号和数字
private fun updateCountdownText(count: Int) {
val countdownTextView = loadingDialog?.findViewById<TextView>(R.id.countdown_text)
// LogEx.logDebug(AdmobOpenUtils.TAG, "updateCountdownText $count countdownTextView=$countdownTextView")
countdownTextView?.text = "Ads are about to be shown($count)"
countdownTextView?.visibility = View.VISIBLE
}
}
......@@ -11,8 +11,6 @@ object ConstObject {
const val ID_RECOVERY_VIDEOS = 13001
const val ID_RECOVERY_DOCUMENTS = 13002
const val ID_WHATSAPP = 12001
const val ID_APP_PROCESS = 12056
const val ID_APP_MANAGER = 12076
const val ID_BATTERY_INFO = 12086
const val ID_WHEATHER = 12087
const val ID_XINGZUO = 12088
......@@ -26,9 +24,6 @@ object ConstObject {
const val SCREENSHOT_CLEANER = "Screenshot Cleaner"
const val PRIVACY_SPACE = "Privacy Space"
const val RECYCLE_BIN = "Recycle Bin"
const val WHATSAPP_CLEANER = "WhatsApp Cleaner"
const val APP_PROCESS = "App Process"
const val APP_MANAGER = "App Manager"
const val LARGE_FILE = "Large File"
const val BATTERY_INFO = "Battery Info"
......
package com.base.filerecoveryrecyclebin.fragment
import android.annotation.SuppressLint
import android.content.Intent
import androidx.core.view.isVisible
import com.base.filerecoveryrecyclebin.BuildConfig
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.MainActivity
import com.base.filerecoveryrecyclebin.activity.guide.CleanGuideActivity
import com.base.filerecoveryrecyclebin.activity.guide.GuideActivity
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.databinding.FragmentGuideBinding
import com.base.filerecoveryrecyclebin.help.BaseFragment
import com.base.filerecoveryrecyclebin.utils.AppPreferences
class GuideFragment : BaseFragment<FragmentGuideBinding>() {
......@@ -25,56 +21,50 @@ class GuideFragment : BaseFragment<FragmentGuideBinding>() {
@SuppressLint("SetTextI18n")
override fun setView() {
if (page == 1) {
binding.iv.setImageResource(R.mipmap.yindaoye1)
binding.tv0.text = "Deleted precious photos or important\n" +
"filesbyaccident?Regret kicks in."
binding.tvBtn.text = "Next"
} else if (page == 2) {
binding.iv.setImageResource(R.mipmap.yindaoye2)
binding.tv0.text = "Don't leave any regrets! Our APP\n" +
"can accurately retrieve the files\n" +
"you've accidentally deleted."
binding.tvBtn.text = "Next"
// binding.flSkip.visibility = View.GONE
} else {
binding.iv.isVisible = false
binding.tv0.isVisible = false
binding.idLl111.isVisible = true
binding.tvBtn.text = "Next"
when (page) {
0 -> {
binding.iv.setImageResource(R.mipmap.yindaotu1)
binding.ivDian.setImageResource(R.mipmap.dian1)
binding.tvContent.text = "Clean up clutter to unlock more space and\n" +
"keep your phone running smoothly."
}
1 -> {
binding.iv.setImageResource(R.mipmap.yindaotu2)
binding.ivDian.setImageResource(R.mipmap.dian2)
binding.tvContent.text = "Quickly clear junk files and free up valuable\n" +
"storage with just a few taps."
}
3 -> {
binding.iv.setImageResource(R.mipmap.yindaotu3)
binding.ivDian.setImageResource(R.mipmap.dian3)
binding.tvContent.text = "Clean photos,videos,and audio files to\n" +
"save space and keep your phone tidy."
}
}
}
override fun setListener() {
super.setListener()
binding.tvBtn.setOnClickListener {
if (page == 1) {
(requireActivity() as GuideActivity).setPosition(1)
} else if (page == 2) {
(requireActivity() as GuideActivity).setPosition(2)
} else {
(requireActivity() as GuideActivity).lauchPermisson()
}
}
binding.idTvAllow.setOnClickListener {
(requireActivity() as GuideActivity).lauchPermisson()
}
binding.idTvNotAllow.setOnClickListener {
startActivity(Intent(requireContext(), MainActivity::class.java))
requireActivity().finish()
val activity = requireActivity() as GuideActivity?
activity ?: requireActivity()
activity?.next(page)
}
}
private fun jumpNext() {
val showAd = AppPreferences.getInstance().getString("isShowGuideAd", "0")?.toInt()
if (showAd == 1) {
AdmobMaxHelper.admobMaxShowInterstitialAd(requireActivity(), isLoading = false) {
startActivity(Intent(requireContext(), CleanGuideActivity::class.java))
requireActivity().finish()
override fun onResume() {
super.onResume()
if (AdmobMaxHelper.showGuideNativeSp() || BuildConfig.DEBUG) {
kotlin.runCatching {
AdmobMaxHelper.admobMaxShowNativeAd(requireActivity(), binding.flAd)
}
} else {
startActivity(Intent(requireContext(), CleanGuideActivity::class.java))
requireActivity().finish()
}
}
}
\ 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="#4676FF" />
<corners android:radius="69dp" />
</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="#EBF3FF" />
<corners android:radius="16dp" />
</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="#80000000" />
<corners android:radius="0dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/icon_yuan_s" android:state_selected="true" />
<item android:drawable="@mipmap/icon_yuan_n" android:state_selected="false" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.guide.WhichWantGuideActivity">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="35dp"
android:layout_marginTop="56dp"
android:gravity="center"
android:text="Which type do you want to clean?"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="vertical"
app:layout_constraintTop_toBottomOf="@id/tv">
<LinearLayout
android:id="@+id/llPhoto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="4dp"
android:background="@drawable/bg_ebf3ff_16"
android:foreground="?attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginVertical="12dp"
android:layout_marginStart="20dp"
android:src="@mipmap/icon_photo"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="25dp"
android:layout_weight="1"
android:text="Photo"
android:textColor="#111111"
android:textSize="20sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/iv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:background="@drawable/bg_select_yuan"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/llVideo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="4dp"
android:background="@drawable/bg_ebf3ff_16"
android:foreground="?attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginVertical="12dp"
android:layout_marginStart="20dp"
android:src="@mipmap/icon_video" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="25dp"
android:layout_weight="1"
android:text="Video"
android:textColor="#111111"
android:textSize="20sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/iv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:background="@drawable/bg_select_yuan" />
</LinearLayout>
<LinearLayout
android:id="@+id/llAudio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="4dp"
android:background="@drawable/bg_ebf3ff_16"
android:foreground="?attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginVertical="12dp"
android:layout_marginStart="20dp"
android:src="@mipmap/icon_audio" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="25dp"
android:layout_weight="1"
android:text="Audio"
android:textColor="#111111"
android:textSize="20sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/iv3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:background="@drawable/bg_select_yuan" />
</LinearLayout>
<LinearLayout
android:id="@+id/llDocument"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="4dp"
android:background="@drawable/bg_ebf3ff_16"
android:foreground="?attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginVertical="12dp"
android:layout_marginStart="20dp"
android:src="@mipmap/icon_document" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="25dp"
android:layout_weight="1"
android:text="Document"
android:textColor="#111111"
android:textSize="20sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/iv4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:background="@drawable/bg_select_yuan" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llContinue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:orientation="horizontal"
android:padding="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Continue"
android:textColor="#1364FF"
android:textSize="17sp"
android:textStyle="bold" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@mipmap/jiantou" />
</LinearLayout>
<FrameLayout
android:id="@+id/flAd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#EDEDED"
android:minHeight="80dp"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="300dp"
android:layout_height="124dp"
android:layout_gravity="center"
android:background="@drawable/bg_ffffff_10"
tools:ignore="UselessParent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/loading_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:scaleType="centerInside"
android:src="@mipmap/zhuanquan"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="32dp"
android:text="AD LOADING"
android:textColor="#ff111111"
android:textSize="20sp"
app:layout_constraintStart_toEndOf="@id/loading_image"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/countdown_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="Ads are about to be shown"
android:textColor="#ff666666"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/loading_image"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</LinearLayout>
......@@ -4,160 +4,94 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EFEFEF"
android:background="#FFFFFF"
tools:context=".fragment.GuideFragment">
<TextView
android:id="@+id/tvSkip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:layout_marginEnd="20dp"
android:text="Skip"
android:textColor="#B6B6B6"
android:textSize="16sp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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"
app:layout_constraintVertical_bias="0.3"
tools:ignore="ContentDescription"
tools:src="@mipmap/yindaoye1" />
tools:src="@mipmap/yindaotu1" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/id_ll_111"
<TextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
android:layout_marginTop="18dp"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone"
android:text="Clean up clutter to unlock more space and keep your phone running smoothly."
android:textColor="#000000"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
app:layout_constraintTop_toBottomOf="@id/iv" />
<TextView
android:id="@+id/id_tv_need"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:text="Need to obtain storage permissions"
android:textColor="#000000"
android:textSize="15sp"
android:textStyle="bold"
android:visibility="visible" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/id_ll_need"
android:layout_width="264dp"
android:layout_height="wrap_content"
android:layout_marginTop="74dp"
android:background="@drawable/shape_ffffff_r20"
android:gravity="center_horizontal"
android:orientation="vertical"
android:visibility="visible">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:src="@mipmap/folder" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
android:layout_marginTop="18dp"
android:text="Allow Dumpster: Photo Recovery to
access all files on your device?"
android:textColor="#7D7D7D"
android:textSize="13sp" />
<TextView
android:id="@+id/id_tv_allow"
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_marginHorizontal="40dp"
android:layout_marginTop="18dp"
android:background="@drawable/shape_f5f5f5_r8"
android:gravity="center"
android:text="allow"
android:textColor="#4773FF"
android:textSize="13sp" />
<TextView
android:id="@+id/id_tv_not_allow"
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_marginHorizontal="40dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="12dp"
android:background="@drawable/shape_f5f5f5_r8"
android:gravity="center"
android:text="not allow"
android:textColor="#A7A7A7"
android:textSize="13sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
<LinearLayout
android:id="@+id/ll"
<ImageView
android:id="@+id/ivDian"
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">
<TextView
android:id="@+id/tv_0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="40dp"
android:text="Deleted precious photos or important
filesbyaccident?Regret kicks in."
android:textSize="15sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1">
<TextView
android:id="@+id/tv_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center|bottom"
android:text="One click scanning can restore various\ntypes of files such as photos,video,audio,\ndocuments,etc"
android:textSize="18sp"
android:visibility="gone"
tools:ignore="HardcodedText" />
</FrameLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/tv_btn"
app:layout_constraintTop_toBottomOf="@id/ll" />
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:src="@mipmap/dian1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvContent" />
<TextView
android:id="@+id/tv_btn"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_marginHorizontal="30dp"
android:layout_marginHorizontal="80dp"
android:layout_marginTop="24dp"
android:layout_marginBottom="28dp"
android:background="@drawable/bg_577dfd_10"
android:background="@drawable/bg_4676ff_69"
android:gravity="center"
android:text="Next"
android:textColor="@color/white"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivDian"
tools:ignore="MissingConstraints" />
<FrameLayout
android:id="@+id/flAd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#D9D9D9"
android:minHeight="75dp"
app:layout_constraintBottom_toBottomOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="AD"
android:textColor="#ffffff"
android:textSize="16sp" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/flAd"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#D9D9D9"
tools:context=".activity.guide.NativeFullFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@color/white">
<TextView
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginTop="16dp"
android:background="#D9D9D9"
android:gravity="center"
android:text="ad"
android:textColor="@color/white"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@drawable/bg_ad_border_ffffff"
android:baselineAligned="false"
android:orientation="vertical"
android:padding="10dp"
tools:ignore="UselessParent">
<FrameLayout
android:id="@+id/ad_media"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center_vertical"
android:layout_marginTop="10dp"
android:layout_weight="1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/ad_app_icon"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_gravity="center_vertical"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="#FF923E"
android:padding="2dp"
android:paddingHorizontal="3dp"
android:text="Ad"
android:textColor="@color/white"
android:textSize="12sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/ad_headline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:id="@+id/ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/ad_call_to_action"
android:layout_width="wrap_content"
android:layout_height="38dp"
android:layout_gravity="center_vertical"
android:background="@drawable/bg_ad_button_0073c3"
android:gravity="center"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="15sp"
tools:text="Install" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<com.google.android.gms.ads.nativead.NativeAdView 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:layout_margin="10dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_ad_border">
<com.google.android.gms.ads.nativead.MediaView
android:id="@+id/ad_media"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/ll"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="11dp"
android:layout_weight="1"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="4dp"
android:background="#FF923E"
android:padding="2dp"
android:text="Ad"
android:textColor="@color/white"
android:textSize="12sp"
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="@color/black"
android:textSize="14sp"
android:textStyle="bold"
tools:text="Competition Countdown" />
</LinearLayout>
<TextView
android:id="@+id/ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="12sp"
tools:text="Best competitions, One App We don't run any competitions,we just show you them all in one" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="14dp">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/ad_call_to_action"
android:layout_width="match_parent"
android:layout_height="36dp"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="8dp"
android:background="@drawable/bg_ad_button"
android:gravity="center"
android:textColor="@color/white"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
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