Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
D
Data Recovery White
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Data Recovery White
Commits
94c8de7b
Commit
94c8de7b
authored
Jul 16, 2024
by
leichao.gao
Committed by
wanglei
Jul 16, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
垃圾清理
parent
d80c22fe
Hide whitespace changes
Inline
Side-by-side
Showing
37 changed files
with
912 additions
and
122 deletions
+912
-122
build.gradle
app/build.gradle
+4
-0
MyApplication.kt
app/src/main/java/com/base/datarecovery/MyApplication.kt
+8
-3
ResultActivity.kt
...ain/java/com/base/datarecovery/activity/ResultActivity.kt
+2
-2
SplashActivity.kt
...ain/java/com/base/datarecovery/activity/SplashActivity.kt
+43
-18
CleanJunkActivity.kt
...base/datarecovery/activity/junkclean/CleanJunkActivity.kt
+3
-4
CleaningActivity.kt
.../base/datarecovery/activity/junkclean/CleaningActivity.kt
+1
-1
ScanJunkActivity.kt
.../base/datarecovery/activity/junkclean/ScanJunkActivity.kt
+5
-3
PrivacyManageActivity.kt
...tarecovery/activity/privacyspace/PrivacyManageActivity.kt
+1
-1
PrivacySpaceActivity.kt
...atarecovery/activity/privacyspace/PrivacySpaceActivity.kt
+1
-2
FileScanActivity.kt
...m/base/datarecovery/activity/recovery/FileScanActivity.kt
+1
-3
FileScanResultActivity.kt
.../datarecovery/activity/recovery/FileScanResultActivity.kt
+1
-7
RepeatActivity.kt
...a/com/base/datarecovery/activity/repeat/RepeatActivity.kt
+12
-5
RepeatAnimationActivity.kt
...e/datarecovery/activity/repeat/RepeatAnimationActivity.kt
+13
-10
ScreenShotActivity.kt
...se/datarecovery/activity/screenshot/ScreenShotActivity.kt
+3
-3
ScreenShotAnimationActivity.kt
...covery/activity/screenshot/ScreenShotAnimationActivity.kt
+1
-2
WhatsAppCleanerActivity.kt
...datarecovery/activity/whatsapp/WhatsAppCleanerActivity.kt
+2
-2
WhatsAppMessageCleanActivity.kt
...ecovery/activity/whatsapp/WhatsAppMessageCleanActivity.kt
+2
-2
AdDisplayUtils.java
...c/main/java/com/base/datarecovery/ads/AdDisplayUtils.java
+2
-2
AdmobMaxHelper.kt
...src/main/java/com/base/datarecovery/ads/AdmobMaxHelper.kt
+21
-0
AdmobCommonUtils.kt
.../java/com/base/datarecovery/ads/admob/AdmobCommonUtils.kt
+2
-1
AdmobEvent.kt
...c/main/java/com/base/datarecovery/ads/admob/AdmobEvent.kt
+1
-1
AdmobInterstitialUtils.kt
...com/base/datarecovery/ads/admob/AdmobInterstitialUtils.kt
+6
-5
AdmobNativeUtils.kt
.../java/com/base/datarecovery/ads/admob/AdmobNativeUtils.kt
+6
-5
AdmobOpenUtils.kt
...in/java/com/base/datarecovery/ads/admob/AdmobOpenUtils.kt
+6
-5
NativeView.kt
...c/main/java/com/base/datarecovery/ads/admob/NativeView.kt
+1
-1
AdMaxEvent.kt
...src/main/java/com/base/datarecovery/ads/max/AdMaxEvent.kt
+53
-0
AdMaxInit.kt
app/src/main/java/com/base/datarecovery/ads/max/AdMaxInit.kt
+43
-0
AdMaxInterstitialUtils.kt
...a/com/base/datarecovery/ads/max/AdMaxInterstitialUtils.kt
+203
-0
AdMaxNativeUtils.kt
...in/java/com/base/datarecovery/ads/max/AdMaxNativeUtils.kt
+147
-0
AdMaxOpenUtils.kt
...main/java/com/base/datarecovery/ads/max/AdMaxOpenUtils.kt
+159
-0
MessagingService.java
...main/java/com/base/datarecovery/fcm/MessagingService.java
+0
-3
NotificationUtil.kt
...c/main/java/com/base/datarecovery/fcm/NotificationUtil.kt
+35
-7
HomeFragment.kt
.../main/java/com/base/datarecovery/fragment/HomeFragment.kt
+1
-3
ConfigHelper.kt
app/src/main/java/com/base/datarecovery/help/ConfigHelper.kt
+7
-0
DialogViews.kt
app/src/main/java/com/base/datarecovery/view/DialogViews.kt
+1
-17
FileScanDialog.kt
...rc/main/java/com/base/datarecovery/view/FileScanDialog.kt
+1
-4
layout_max_native_custom.xml
app/src/main/res/layout/layout_max_native_custom.xml
+114
-0
No files found.
app/build.gradle
View file @
94c8de7b
...
@@ -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
app/src/main/java/com/base/datarecovery/MyApplication.kt
View file @
94c8de7b
...
@@ -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
)
{
...
...
app/src/main/java/com/base/datarecovery/activity/ResultActivity.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/java/com/base/datarecovery/activity/SplashActivity.kt
View file @
94c8de7b
...
@@ -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"
)
}
}
...
...
app/src/main/java/com/base/datarecovery/activity/junkclean/CleanJunkActivity.kt
View file @
94c8de7b
...
@@ -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.Admob
InterstitialUtils
import
com.base.datarecovery.ads.Admob
MaxHelper
import
com.base.datarecovery.ads.
AdmobNative
Utils
import
com.base.datarecovery.ads.
admob.AdmobInterstitial
Utils
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
)
{
Admob
InterstitialUtils
.
showInterstitialAd
(
this
@CleanJunkActivity
)
{
Admob
MaxHelper
.
admobMaxShowInterstitialAd
(
this
@CleanJunkActivity
)
{
finishToMain
()
finishToMain
()
}
}
}
else
{
}
else
{
...
...
app/src/main/java/com/base/datarecovery/activity/junkclean/CleaningActivity.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/java/com/base/datarecovery/activity/junkclean/ScanJunkActivity.kt
View file @
94c8de7b
...
@@ -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
()
...
...
app/src/main/java/com/base/datarecovery/activity/privacyspace/PrivacyManageActivity.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/java/com/base/datarecovery/activity/privacyspace/PrivacySpaceActivity.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/java/com/base/datarecovery/activity/recovery/FileScanActivity.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/java/com/base/datarecovery/activity/recovery/FileScanResultActivity.kt
View file @
94c8de7b
...
@@ -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
>()
{
...
...
app/src/main/java/com/base/datarecovery/activity/repeat/RepeatActivity.kt
View file @
94c8de7b
...
@@ -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
()
...
...
app/src/main/java/com/base/datarecovery/activity/repeat/RepeatAnimationActivity.kt
View file @
94c8de7b
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
))
}
}
...
...
app/src/main/java/com/base/datarecovery/activity/screenshot/ScreenShotActivity.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/java/com/base/datarecovery/activity/screenshot/ScreenShotAnimationActivity.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/java/com/base/datarecovery/activity/whatsapp/WhatsAppCleanerActivity.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/java/com/base/datarecovery/activity/whatsapp/WhatsAppMessageCleanActivity.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/java/com/base/datarecovery/ads/AdDisplayUtils.java
View file @
94c8de7b
...
@@ -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
();
}
}
p
rivate
String
getCurrentDate
()
{
p
ublic
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
);
...
...
app/src/main/java/com/base/datarecovery/ads/AdmobMaxHelper.kt
0 → 100644
View file @
94c8de7b
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
app/src/main/java/com/base/datarecovery/ads/AdmobCommonUtils.kt
→
app/src/main/java/com/base/datarecovery/ads/
admob/
AdmobCommonUtils.kt
View file @
94c8de7b
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
{
...
...
app/src/main/java/com/base/datarecovery/ads/AdmobEvent.kt
→
app/src/main/java/com/base/datarecovery/ads/
admob/
AdmobEvent.kt
View file @
94c8de7b
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
...
...
app/src/main/java/com/base/datarecovery/ads/AdmobInterstitialUtils.kt
→
app/src/main/java/com/base/datarecovery/ads/
admob/
AdmobInterstitialUtils.kt
View file @
94c8de7b
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
...
...
app/src/main/java/com/base/datarecovery/ads/AdmobNativeUtils.kt
→
app/src/main/java/com/base/datarecovery/ads/
admob/
AdmobNativeUtils.kt
View file @
94c8de7b
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
...
...
app/src/main/java/com/base/datarecovery/ads/AdmobOpenUtils.kt
→
app/src/main/java/com/base/datarecovery/ads/
admob/
AdmobOpenUtils.kt
View file @
94c8de7b
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
...
...
app/src/main/java/com/base/datarecovery/ads/NativeView.kt
→
app/src/main/java/com/base/datarecovery/ads/
admob/
NativeView.kt
View file @
94c8de7b
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
...
...
app/src/main/java/com/base/datarecovery/ads/max/AdMaxEvent.kt
0 → 100644
View file @
94c8de7b
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
app/src/main/java/com/base/datarecovery/ads/max/AdMaxInit.kt
0 → 100644
View file @
94c8de7b
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
app/src/main/java/com/base/datarecovery/ads/max/AdMaxInterstitialUtils.kt
0 → 100644
View file @
94c8de7b
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
app/src/main/java/com/base/datarecovery/ads/max/AdMaxNativeUtils.kt
0 → 100644
View file @
94c8de7b
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
app/src/main/java/com/base/datarecovery/ads/max/AdMaxOpenUtils.kt
0 → 100644
View file @
94c8de7b
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
()
}
}
}
app/src/main/java/com/base/datarecovery/fcm/MessagingService.java
View file @
94c8de7b
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
;
...
...
app/src/main/java/com/base/datarecovery/fcm/NotificationUtil.kt
View file @
94c8de7b
...
@@ -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
()
...
...
app/src/main/java/com/base/datarecovery/fragment/HomeFragment.kt
View file @
94c8de7b
...
@@ -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
>()
{
...
...
app/src/main/java/com/base/datarecovery/help/ConfigHelper.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/java/com/base/datarecovery/view/DialogViews.kt
View file @
94c8de7b
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
...
...
app/src/main/java/com/base/datarecovery/view/FileScanDialog.kt
View file @
94c8de7b
...
@@ -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
...
...
app/src/main/res/layout/layout_max_native_custom.xml
0 → 100644
View file @
94c8de7b
<?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>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment