Commit 94c8de7b authored by leichao.gao's avatar leichao.gao Committed by wanglei

垃圾清理

parent d80c22fe
...@@ -100,4 +100,8 @@ dependencies { ...@@ -100,4 +100,8 @@ dependencies {
implementation platform('com.google.firebase:firebase-bom:32.3.1') implementation platform('com.google.firebase:firebase-bom:32.3.1')
implementation 'com.google.firebase:firebase-analytics:21.6.2' implementation 'com.google.firebase:firebase-analytics:21.6.2'
implementation("com.google.firebase:firebase-messaging") implementation("com.google.firebase:firebase-messaging")
//max adjust 归因
implementation 'com.adjust.sdk:adjust-android:4.28.7'
} }
\ No newline at end of file
...@@ -6,7 +6,8 @@ import android.content.Intent ...@@ -6,7 +6,8 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.text.TextUtils import android.text.TextUtils
import com.base.datarecovery.activity.SplashActivity import com.base.datarecovery.activity.SplashActivity
import com.base.datarecovery.ads.AdmobOpenUtils import com.base.datarecovery.ads.admob.AdmobOpenUtils
import com.base.datarecovery.ads.max.AdMaxInit.initAdMax
import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy
import com.base.datarecovery.fcm.FCMManager import com.base.datarecovery.fcm.FCMManager
import com.base.datarecovery.fcm.RecoveryTimerManager import com.base.datarecovery.fcm.RecoveryTimerManager
...@@ -55,6 +56,7 @@ class MyApplication : BaseApplication() { ...@@ -55,6 +56,7 @@ class MyApplication : BaseApplication() {
FCMManager.initFirebase(this) FCMManager.initFirebase(this)
FCMManager.subscribeToTopic(topic) FCMManager.subscribeToTopic(topic)
LogEx.logDebug(TAG, "topic=${topic}") LogEx.logDebug(TAG, "topic=${topic}")
InstallHelps.init()
NewComUtils.requestCfg { NewComUtils.requestCfg {
ScreenStatusReceiver.setupScreenStatusListener(this) ScreenStatusReceiver.setupScreenStatusListener(this)
val timerStatus: Int = AppPreferences.getInstance().getString("timerS", "1").toIntOrNull() ?: 1 val timerStatus: Int = AppPreferences.getInstance().getString("timerS", "1").toIntOrNull() ?: 1
...@@ -72,8 +74,11 @@ class MyApplication : BaseApplication() { ...@@ -72,8 +74,11 @@ class MyApplication : BaseApplication() {
} }
} }
if (ifAgreePrivacy) { if (ifAgreePrivacy) {
InstallHelps.init() if (ConfigHelper.admobTrueMaxFlase) {
MobileAds.initialize(this) { initializationStatus -> MobileAds.initialize(this) { initializationStatus ->
}
} else {
initAdMax()
} }
MainScope().launch(Dispatchers.Main) { MainScope().launch(Dispatchers.Main) {
val deferred = async(Dispatchers.IO) { val deferred = async(Dispatchers.IO) {
......
...@@ -13,8 +13,8 @@ import com.base.datarecovery.activity.recovery.FileScanResultActivity ...@@ -13,8 +13,8 @@ import com.base.datarecovery.activity.recovery.FileScanResultActivity
import com.base.datarecovery.activity.repeat.RepeatAnimationActivity import com.base.datarecovery.activity.repeat.RepeatAnimationActivity
import com.base.datarecovery.activity.screenshot.ScreenShotAnimationActivity import com.base.datarecovery.activity.screenshot.ScreenShotAnimationActivity
import com.base.datarecovery.adapter.AppFunctionAdapter import com.base.datarecovery.adapter.AppFunctionAdapter
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.ads.AdmobNativeUtils import com.base.datarecovery.ads.admob.AdmobNativeUtils
import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER
import com.base.datarecovery.bean.ConstObject.PRIVACY_SPACE import com.base.datarecovery.bean.ConstObject.PRIVACY_SPACE
import com.base.datarecovery.bean.ConstObject.RECOVERY_DOCUMENTS import com.base.datarecovery.bean.ConstObject.RECOVERY_DOCUMENTS
......
...@@ -16,9 +16,11 @@ import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity ...@@ -16,9 +16,11 @@ import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
import com.base.datarecovery.activity.recovery.FileScanResultActivity import com.base.datarecovery.activity.recovery.FileScanResultActivity
import com.base.datarecovery.activity.repeat.RepeatActivity import com.base.datarecovery.activity.repeat.RepeatActivity
import com.base.datarecovery.activity.screenshot.ScreenShotActivity import com.base.datarecovery.activity.screenshot.ScreenShotActivity
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.ads.AdmobNativeUtils import com.base.datarecovery.ads.admob.AdmobNativeUtils
import com.base.datarecovery.ads.AdmobOpenUtils import com.base.datarecovery.ads.admob.AdmobOpenUtils
import com.base.datarecovery.ads.max.AdMaxInterstitialUtils
import com.base.datarecovery.ads.max.AdMaxOpenUtils
import com.base.datarecovery.bean.ConstObject import com.base.datarecovery.bean.ConstObject
import com.base.datarecovery.bean.ConstObject.ID_JUNK_CLEAN_PUSH import com.base.datarecovery.bean.ConstObject.ID_JUNK_CLEAN_PUSH
import com.base.datarecovery.bean.ConstObject.ID_PRIVACY_SPACE import com.base.datarecovery.bean.ConstObject.ID_PRIVACY_SPACE
...@@ -45,10 +47,7 @@ import kotlinx.coroutines.flow.SharedFlow ...@@ -45,10 +47,7 @@ import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.isActive import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withTimeout
import java.util.concurrent.FutureTask
import kotlin.random.Random import kotlin.random.Random
import kotlin.random.nextLong
@SuppressLint("CustomSplashScreen") @SuppressLint("CustomSplashScreen")
class SplashActivity : BaseActivity<ActivitySplashBinding>() { class SplashActivity : BaseActivity<ActivitySplashBinding>() {
...@@ -83,6 +82,13 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -83,6 +82,13 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
job = startProgress() job = startProgress()
binding.llStart.visibility = View.GONE binding.llStart.visibility = View.GONE
binding.llProgress.visibility = View.VISIBLE binding.llProgress.visibility = View.VISIBLE
if (ConfigHelper.admobTrueMaxFlase) {
AdmobNativeUtils.loadNativeAd()
AdmobInterstitialUtils.loadInterstitialAd(this)
} else {
AdMaxOpenUtils.loadAppOpenAd(this)
AdMaxInterstitialUtils.loadInterstitialAd(this)
}
} else { } else {
binding.llStart.visibility = View.VISIBLE binding.llStart.visibility = View.VISIBLE
binding.llProgress.visibility = View.GONE binding.llProgress.visibility = View.GONE
...@@ -185,9 +191,16 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -185,9 +191,16 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
if (oneClickStart) { if (oneClickStart) {
return@setOnClickListener return@setOnClickListener
} }
(application as MyApplication).initApp()
oneClickStart = true oneClickStart = true
ifAgreePrivacy = true ifAgreePrivacy = true
(application as MyApplication).initApp()
if (ConfigHelper.admobTrueMaxFlase) {
AdmobNativeUtils.loadNativeAd()
AdmobInterstitialUtils.loadInterstitialAd(this)
} else {
AdMaxOpenUtils.loadAppOpenAd(this)
AdMaxInterstitialUtils.loadInterstitialAd(this)
}
binding.llStart.visibility = View.GONE binding.llStart.visibility = View.GONE
binding.llProgress.visibility = View.VISIBLE binding.llProgress.visibility = View.VISIBLE
job = startProgress() job = startProgress()
...@@ -197,7 +210,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -197,7 +210,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
private var processTime = 0L private var processTime = 0L
private var outTimeAdStart = false private var outTimeAdStart = false
private fun startProgress() = lifecycleScope.launch { private fun startProgress() = lifecycleScope.launch {
LogEx.logDebug(TAG,"startProgress") LogEx.logDebug(TAG, "startProgress")
while (isActive) { while (isActive) {
val value = binding.pb.progress + 2 val value = binding.pb.progress + 2
binding.pb.setProgress(value, true) binding.pb.setProgress(value, true)
...@@ -217,21 +230,33 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -217,21 +230,33 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
private fun outTimeAd() { private fun outTimeAd() {
LogEx.logDebug(TAG,"outTimeAd") LogEx.logDebug(TAG, "outTimeAd")
AdmobOpenUtils.loadAppOpenAd { if (ConfigHelper.admobTrueMaxFlase) {
LogEx.logDebug(TAG, "load where=$it") AdmobOpenUtils.loadAppOpenAd {
job?.cancel() LogEx.logDebug(TAG, "load where=$it")
AdmobOpenUtils.showAppOpenAd(this@SplashActivity) { job?.cancel()
LogEx.logDebug(TAG, "adCallBack=$it") AdmobOpenUtils.showAppOpenAd(this@SplashActivity) {
binding.pb.progress = 100 LogEx.logDebug(TAG, "adCallBack=$it")
jumpNext() binding.pb.progress = 100
jumpNext()
}
} }
} else {
AdMaxOpenUtils.showAppOpenAd(this@SplashActivity,
loaded = {
job?.cancel()
},
onHidden = {
binding.pb.progress = 100
jumpNext()
})
} }
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
LogEx.logDebug(TAG,"onResume") LogEx.logDebug(TAG, "onResume")
if (ifAgreePrivacy && job?.isActive == false) { if (ifAgreePrivacy && job?.isActive == false) {
job = startProgress() job = startProgress()
} }
...@@ -240,7 +265,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -240,7 +265,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
job?.cancel() job?.cancel()
LogEx.logDebug(TAG,"onPause") LogEx.logDebug(TAG, "onPause")
} }
......
...@@ -10,13 +10,12 @@ import android.view.ViewGroup ...@@ -10,13 +10,12 @@ import android.view.ViewGroup
import android.view.animation.LinearInterpolator import android.view.animation.LinearInterpolator
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.base.datarecovery.BuildConfig import com.base.datarecovery.BuildConfig
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.activity.ResultActivity import com.base.datarecovery.activity.ResultActivity
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.ads.AdmobNativeUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.bean.ChildBean import com.base.datarecovery.bean.ChildBean
import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER
import com.base.datarecovery.bean.ParentBean import com.base.datarecovery.bean.ParentBean
...@@ -90,7 +89,7 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { ...@@ -90,7 +89,7 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
override fun handleOnBackPressed() { override fun handleOnBackPressed() {
showExitFunctionDialog { showExitFunctionDialog {
if (it) { if (it) {
AdmobInterstitialUtils.showInterstitialAd(this@CleanJunkActivity) { AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleanJunkActivity){
finishToMain() finishToMain()
} }
} else { } else {
......
...@@ -9,7 +9,7 @@ import androidx.activity.addCallback ...@@ -9,7 +9,7 @@ import androidx.activity.addCallback
import androidx.core.animation.doOnEnd import androidx.core.animation.doOnEnd
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.datarecovery.activity.ResultActivity import com.base.datarecovery.activity.ResultActivity
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER
import com.base.datarecovery.databinding.ActivityLayoutCleanupingBinding import com.base.datarecovery.databinding.ActivityLayoutCleanupingBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
......
...@@ -7,10 +7,12 @@ import android.view.animation.LinearInterpolator ...@@ -7,10 +7,12 @@ import android.view.animation.LinearInterpolator
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.AdmobMaxHelper.admobMaxShowInterstitialAd
import com.base.datarecovery.ads.AdmobNativeUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.ads.max.AdMaxInterstitialUtils
import com.base.datarecovery.databinding.ActivityLayoutScanJunkBinding import com.base.datarecovery.databinding.ActivityLayoutScanJunkBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.help.PermissionHelp.checkStorePermission import com.base.datarecovery.help.PermissionHelp.checkStorePermission
import com.base.datarecovery.help.PermissionHelp.requestStorePermission import com.base.datarecovery.help.PermissionHelp.requestStorePermission
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
...@@ -122,7 +124,7 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() { ...@@ -122,7 +124,7 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
binding.root.postDelayed({ binding.root.postDelayed({
if (showAd) { if (showAd) {
AdmobInterstitialUtils.showInterstitialAd(this) { admobMaxShowInterstitialAd(this){
a1.cancel() a1.cancel()
a2.cancel() a2.cancel()
a3.cancel() a3.cancel()
......
...@@ -8,7 +8,7 @@ import android.widget.Toast ...@@ -8,7 +8,7 @@ import android.widget.Toast
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.adapter.MediaSubAdapter import com.base.datarecovery.adapter.MediaSubAdapter
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.bean.MediaBean import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.databinding.ActivityPrivacyManageBinding import com.base.datarecovery.databinding.ActivityPrivacyManageBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
......
...@@ -4,12 +4,11 @@ import android.annotation.SuppressLint ...@@ -4,12 +4,11 @@ import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.view.View import android.view.View
import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.bean.ConstObject.privacyPinPassword import com.base.datarecovery.bean.ConstObject.privacyPinPassword
import com.base.datarecovery.databinding.ActivityPrivacySpaceBinding import com.base.datarecovery.databinding.ActivityPrivacySpaceBinding
import com.base.datarecovery.fragment.PrivacyPageFragment import com.base.datarecovery.fragment.PrivacyPageFragment
......
...@@ -2,11 +2,9 @@ package com.base.datarecovery.activity.recovery ...@@ -2,11 +2,9 @@ package com.base.datarecovery.activity.recovery
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.graphics.Color import android.graphics.Color
import android.os.Environment
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
......
...@@ -9,7 +9,7 @@ import androidx.activity.addCallback ...@@ -9,7 +9,7 @@ import androidx.activity.addCallback
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.adapter.FileFolderAdapter import com.base.datarecovery.adapter.FileFolderAdapter
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
...@@ -19,7 +19,6 @@ import com.base.datarecovery.bean.RecoveryBean.Companion.setType ...@@ -19,7 +19,6 @@ import com.base.datarecovery.bean.RecoveryBean.Companion.setType
import com.base.datarecovery.databinding.ActivityFileScanResultBinding import com.base.datarecovery.databinding.ActivityFileScanResultBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.FileHelp.loadFileByFilter import com.base.datarecovery.help.FileHelp.loadFileByFilter
import com.base.datarecovery.help.KotlinExt.toFormatTime
import com.base.datarecovery.help.PermissionHelp.checkStorePermission import com.base.datarecovery.help.PermissionHelp.checkStorePermission
import com.base.datarecovery.help.PermissionHelp.requestStorePermission import com.base.datarecovery.help.PermissionHelp.requestStorePermission
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
...@@ -30,15 +29,10 @@ import com.base.datarecovery.view.FileScanDialog ...@@ -30,15 +29,10 @@ import com.base.datarecovery.view.FileScanDialog
import com.google.gson.Gson import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.LinkedBlockingQueue
class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() { class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
......
...@@ -6,9 +6,10 @@ import androidx.activity.addCallback ...@@ -6,9 +6,10 @@ import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.adapter.MediaAdapter import com.base.datarecovery.adapter.MediaAdapter
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.ads.AdmobInterstitialUtils.showInterAdSp import com.base.datarecovery.ads.admob.AdmobInterstitialUtils.showInterAdSp
import com.base.datarecovery.ads.AdmobNativeUtils import com.base.datarecovery.ads.admob.AdmobNativeUtils
import com.base.datarecovery.ads.max.AdMaxInterstitialUtils
import com.base.datarecovery.bean.MediaBean import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.bean.MediaTimeBean import com.base.datarecovery.bean.MediaTimeBean
import com.base.datarecovery.databinding.ActivityRepeatBinding import com.base.datarecovery.databinding.ActivityRepeatBinding
...@@ -92,8 +93,14 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() { ...@@ -92,8 +93,14 @@ class RepeatActivity : BaseActivity<ActivityRepeatBinding>() {
binding.tvClean.setOnClickListener { binding.tvClean.setOnClickListener {
showDeletePermanentlyDialog { showDeletePermanentlyDialog {
if (showInterAdSp()) { if (showInterAdSp()) {
AdmobInterstitialUtils.showInterstitialAd(this) { if (ConfigHelper.admobTrueMaxFlase) {
cleanFile() AdmobInterstitialUtils.showInterstitialAd(this@RepeatActivity) {
finishToMain()
}
} else {
AdMaxInterstitialUtils.showInterstitialAd(this@RepeatActivity) {
finishToMain()
}
} }
} else { } else {
cleanFile() cleanFile()
......
package com.base.datarecovery.activity.repeat package com.base.datarecovery.activity.repeat
import android.content.Intent import android.content.Intent
import android.os.Bundle
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.activity.enableEdgeToEdge import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import androidx.appcompat.app.AppCompatActivity import com.base.datarecovery.ads.max.AdMaxInterstitialUtils
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobInterstitialUtils
import com.base.datarecovery.databinding.ActivityRepeatAnimationBinding import com.base.datarecovery.databinding.ActivityRepeatAnimationBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.ConfigHelper
import kotlin.random.Random import kotlin.random.Random
class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() { class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() {
...@@ -23,9 +19,16 @@ class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() { ...@@ -23,9 +19,16 @@ class RepeatAnimationActivity : BaseActivity<ActivityRepeatAnimationBinding>() {
override fun initView() { override fun initView() {
binding.root.postDelayed({ binding.root.postDelayed({
AdmobInterstitialUtils.showInterstitialAd(this) { if (ConfigHelper.admobTrueMaxFlase) {
startActivity(Intent(this, RepeatActivity::class.java)) AdmobInterstitialUtils.showInterstitialAd(this) {
finish() startActivity(Intent(this, RepeatActivity::class.java))
finish()
}
} else {
AdMaxInterstitialUtils.showInterstitialAd(this) {
startActivity(Intent(this, RepeatActivity::class.java))
finish()
}
} }
}, Random.nextLong(3000, 4500)) }, Random.nextLong(3000, 4500))
} }
......
...@@ -7,9 +7,9 @@ import androidx.activity.addCallback ...@@ -7,9 +7,9 @@ import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.adapter.ScreenShotAdapter import com.base.datarecovery.adapter.ScreenShotAdapter
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.ads.AdmobInterstitialUtils.showInterAdSp import com.base.datarecovery.ads.admob.AdmobInterstitialUtils.showInterAdSp
import com.base.datarecovery.ads.AdmobNativeUtils import com.base.datarecovery.ads.admob.AdmobNativeUtils
import com.base.datarecovery.bean.ScreenPhotoBean import com.base.datarecovery.bean.ScreenPhotoBean
import com.base.datarecovery.bean.ScreenshotBean import com.base.datarecovery.bean.ScreenshotBean
import com.base.datarecovery.databinding.ActivityScreenShotBinding import com.base.datarecovery.databinding.ActivityScreenShotBinding
......
...@@ -3,8 +3,7 @@ package com.base.datarecovery.activity.screenshot ...@@ -3,8 +3,7 @@ package com.base.datarecovery.activity.screenshot
import android.content.Intent import android.content.Intent
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import com.base.datarecovery.activity.repeat.RepeatActivity import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.ads.AdmobInterstitialUtils
import com.base.datarecovery.databinding.ActivityScreenShotAnimationBinding import com.base.datarecovery.databinding.ActivityScreenShotAnimationBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import kotlin.random.Random import kotlin.random.Random
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
//import androidx.lifecycle.lifecycleScope //import androidx.lifecycle.lifecycleScope
//import com.base.datarecovery.R //import com.base.datarecovery.R
//import com.base.datarecovery.adapter.WhatsAppCleanerAdapter //import com.base.datarecovery.adapter.WhatsAppCleanerAdapter
//import com.base.datarecovery.ads.AdmobInterstitialUtils //import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
//import com.base.datarecovery.ads.AdmobNativeUtils //import com.base.datarecovery.ads.admob.AdmobNativeUtils
//import com.base.datarecovery.bean.WhatsAppCleanerBean //import com.base.datarecovery.bean.WhatsAppCleanerBean
//import com.base.datarecovery.databinding.ActivityWhatsAppCleanerBinding //import com.base.datarecovery.databinding.ActivityWhatsAppCleanerBinding
//import com.base.datarecovery.help.BaseActivity //import com.base.datarecovery.help.BaseActivity
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
//import androidx.recyclerview.widget.GridLayoutManager //import androidx.recyclerview.widget.GridLayoutManager
//import androidx.recyclerview.widget.LinearLayoutManager //import androidx.recyclerview.widget.LinearLayoutManager
//import com.base.datarecovery.adapter.WhatsAppMediaAdapter //import com.base.datarecovery.adapter.WhatsAppMediaAdapter
//import com.base.datarecovery.ads.AdmobInterstitialUtils //import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
//import com.base.datarecovery.ads.AdmobNativeUtils //import com.base.datarecovery.ads.admob.AdmobNativeUtils
//import com.base.datarecovery.bean.MediaBean //import com.base.datarecovery.bean.MediaBean
//import com.base.datarecovery.databinding.ActivityWhatsAppMessageCleanBinding //import com.base.datarecovery.databinding.ActivityWhatsAppMessageCleanBinding
//import com.base.datarecovery.help.BaseActivity //import com.base.datarecovery.help.BaseActivity
......
...@@ -93,7 +93,7 @@ public class AdDisplayUtils { ...@@ -93,7 +93,7 @@ public class AdDisplayUtils {
} }
adRequestFailCount++; adRequestFailCount++;
saveAdRequestFailCount(); saveAdRequestFailCount();
Log.d("glc","广告请求失败:"+adRequestFailCount); Log.d("glc", "广告请求失败:" + adRequestFailCount);
} }
...@@ -106,7 +106,7 @@ public class AdDisplayUtils { ...@@ -106,7 +106,7 @@ public class AdDisplayUtils {
saveAdClickCount(); saveAdClickCount();
} }
private String getCurrentDate() { public String getCurrentDate() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
Date currentDate = Calendar.getInstance().getTime(); Date currentDate = Calendar.getInstance().getTime();
return dateFormat.format(currentDate); return dateFormat.format(currentDate);
......
package com.base.datarecovery.ads
import android.app.Activity
import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.ads.max.AdMaxInterstitialUtils
import com.base.datarecovery.help.ConfigHelper
object AdmobMaxHelper {
fun admobMaxShowInterstitialAd(activity: Activity, onHidden: (() -> Unit)? = null) {
if (ConfigHelper.admobTrueMaxFlase) {
AdmobInterstitialUtils.showInterstitialAd(activity) {
onHidden?.invoke()
}
} else {
AdMaxInterstitialUtils.showInterstitialAd(activity) {
onHidden?.invoke()
}
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads package com.base.datarecovery.ads.admob
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.utils.ActivityManagerUtils import com.base.datarecovery.utils.ActivityManagerUtils
object AdmobCommonUtils { object AdmobCommonUtils {
......
package com.base.datarecovery.ads package com.base.datarecovery.ads.admob
import android.app.Activity import android.app.Activity
import android.os.Bundle import android.os.Bundle
......
package com.base.datarecovery.ads package com.base.datarecovery.ads.admob
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
...@@ -7,10 +7,11 @@ import android.os.CountDownTimer ...@@ -7,10 +7,11 @@ import android.os.CountDownTimer
import android.widget.Toast import android.widget.Toast
import com.base.datarecovery.BuildConfig import com.base.datarecovery.BuildConfig
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobCommonUtils.isMultiClick import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.AdmobEvent.clickAd import com.base.datarecovery.ads.admob.AdmobCommonUtils.isMultiClick
import com.base.datarecovery.ads.AdmobEvent.pullAd import com.base.datarecovery.ads.admob.AdmobEvent.clickAd
import com.base.datarecovery.ads.AdmobEvent.showAd import com.base.datarecovery.ads.admob.AdmobEvent.pullAd
import com.base.datarecovery.ads.admob.AdmobEvent.showAd
import com.base.datarecovery.help.BaseApplication import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.AppPreferences import com.base.datarecovery.utils.AppPreferences
......
package com.base.datarecovery.ads package com.base.datarecovery.ads.admob
import android.app.Activity import android.app.Activity
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobCommonUtils.isMultiClick import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.AdmobEvent.clickAd import com.base.datarecovery.ads.admob.AdmobCommonUtils.isMultiClick
import com.base.datarecovery.ads.AdmobEvent.pullAd import com.base.datarecovery.ads.admob.AdmobEvent.clickAd
import com.base.datarecovery.ads.AdmobEvent.showAd import com.base.datarecovery.ads.admob.AdmobEvent.pullAd
import com.base.datarecovery.ads.admob.AdmobEvent.showAd
import com.base.datarecovery.help.BaseApplication import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils import com.base.datarecovery.utils.EventUtils
......
package com.base.datarecovery.ads package com.base.datarecovery.ads.admob
import android.app.Activity import android.app.Activity
import com.base.datarecovery.ads.AdmobCommonUtils.isMultiClick import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.AdmobEvent.clickAd import com.base.datarecovery.ads.admob.AdmobCommonUtils.isMultiClick
import com.base.datarecovery.ads.AdmobEvent.pullAd import com.base.datarecovery.ads.admob.AdmobEvent.clickAd
import com.base.datarecovery.ads.AdmobEvent.showAd import com.base.datarecovery.ads.admob.AdmobEvent.pullAd
import com.base.datarecovery.ads.admob.AdmobEvent.showAd
import com.base.datarecovery.help.BaseApplication import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils import com.base.datarecovery.utils.EventUtils
......
package com.base.datarecovery.ads package com.base.datarecovery.ads.admob
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
......
package com.base.datarecovery.ads.max
import android.app.Activity
import com.applovin.mediation.MaxAd
import com.base.datarecovery.utils.EventUtils
import org.json.JSONObject
object AdMaxEvent {
fun clickAd(nativeAd: MaxAd, adUnit: String) {
// val response = responseInfo?.adapterResponses?.getOrNull(0)
val obj = JSONObject()
// obj.put("source", response?.adSourceName)
obj.put("source", nativeAd.dspName)
obj.put("ad_unit", adUnit)
// val credentials = mapOf(
// "placementid" to response?.credentials?.get("placementid"),
// "appid" to response?.credentials?.get("appid"),
// "pubid" to response?.credentials?.get("pubid")
// )
// obj.put("credentials", credentials.toString())
// obj.put("session_id", responseInfo?.responseId)
// obj.put("networkname", responseInfo?.mediationAdapterClassName)
obj.put("networkname", nativeAd.networkName)
if (adUnit != "nativeAd") {
EventUtils.event("ad_click", ext = obj)
} else {
EventUtils.event("bigimage_ad_click", ext = obj)
}
}
fun showAd(nativeAd: MaxAd, adUnit: String, activity: Activity? = null) {
// val response = responseInfo?.adapterResponses?.getOrNull(0)
val obj = JSONObject()
// obj.put("source", response?.adSourceName)
obj.put("ad_unit", adUnit)
obj.put("networkname", nativeAd.networkName)
// val credentials = mapOf(
// "placementid" to response?.credentials?.get("placementid"),
// "appid" to response?.credentials?.get("appid"),
// "pubid" to response?.credentials?.get("pubid")
// )
// obj.put("credentials", credentials.toString())
// obj.put("session_id", responseInfo?.responseId)
obj.put("from", activity?.javaClass?.simpleName)
if (adUnit != "nativeAd") {
EventUtils.event("ad_show", ext = obj)
} else {
EventUtils.event("bigimage_ad_show", ext = obj)
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads.max
import android.content.Context
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkInitializationConfiguration
import com.base.datarecovery.utils.LogEx
import com.google.android.gms.ads.identifier.AdvertisingIdClient
import java.util.Collections
import java.util.concurrent.Executors
object AdMaxInit {
private val TAG = "com.base.datarecovery.ads.max.AdMaxInit"
var isAdMaxInit = false
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 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")
isAdMaxInit = true
}
executor.shutdown()
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads.max
import android.annotation.SuppressLint
import android.app.Activity
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxInterstitialAd
import com.base.datarecovery.R
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.CustomDialog
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.json.JSONObject
import java.util.concurrent.TimeUnit
import kotlin.math.min
import kotlin.math.pow
object AdMaxInterstitialUtils {
private val TAG = "com.base.datarecovery.ads.max.AdMaxInterstitialUtils"
private var interstitialAd: MaxInterstitialAd? = null
private var interLoadTime = Long.MAX_VALUE
private var onHidden: (() -> Unit)? = null
private var loadingListener: (() -> Unit)? = null
private var retryAttempt = 0
private var maxRetryAttempt = 8
@SuppressLint("StaticFieldLeak")
private var customDialog: CustomDialog? = null
private fun setListener(activity: Activity) {
if (interstitialAd == null) {
interstitialAd = MaxInterstitialAd(ConfigHelper.interAdMaxId, activity)
}
interstitialAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdLoaded")
loadingListener?.invoke()
interLoadTime = System.currentTimeMillis()
retryAttempt = 0
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
LogEx.logDebug(TAG, "onAdLoadFailed")
AdDisplayUtils.getInstance().incrementAdRequestFailCount()
retryAttempt++
val delayMillis = TimeUnit.SECONDS.toMillis(2.0.pow(min(6, retryAttempt)).toLong())
LogEx.logDebug(TAG, "onAdLoadFailed retryAttempt=$retryAttempt delayMillis=$delayMillis")
if (retryAttempt == 2) {
onHidden?.invoke()
customDialog?.dismiss()
}
if (retryAttempt <= maxRetryAttempt) {
MainScope().launch {
delay(delayMillis)
interstitialAd?.loadAd()
}
} else {
retryAttempt = 0
}
}
override fun onAdDisplayed(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdDisplayed")
AdDisplayUtils.getInstance().incrementAdDisplayCount()
}
override fun onAdHidden(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdHidden")
onHidden?.invoke()
interstitialAd?.loadAd()
}
override fun onAdClicked(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdClicked")
AdDisplayUtils.getInstance().incrementAdClickCount()
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
LogEx.logDebug(TAG, "onAdDisplayFailed")
}
})
}
fun showInterstitialAd(
activity: Activity,
isReLoadAd: Boolean = false,
isShowDialog: Boolean = true,
onHidden: (() -> Unit)? = null
) {
setListener(activity)
if (activity.isFinishing || activity.isDestroyed) {
return
}
val obj1 = JSONObject()
obj1.put("ad_unit", "interAd")
EventUtils.event("ad_prepare_show", ext = obj1)
if (isAdExpired()) {
val obj2 = JSONObject()
obj2.put("ad_unit", "interAd")
EventUtils.event("ad_expire", ext = obj2)
interstitialAd?.loadAd()
onHidden?.invoke()
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
onHidden?.invoke()
return
}
AdMaxInterstitialUtils.onHidden = onHidden
if (interstitialAd?.isReady == true) {
LogEx.logDebug(TAG, "isReady=true")
showIntervalDialogAndShowAd(activity, isShowDialog, onHidden, 2)
} else {
interstitialAd?.loadAd()
LogEx.logDebug(TAG, "isReady=false")
showAdDialogAndLoadInterstitial(activity, isShowDialog)
}
}
private fun isAdExpired(): Boolean {
return System.currentTimeMillis() - interLoadTime > 1000 * 60 * 60
}
private fun showIntervalDialogAndShowAd(
activity: Activity,
isShowDialog: Boolean,
onHidden: (() -> Unit)?,
interval: Int
) {
// if (!isShowDialog) {
// return
// }
//
// if (customDialog != null && customDialog?.isShowing == true) {
// return // 如果对话框已经显示,则不再显示
// }
//
// customDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
// customDialog?.setCountdownText(R.id.dialog_ad_loading_text)
// val countdownTimer = object : CountDownTimer((interval * 1000).toLong(), 1000) {
// override fun onTick(millisUntilFinished: Long) {
// val seconds = (millisUntilFinished / 1000).toInt()
// customDialog?.updateCountdownText("Advertising in preparation ($seconds" + "s)...")
// }
//
// override fun onFinish() {
// if (!activity.isDestroyed && !activity.isFinishing) {
// customDialog?.dismiss()
// }
// customDialog = null
// LogEx.logDebug(TAG, "onFinish")
interstitialAd?.showAd()
// }
// }
// countdownTimer.start()
// customDialog?.show()
}
private fun showAdDialogAndLoadInterstitial(
activity: Activity,
isShowDialog: Boolean,
) {
if (!isShowDialog) {
return
}
if (!activity.isFinishing && !activity.isDestroyed) {
customDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
// 设置对话框的样式和内容
customDialog?.show()
}
loadingListener = {
customDialog?.dismiss()
interstitialAd?.showAd()
loadingListener = null
}
}
fun loadInterstitialAd(activity: Activity) {
setListener(activity)
if (AdMaxInit.isAdMaxInit) {
interstitialAd?.loadAd()
}
}
}
\ No newline at end of file
import android.app.Activity
import android.content.Context
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.adjust.sdk.Adjust
import com.adjust.sdk.AdjustAdRevenue
import com.adjust.sdk.AdjustConfig
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxError
import com.applovin.mediation.nativeAds.MaxNativeAdListener
import com.applovin.mediation.nativeAds.MaxNativeAdLoader
import com.applovin.mediation.nativeAds.MaxNativeAdView
import com.applovin.mediation.nativeAds.MaxNativeAdViewBinder
import com.base.datarecovery.R
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.admob.AdmobCommonUtils
import com.base.datarecovery.ads.max.AdMaxEvent
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import org.json.JSONObject
object AdMaxNativeUtils {
private val TAG = "AdMaxNativeUtils"
private var nativeAdLoader: MaxNativeAdLoader = MaxNativeAdLoader(ConfigHelper.nativeAdMaxId, BaseApplication.context)
private var nativeAd: MaxAd? = null
private var nativeLoadTime = Long.MAX_VALUE
private var haveSetAdListener: Boolean = false
private var loadingListener: (() -> Unit)? = null
private fun setNativeAdListener() {
if (!haveSetAdListener) {
//加载展示监听
nativeAdLoader.setNativeAdListener(object : MaxNativeAdListener() {
override fun onNativeAdLoaded(nativeAdView: MaxNativeAdView?, ad: MaxAd) {
// Cleanup any pre-existing native ad to prevent memory leaks.
if (nativeAd != null) {
nativeAdLoader.destroy(nativeAd)
}
// Save ad to be rendered later.
nativeAd = ad
nativeLoadTime = System.currentTimeMillis()
loadingListener?.invoke()
}
override fun onNativeAdLoadFailed(p0: String, p1: MaxError) {
super.onNativeAdLoadFailed(p0, p1)
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)
AdDisplayUtils.getInstance().incrementAdClickCount()
nativeAd?.let { AdMaxEvent.clickAd(it, "nativeAd") }
AdmobCommonUtils.isMultiClick(nativeAd)
}
override fun onNativeAdExpired(p0: MaxAd) {
super.onNativeAdExpired(p0)
}
})
//广告价格监听
nativeAdLoader.setRevenueListener { ad ->
val adjustAdRevenue = AdjustAdRevenue(AdjustConfig.AD_REVENUE_APPLOVIN_MAX)
adjustAdRevenue.setRevenue(ad.revenue, "USD")
adjustAdRevenue.setAdRevenueNetwork(ad.networkName)
adjustAdRevenue.setAdRevenueUnit(ad.adUnitId)
adjustAdRevenue.setAdRevenuePlacement(ad.placement)
Adjust.trackAdRevenue(adjustAdRevenue)
}
haveSetAdListener = true
}
}
private fun createNativeAdView(context: Context): 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 showNativeAd(activity: Activity, parent: ViewGroup) {
setNativeAdListener()
val obj = JSONObject()
obj.put("ad_unit", "NativeAd")
EventUtils.event("ad_prepare_show", ext = obj)
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
return
}
loadingListener = {
if (System.currentTimeMillis() - nativeLoadTime <= 1000 * 60 * 60) {
//是否已经加载渲染
if (nativeAd?.nativeAd?.isExpired == true) {
nativeAdLoader.destroy(nativeAd)
nativeAdLoader.loadAd()
} else {
//展示广告
val adView = createNativeAdView(activity)
parent.isVisible = true
nativeAdLoader.render(adView, nativeAd)
parent.addView(adView)
nativeAd?.let { AdMaxEvent.showAd(it, "nativeAd", activity) }
AdDisplayUtils.getInstance().incrementAdDisplayCount()
}
}
loadingListener = null
nativeAdLoader.loadAd()
LogEx.logDebug(TAG, "loadingListener finish")
}
if (nativeAd == null) {
nativeAdLoader.loadAd()
val obj2 = JSONObject()
obj2.put("reason", "no_ad")
obj2.put("ad_unit", "nativeAd")
EventUtils.event("ad_show_error", ext = obj2)
} else {
loadingListener?.invoke()
}
}
}
\ No newline at end of file
package com.base.datarecovery.ads.max
import android.app.Activity
import android.content.Context
import com.adjust.sdk.Adjust
import com.adjust.sdk.AdjustAdRevenue
import com.adjust.sdk.AdjustConfig
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAppOpenAd
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.admob.AdmobCommonUtils
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import org.json.JSONObject
object AdMaxOpenUtils {
private val TAG = "com.base.datarecovery.ads.max.AdMaxOpenUtils"
private var appOpenAd: MaxAppOpenAd? = null
private var openLoadTime = Long.MAX_VALUE
private var onHidden: (() -> Unit)? = null
private var loadingListener: (() -> Unit)? = null
private var retryAttempt = 0
private var maxRetryAttempt = 8
private fun setListener(context: Context) {
if (appOpenAd == null) {
appOpenAd = MaxAppOpenAd(ConfigHelper.openAdMaxId, context)
appOpenAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdLoaded")
openLoadTime = System.currentTimeMillis()
loadingListener?.invoke()
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
LogEx.logDebug(TAG, "onAdLoadFailed")
onHidden?.invoke()
AdDisplayUtils.getInstance().incrementAdRequestFailCount()
// retryAttempt++
// val delayMillis = TimeUnit.SECONDS.toMillis(2.0.pow(min(6, retryAttempt)).toLong())
// LogEx.logDebug(TAG, "onAdLoadFailed retryAttempt=$retryAttempt delayMillis=$delayMillis")
// if (retryAttempt == 2) {
// LogEx.logDebug(TAG, "onAdLoadFailed onHidden")
// onHidden?.invoke()
// }
//
// if (retryAttempt <= maxRetryAttempt) {
// MainScope().launch {
// delay(delayMillis)
// appOpenAd?.loadAd()
// }
// } else {
// retryAttempt = 0
// }
}
override fun onAdDisplayed(p0: MaxAd) {
AdDisplayUtils.getInstance().incrementAdDisplayCount()
}
override fun onAdHidden(p0: MaxAd) {
onHidden?.invoke()
appOpenAd?.loadAd()
loadingListener = null
}
override fun onAdClicked(p0: MaxAd) {
AdDisplayUtils.getInstance().incrementAdClickCount()
// com.base.datarecovery.ads.max.AdMaxEvent.clickAd(appOpenAd, "openAd")
AdmobCommonUtils.isMultiClick(appOpenAd)
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
LogEx.logDebug(TAG, "onAdDisplayFailed")
onHidden?.invoke()
appOpenAd?.loadAd()
val obj = JSONObject()
obj.put("reason", p1.message)
obj.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj)
}
})
appOpenAd?.setRevenueListener { ad ->
val adjustAdRevenue = AdjustAdRevenue(AdjustConfig.AD_REVENUE_APPLOVIN_MAX)
adjustAdRevenue.setRevenue(ad.revenue, "USD")
adjustAdRevenue.setAdRevenueNetwork(ad.networkName)
adjustAdRevenue.setAdRevenueUnit(ad.adUnitId)
adjustAdRevenue.setAdRevenuePlacement(ad.placement)
Adjust.trackAdRevenue(adjustAdRevenue)
}
}
}
fun showAppOpenAd(activity: Activity, loaded: (() -> Unit)? = null, onHidden: (() -> Unit)? = null) {
setListener(activity)
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
LogEx.logDebug(TAG, "!shouldShowAd")
onHidden?.invoke()
return
}
if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) {
LogEx.logDebug(TAG, "openLoadTime > ")
onHidden?.invoke()
val obj2 = JSONObject()
obj2.put("ad_unit", "openAd")
EventUtils.event("ad_expire", ext = obj2)
appOpenAd?.loadAd()
}
if (!AdMaxInit.isAdMaxInit) {
onHidden?.invoke()
return
}
LogEx.logDebug(TAG, "showAppOpenAd continue")
AdMaxOpenUtils.onHidden = onHidden
if (appOpenAd?.isReady == true) {
LogEx.logDebug(TAG, "isReady=false")
appOpenAd?.showAd()
} else {
appOpenAd?.loadAd()
loadingListener = {
LogEx.logDebug(TAG, "loadingListener callback")
loaded?.invoke()
val obj1 = JSONObject()
obj1.put("ad_unit", "openAd")
EventUtils.event("ad_prepare_show", ext = obj1)
appOpenAd?.showAd()
loadingListener = null
}
}
}
fun loadAppOpenAd(activity: Activity) {
setListener(activity)
if (AdMaxInit.isAdMaxInit) {
appOpenAd?.loadAd()
}
}
}
package com.base.datarecovery.fcm; package com.base.datarecovery.fcm;
import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.base.datarecovery.MyApplication; import com.base.datarecovery.MyApplication;
import com.base.datarecovery.ads.AdDisplayUtils; import com.base.datarecovery.ads.AdDisplayUtils;
import com.base.datarecovery.ads.AdmobCommonUtils;
import com.base.datarecovery.utils.AppPreferences; import com.base.datarecovery.utils.AppPreferences;
import com.base.datarecovery.utils.EventUtils; import com.base.datarecovery.utils.EventUtils;
import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.FirebaseMessagingService;
......
...@@ -15,6 +15,7 @@ import androidx.core.graphics.drawable.IconCompat ...@@ -15,6 +15,7 @@ import androidx.core.graphics.drawable.IconCompat
import com.base.datarecovery.MyApplication import com.base.datarecovery.MyApplication
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.activity.SplashActivity import com.base.datarecovery.activity.SplashActivity
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.bean.ConstObject.ID_JUNK_CLEAN_PUSH import com.base.datarecovery.bean.ConstObject.ID_JUNK_CLEAN_PUSH
import com.base.datarecovery.bean.ConstObject.ID_PRIVACY_SPACE import com.base.datarecovery.bean.ConstObject.ID_PRIVACY_SPACE
import com.base.datarecovery.bean.ConstObject.ID_RECOVERY_DOCUMENTS import com.base.datarecovery.bean.ConstObject.ID_RECOVERY_DOCUMENTS
...@@ -101,13 +102,17 @@ object NotificationUtil { ...@@ -101,13 +102,17 @@ object NotificationUtil {
smallRemoteViews.setTextViewText(R.id.tv_btn, btn) smallRemoteViews.setTextViewText(R.id.tv_btn, btn)
//取消按钮 //取消按钮
bigRemoteViews.setOnClickPendingIntent(R.id.fl_cancel, cancelNotificationPendingIntent(context, actionId)) bigRemoteViews.setOnClickPendingIntent(
R.id.fl_cancel,
cancelNotificationPendingIntent(context, actionId)
)
//跳转 //跳转
val intent = Intent(context, SplashActivity::class.java) val intent = Intent(context, SplashActivity::class.java)
intent.putExtra("actionId", actionId) intent.putExtra("actionId", actionId)
val btnRequestCode = Random().nextInt(1000) val btnRequestCode = Random().nextInt(1000)
val btnPendingIntent = PendingIntent.getActivity(context, btnRequestCode, intent, PendingIntent.FLAG_IMMUTABLE) val btnPendingIntent =
PendingIntent.getActivity(context, btnRequestCode, intent, PendingIntent.FLAG_IMMUTABLE)
bigRemoteViews.setOnClickPendingIntent(R.id.fl_btn, btnPendingIntent) bigRemoteViews.setOnClickPendingIntent(R.id.fl_btn, btnPendingIntent)
smallRemoteViews.setOnClickPendingIntent(R.id.tv_btn, btnPendingIntent) smallRemoteViews.setOnClickPendingIntent(R.id.tv_btn, btnPendingIntent)
...@@ -121,7 +126,12 @@ object NotificationUtil { ...@@ -121,7 +126,12 @@ object NotificationUtil {
cancelIntent.setAction(CloseNotificationReceiver.Action) cancelIntent.setAction(CloseNotificationReceiver.Action)
cancelIntent.putExtra(CloseNotificationReceiver.NotificationId, actionId) cancelIntent.putExtra(CloseNotificationReceiver.NotificationId, actionId)
val broadcastRequestCode = Random().nextInt(1000) val broadcastRequestCode = Random().nextInt(1000)
return PendingIntent.getBroadcast(context, broadcastRequestCode, cancelIntent, PendingIntent.FLAG_IMMUTABLE) return PendingIntent.getBroadcast(
context,
broadcastRequestCode,
cancelIntent,
PendingIntent.FLAG_IMMUTABLE
)
} }
...@@ -133,7 +143,8 @@ object NotificationUtil { ...@@ -133,7 +143,8 @@ object NotificationUtil {
smallRemoteViews: RemoteViews smallRemoteViews: RemoteViews
) { ) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
//创建channel //创建channel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
...@@ -163,7 +174,8 @@ object NotificationUtil { ...@@ -163,7 +174,8 @@ object NotificationUtil {
.setContentText("notification") .setContentText("notification")
val requestCode = kotlin.random.Random.nextInt(1000) val requestCode = kotlin.random.Random.nextInt(1000)
val pendingIntent = PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_IMMUTABLE) val pendingIntent =
PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_IMMUTABLE)
builder.setContentIntent(pendingIntent) builder.setContentIntent(pendingIntent)
.setDeleteIntent(cancelNotificationPendingIntent(context, actionId)) .setDeleteIntent(cancelNotificationPendingIntent(context, actionId))
.setPriority(NotificationCompat.PRIORITY_MAX) .setPriority(NotificationCompat.PRIORITY_MAX)
...@@ -186,6 +198,7 @@ object NotificationUtil { ...@@ -186,6 +198,7 @@ object NotificationUtil {
} else { } else {
notificationManager.notify(actionId, builder.build()) notificationManager.notify(actionId, builder.build())
} }
incrementNotification()
AppPreferences.getInstance().put("last_notification_time", System.currentTimeMillis()) AppPreferences.getInstance().put("last_notification_time", System.currentTimeMillis())
} }
...@@ -193,7 +206,20 @@ object NotificationUtil { ...@@ -193,7 +206,20 @@ object NotificationUtil {
private var handlerThread: HandlerThread? = null private var handlerThread: HandlerThread? = null
private var handler: Handler? = null private var handler: Handler? = null
private fun incrementNotification() {
val key = "showNotificationCount_" + AdDisplayUtils.getInstance().getCurrentDate()
var s = AppPreferences.getInstance().getInt(key, 0)
s++
AppPreferences.getInstance().put(key, s)
}
fun sendNotification(context: Context) { fun sendNotification(context: Context) {
val currentNum = AppPreferences.getInstance().getInt("showNotificationCount_" + AdDisplayUtils.getInstance().getCurrentDate(), 0)
val maxNum = AppPreferences.getInstance().getInt("maxShowNotificationCount", 100)
if (currentNum >= maxNum) {
return
}
val actionId: Int = getNextNotificationId() val actionId: Int = getNextNotificationId()
EventUtils.event("showNotification", null, null, false) EventUtils.event("showNotification", null, null, false)
...@@ -201,7 +227,8 @@ object NotificationUtil { ...@@ -201,7 +227,8 @@ object NotificationUtil {
return return
} }
val interval: Int = AppPreferences.getInstance().getString("notificationInterval", "60").toIntOrNull() ?: 60 val interval: Int =
AppPreferences.getInstance().getString("notificationInterval", "60").toIntOrNull() ?: 60
val lastTime: Long = AppPreferences.getInstance().getLong("last_notification_time", 0) val lastTime: Long = AppPreferences.getInstance().getLong("last_notification_time", 0)
val nowTime = System.currentTimeMillis() val nowTime = System.currentTimeMillis()
val x = nowTime - lastTime val x = nowTime - lastTime
...@@ -215,7 +242,8 @@ object NotificationUtil { ...@@ -215,7 +242,8 @@ object NotificationUtil {
if (open == 1) { if (open == 1) {
val num: Int = AppPreferences.getInstance().getString("num", "0").toIntOrNull() ?: 0 val num: Int = AppPreferences.getInstance().getString("num", "0").toIntOrNull() ?: 0
val delay: Long = AppPreferences.getInstance().getString("delay", "0").toLongOrNull() ?: 0L val delay: Long =
AppPreferences.getInstance().getString("delay", "0").toLongOrNull() ?: 0L
handlerThread = HandlerThread("NotificationHandlerThread") handlerThread = HandlerThread("NotificationHandlerThread")
handlerThread!!.start() handlerThread!!.start()
......
...@@ -13,14 +13,12 @@ import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity ...@@ -13,14 +13,12 @@ import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
import com.base.datarecovery.activity.recovery.FileScanResultActivity import com.base.datarecovery.activity.recovery.FileScanResultActivity
import com.base.datarecovery.activity.repeat.RepeatAnimationActivity import com.base.datarecovery.activity.repeat.RepeatAnimationActivity
import com.base.datarecovery.activity.screenshot.ScreenShotAnimationActivity import com.base.datarecovery.activity.screenshot.ScreenShotAnimationActivity
import com.base.datarecovery.ads.AdmobNativeUtils import com.base.datarecovery.ads.admob.AdmobNativeUtils
import com.base.datarecovery.bean.ConstObject
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
import com.base.datarecovery.bean.ConstObject.privacyPinPassword import com.base.datarecovery.bean.ConstObject.privacyPinPassword
import com.base.datarecovery.databinding.FragmentHomeBinding import com.base.datarecovery.databinding.FragmentHomeBinding
import com.base.datarecovery.fcm.NotificationUtil.sendNotification
import com.base.datarecovery.help.BaseFragment import com.base.datarecovery.help.BaseFragment
class HomeFragment : BaseFragment<FragmentHomeBinding>() { class HomeFragment : BaseFragment<FragmentHomeBinding>() {
......
...@@ -11,11 +11,18 @@ object ConfigHelper { ...@@ -11,11 +11,18 @@ object ConfigHelper {
const val eventUrl = "https://rp.rocioxyn.xyz" const val eventUrl = "https://rp.rocioxyn.xyz"
const val apiUrl = "https://api.rocioxyn.xyz" const val apiUrl = "https://api.rocioxyn.xyz"
const val admobTrueMaxFlase = false
// admob广告id // admob广告id
const val interAdmobId = "ca-app-pub-3940256099942544/1033173712" const val interAdmobId = "ca-app-pub-3940256099942544/1033173712"
const val nativeAdmobId = "ca-app-pub-3940256099942544/2247696110" const val nativeAdmobId = "ca-app-pub-3940256099942544/2247696110"
const val openAdmobId = "/6499/example/app-open" const val openAdmobId = "/6499/example/app-open"
//max广告id
const val interAdMaxId = "ca-app-pub-3940256099942544/1033173712"
const val nativeAdMaxId = "YOUR_AD_UNIT_ID"
const val openAdMaxId = "/6499/example/app-open"
//一定展示大图广告 //一定展示大图广告
var mustShowNativeAd: Boolean = false var mustShowNativeAd: Boolean = false
......
package com.base.datarecovery.view package com.base.datarecovery.view
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlertDialog import android.app.AlertDialog
import android.app.Dialog import android.app.Dialog
import android.content.Context import android.content.Context
...@@ -10,32 +9,17 @@ import android.graphics.drawable.ColorDrawable ...@@ -10,32 +9,17 @@ import android.graphics.drawable.ColorDrawable
import android.view.Gravity import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import androidx.core.view.isVisible
import androidx.lifecycle.LifecycleCoroutineScope import androidx.lifecycle.LifecycleCoroutineScope
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobInterstitialUtils import com.base.datarecovery.ads.admob.AdmobInterstitialUtils.showInterAdSp
import com.base.datarecovery.ads.AdmobInterstitialUtils.showInterAdSp
import com.base.datarecovery.ads.AdmobNativeUtils
import com.base.datarecovery.bean.ConstObject.rememberOption
import com.base.datarecovery.databinding.DialogCameraSettingBinding import com.base.datarecovery.databinding.DialogCameraSettingBinding
import com.base.datarecovery.databinding.DialogDeletePermanentlyBinding import com.base.datarecovery.databinding.DialogDeletePermanentlyBinding
import com.base.datarecovery.databinding.DialogExitFunctionBinding import com.base.datarecovery.databinding.DialogExitFunctionBinding
import com.base.datarecovery.databinding.DialogImageTakeBinding import com.base.datarecovery.databinding.DialogImageTakeBinding
import com.base.datarecovery.databinding.DialogPermissionBottomsheetBinding
import com.base.datarecovery.databinding.DialogPermissonOpenBinding import com.base.datarecovery.databinding.DialogPermissonOpenBinding
import com.base.datarecovery.databinding.DialogRateStarBinding
import com.base.datarecovery.databinding.DialogRecoveringBinding import com.base.datarecovery.databinding.DialogRecoveringBinding
import com.base.datarecovery.databinding.DialogRemoveFileTipBinding import com.base.datarecovery.databinding.DialogRemoveFileTipBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.AppPreferences
import com.base.datarecovery.utils.LogEx import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.DialogViews.showCameraSettingDialog
import com.base.datarecovery.view.DialogViews.showPinReEnterDialog
import com.base.datarecovery.view.DialogViews.showRecoveringDialog
import com.base.datarecovery.view.DialogViews.showRemoveOriginalTip
import com.base.datarecovery.view.PermissionDialog.showPermissionBottomSheet
import com.base.datarecovery.view.RateStarPop.showRateStarPopDialog
import com.base.datarecovery.view.XmlEx.inflate
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
......
...@@ -3,17 +3,14 @@ package com.base.datarecovery.view ...@@ -3,17 +3,14 @@ package com.base.datarecovery.view
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.AlertDialog import android.app.AlertDialog
import android.content.Intent
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.animation.LinearInterpolator import android.view.animation.LinearInterpolator
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.activity.recovery.FileScanResultActivity import com.base.datarecovery.ads.admob.AdmobNativeUtils
import com.base.datarecovery.ads.AdmobNativeUtils
import com.base.datarecovery.databinding.DialogFileScanBinding import com.base.datarecovery.databinding.DialogFileScanBinding
import com.base.datarecovery.utils.LogEx
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxHeight="300dp"
android:padding="8dp">
<ImageView
android:id="@+id/icon_image_view"
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription"
tools:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:background="@android:color/holo_green_dark"
android:padding="2dp"
android:text="Ad"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="@+id/title_text_view"
app:layout_constraintStart_toEndOf="@+id/icon_image_view"
app:layout_constraintTop_toTopOf="@+id/title_text_view"
tools:ignore="HardcodedText" />
<FrameLayout
android:id="@+id/options_view"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginBottom="8dp"
android:orientation="horizontal"
app:layout_constraintBottom_toTopOf="@+id/advertiser_text_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/title_text_view"
app:layout_constraintTop_toTopOf="@+id/icon_image_view" />
<TextView
android:id="@+id/title_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
app:layout_constraintStart_toEndOf="@+id/text_view"
app:layout_constraintTop_toTopOf="parent"
tools:text="Title" />
<TextView
android:id="@+id/advertiser_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
app:layout_constraintBottom_toBottomOf="@+id/icon_image_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/icon_image_view"
app:layout_constraintTop_toBottomOf="@+id/title_text_view"
app:layout_constraintVertical_bias="1.0"
tools:text="Advertiser"
tools:textSize="12sp" />
<FrameLayout
android:id="@+id/star_rating_view"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="4dp"
app:layout_constraintBottom_toTopOf="@id/advertiser_text_view"
app:layout_constraintStart_toStartOf="@id/text_view"
app:layout_constraintTop_toBottomOf="@id/text_view" />
<TextView
android:id="@+id/body_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/icon_image_view"
tools:text="Body" />
<FrameLayout
android:id="@+id/media_view_container"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_marginTop="4dp"
android:maxHeight="50dp"
app:layout_constraintDimensionRatio="W,16:9"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/body_text_view" />
<Button
android:id="@+id/cta_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:backgroundTint="@color/applovin_sdk_brand_color"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/media_view_container"
tools:layout_editor_absoluteX="8dp"
tools:text="Install" />
</androidx.constraintlayout.widget.ConstraintLayout>
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