Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
F
File Recovery RecycleBin
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
File Recovery RecycleBin
Commits
230eb832
Commit
230eb832
authored
Mar 13, 2025
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
c1d33939
Hide whitespace changes
Inline
Side-by-side
Showing
43 changed files
with
1671 additions
and
1857 deletions
+1671
-1857
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+10
-74
AppManagerActivity.kt
...overyrecyclebin/activity/appmanager/AppManagerActivity.kt
+0
-130
AppManagerAnimationActivity.kt
...clebin/activity/appmanager/AppManagerAnimationActivity.kt
+0
-71
AppProcessActivity.kt
...overyrecyclebin/activity/appprocess/AppProcessActivity.kt
+0
-113
AppProcessAnimationActivity.kt
...clebin/activity/appprocess/AppProcessAnimationActivity.kt
+0
-71
GuideActivity.kt
...se/filerecoveryrecyclebin/activity/guide/GuideActivity.kt
+26
-24
StartUtils.kt
...base/filerecoveryrecyclebin/activity/splash/StartUtils.kt
+3
-24
WhatsAppCleanerActivity.kt
...ryrecyclebin/activity/whatsapp/WhatsAppCleanerActivity.kt
+0
-183
WhatsAppCleanerAnimationActivity.kt
...bin/activity/whatsapp/WhatsAppCleanerAnimationActivity.kt
+0
-76
WhatsAppMessageCleanActivity.kt
...yclebin/activity/whatsapp/WhatsAppMessageCleanActivity.kt
+0
-107
AdCommonUtils.kt
...java/com/base/filerecoveryrecyclebin/ads/AdCommonUtils.kt
+0
-27
AdmobMaxHelper.kt
...ava/com/base/filerecoveryrecyclebin/ads/AdmobMaxHelper.kt
+57
-56
AdmobBannerColla.kt
...base/filerecoveryrecyclebin/ads/admob/AdmobBannerColla.kt
+4
-0
AdMaxEvent.kt
...ava/com/base/filerecoveryrecyclebin/ads/max/AdMaxEvent.kt
+144
-144
AdMaxInit.kt
...java/com/base/filerecoveryrecyclebin/ads/max/AdMaxInit.kt
+54
-48
AdMaxInterstitialUtils.kt
.../filerecoveryrecyclebin/ads/max/AdMaxInterstitialUtils.kt
+281
-196
AdMaxNativeUtils.kt
...m/base/filerecoveryrecyclebin/ads/max/AdMaxNativeUtils.kt
+164
-160
AdMaxOpenUtils.kt
...com/base/filerecoveryrecyclebin/ads/max/AdMaxOpenUtils.kt
+277
-179
ConstObject.kt
.../java/com/base/filerecoveryrecyclebin/bean/ConstObject.kt
+0
-5
GuideFragment.kt
...com/base/filerecoveryrecyclebin/fragment/GuideFragment.kt
+35
-45
bg_4676ff_69.xml
app/src/main/res/drawable/bg_4676ff_69.xml
+7
-0
bg_ebf3ff_16.xml
app/src/main/res/drawable/bg_ebf3ff_16.xml
+7
-0
bg_loadingads.xml
app/src/main/res/drawable/bg_loadingads.xml
+6
-0
bg_select_yuan.xml
app/src/main/res/drawable/bg_select_yuan.xml
+5
-0
activity_which_want_guide.xml
app/src/main/res/layout/activity_which_want_guide.xml
+223
-0
dialog_loading.xml
app/src/main/res/layout/dialog_loading.xml
+65
-0
fragment_guide.xml
app/src/main/res/layout/fragment_guide.xml
+58
-124
fragment_native_full.xml
app/src/main/res/layout/fragment_native_full.xml
+30
-0
layout_max_native_full.xml
app/src/main/res/layout/layout_max_native_full.xml
+105
-0
layout_native_full.xml
app/src/main/res/layout/layout_native_full.xml
+110
-0
dian1.png
app/src/main/res/mipmap-xxhdpi/dian1.png
+0
-0
dian2.png
app/src/main/res/mipmap-xxhdpi/dian2.png
+0
-0
dian3.png
app/src/main/res/mipmap-xxhdpi/dian3.png
+0
-0
icon_audio.png
app/src/main/res/mipmap-xxhdpi/icon_audio.png
+0
-0
icon_document.png
app/src/main/res/mipmap-xxhdpi/icon_document.png
+0
-0
icon_photo.png
app/src/main/res/mipmap-xxhdpi/icon_photo.png
+0
-0
icon_video.png
app/src/main/res/mipmap-xxhdpi/icon_video.png
+0
-0
icon_yuan_n.png
app/src/main/res/mipmap-xxhdpi/icon_yuan_n.png
+0
-0
icon_yuan_s.png
app/src/main/res/mipmap-xxhdpi/icon_yuan_s.png
+0
-0
yindaotu1.png
app/src/main/res/mipmap-xxhdpi/yindaotu1.png
+0
-0
yindaotu2.png
app/src/main/res/mipmap-xxhdpi/yindaotu2.png
+0
-0
yindaotu3.png
app/src/main/res/mipmap-xxhdpi/yindaotu3.png
+0
-0
zhuanquan.png
app/src/main/res/mipmap-xxhdpi/zhuanquan.png
+0
-0
No files found.
app/src/main/AndroidManifest.xml
View file @
230eb832
...
...
@@ -47,18 +47,6 @@
<category
android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity
android:name=
".activity.appmanager.AppManagerActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.appmanager.AppManagerAnimationActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.battery.BatteryInfoAnimationActivity"
android:exported=
"false"
...
...
@@ -83,18 +71,6 @@
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.appprocess.AppProcessAnimationActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.appprocess.AppProcessActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.photomanager.PhotoManagerAnimationActivity"
android:exported=
"false"
...
...
@@ -178,47 +154,6 @@
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.whatsapp.WhatsAppCleanerActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.whatsapp.WhatsAppCleanerAnimationActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.whatsapp.WhatsAppMessageCleanActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<!-- <activity -->
<!-- android:name=".activity.privacyspace.PrivacyPinTwoActivity" -->
<!-- android:exported="false" -->
<!-- android:launchMode="singleTop" -->
<!-- android:screenOrientation="portrait" -->
<!-- tools:ignore="DiscouragedApi,LockedOrientationActivity" /> -->
<!-- <activity -->
<!-- android:name=".activity.privacyspace.PrivacyPinOneActivity" -->
<!-- android:exported="false" -->
<!-- android:launchMode="singleTop" -->
<!-- android:screenOrientation="portrait" -->
<!-- tools:ignore="DiscouragedApi,LockedOrientationActivity" /> -->
<!-- <activity -->
<!-- android:name=".activity.privacyspace.PrivacyImportActivity" -->
<!-- android:exported="false" -->
<!-- android:launchMode="singleTop" -->
<!-- android:screenOrientation="portrait" -->
<!-- tools:ignore="DiscouragedApi,LockedOrientationActivity" /> -->
<!-- <activity -->
<!-- android:name=".activity.privacyspace.PrivacySpaceActivity" -->
<!-- android:exported="false" -->
<!-- android:launchMode="singleTop" -->
<!-- android:screenOrientation="portrait" -->
<!-- tools:ignore="DiscouragedApi,LockedOrientationActivity" /> -->
<activity
android:name=
".activity.recovery.FileRecoveredActivity"
android:exported=
"false"
...
...
@@ -239,19 +174,24 @@
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".fragment.WebBrowserActivity"
android:screenOrientation=
"portrait"
/>
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.junkclean.ScanJunk2Activity"
android:screenOrientation=
"portrait"
/>
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".view.WeatherInterface"
android:screenOrientation=
"portrait"
/>
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.guide.CleanGuideActivity"
android:screenOrientation=
"portrait"
/>
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.XzLoadingActivity"
android:screenOrientation=
"portrait"
/>
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<meta-data
android:name=
"com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"
...
...
@@ -262,10 +202,6 @@
<meta-data
android:name=
"com.google.android.gms.ads.flag.NATIVE_AD_DEBUGGER_ENABLED"
android:value=
"false"
/>
<!-- 常驻通知栏 -->
<!-- <service-->
<!-- android:name=".service.StayNotificationService"-->
<!-- android:foregroundServiceType="dataSync" />-->
<service
android:name=
".service.StayJobService"
android:exported=
"false"
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/appmanager/AppManagerActivity.kt
deleted
100644 → 0
View file @
c1d33939
package
com.base.filerecoveryrecyclebin.activity.appmanager
import
android.annotation.SuppressLint
import
android.content.Context
import
android.content.Intent
import
android.content.pm.ApplicationInfo
import
android.content.pm.PackageInfo
import
android.graphics.Color
import
android.net.Uri
import
android.view.View
import
androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.adapter.AppManagerAdapter
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.bean.AppBean
import
com.base.filerecoveryrecyclebin.databinding.ActivityAppManagerBinding
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
com.base.filerecoveryrecyclebin.utils.BarUtils
import
com.base.filerecoveryrecyclebin.utils.RamUtils.ramPair
import
com.base.filerecoveryrecyclebin.view.DialogViews.showExitFunctionDialog
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
class
AppManagerActivity
:
BaseActivity
<
ActivityAppManagerBinding
>()
{
var
uninstallTimes
=
0
override
val
binding
:
ActivityAppManagerBinding
by
lazy
{
ActivityAppManagerBinding
.
inflate
(
layoutInflater
)
}
private
lateinit
var
adapter
:
AppManagerAdapter
private
var
ePercent
=
0
@SuppressLint
(
"SetTextI18n"
)
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
binding
.
root
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
val
ramPair
=
ramPair
()
val
percent
=
((
ramPair
.
first
.
toFloat
()
/
ramPair
.
second
.
toFloat
())
*
100
).
toInt
()
ePercent
=
percent
adapter
=
AppManagerAdapter
(
true
)
{
pkg
->
if
(
uninstallTimes
%
3
==
0
&&
uninstallTimes
>
0
)
{
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
,
isLoading
=
false
)
{
unInstall
(
pkg
)
}
}
else
{
unInstall
(
pkg
)
}
}
binding
.
rv
.
adapter
=
adapter
initData
()
}
private
fun
unInstall
(
pkg
:
String
)
{
val
intent
=
Intent
(
Intent
.
ACTION_DELETE
,
Uri
.
parse
(
"package:${pkg}"
))
launcher
.
launch
(
intent
)
{
if
(!
isInstalled
(
this
,
pkg
))
{
adapter
.
removeBean
(
pkg
)
uninstallTimes
++
}
}
}
private
fun
isInstalled
(
context
:
Context
,
pkg
:
String
,
error
:
(()
->
Unit
)?
=
null
):
Boolean
{
return
try
{
context
.
packageManager
.
getPackageInfo
(
pkg
,
0
)
true
}
catch
(
e
:
Exception
)
{
error
?.
invoke
()
false
}
}
override
fun
initListener
()
{
super
.
initListener
()
onBackPressedDispatcher
.
addCallback
{
showExitFunctionDialog
(
this
@AppManagerActivity
){
showAd
->
if
(
showAd
){
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
@AppManagerActivity
,
isLoading
=
false
)
{
finishToMain
()
}
}
else
{
finishToMain
()
}
}
}
binding
.
flFanhui
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
}
@SuppressLint
(
"QueryPermissionsNeeded"
)
private
fun
initData
()
=
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
val
pm
=
packageManager
val
packages
=
pm
.
getInstalledPackages
(
0
)
val
list
=
arrayListOf
<
AppBean
>()
packages
.
forEach
{
app
->
if
(
isLaunchApp
(
this
@AppManagerActivity
,
app
))
{
val
appBean
=
AppBean
(
app
.
applicationInfo
.
loadIcon
(
pm
),
app
.
applicationInfo
.
loadLabel
(
pm
).
toString
(),
app
.
applicationInfo
.
packageName
)
list
.
add
(
appBean
)
}
}
launch
(
Dispatchers
.
Main
)
{
binding
.
pbLoading
.
visibility
=
View
.
GONE
adapter
.
setData
(
list
)
}
}
private
fun
isLaunchApp
(
context
:
Context
,
app
:
PackageInfo
,
filterSystem
:
Boolean
=
true
):
Boolean
{
val
flagSystem
=
(
app
.
applicationInfo
.
flags
and
ApplicationInfo
.
FLAG_SYSTEM
)
<
1
val
flag
=
if
(
filterSystem
)
flagSystem
else
true
return
flag
&&
app
.
applicationInfo
.
packageName
!=
context
.
packageName
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/activity/appmanager/AppManagerAnimationActivity.kt
deleted
100644 → 0
View file @
c1d33939
package
com.base.filerecoveryrecyclebin.activity.appmanager
import
android.annotation.SuppressLint
import
android.content.Intent
import
android.view.View
import
android.widget.Toast
import
androidx.activity.addCallback
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.databinding.ActivityAppProcessAnimationBinding
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Job
import
kotlinx.coroutines.delay
import
kotlinx.coroutines.launch
import
kotlin.random.Random
class
AppManagerAnimationActivity
:
BaseActivity
<
ActivityAppProcessAnimationBinding
>()
{
override
val
binding
:
ActivityAppProcessAnimationBinding
by
lazy
{
ActivityAppProcessAnimationBinding
.
inflate
(
layoutInflater
)
}
private
var
job
:
Job
?
=
null
override
fun
initView
()
{
playLottie
()
AdmobMaxHelper
.
admobMaxShowNativeAd
(
this
,
binding
.
idFlNative
)
}
override
fun
initListener
()
{
onBackPressedDispatcher
.
addCallback
{
Toast
.
makeText
(
this
@AppManagerAnimationActivity
,
"wait a moment"
,
Toast
.
LENGTH_SHORT
).
show
()
}
}
@SuppressLint
(
"SetTextI18n"
)
private
fun
playLottie
()
{
binding
.
lottie
.
imageAssetsFolder
=
"app_manager/images/"
binding
.
lottie
.
setAnimation
(
"app_manager/data.json"
)
binding
.
lottie
.
playAnimation
()
}
@SuppressLint
(
"SetTextI18n"
)
fun
jumpJob
()
=
lifecycleScope
.
launch
(
Dispatchers
.
Main
)
{
delay
(
Random
.
nextLong
(
4000
,
6000
))
binding
.
lottie
.
visibility
=
View
.
GONE
binding
.
lottieCompleted
.
visibility
=
View
.
VISIBLE
binding
.
lottieCompleted
.
playAnimation
()
binding
.
tv
.
text
=
"Completed!"
delay
(
1000
)
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
@AppManagerAnimationActivity
)
{
startActivity
(
Intent
(
this
@AppManagerAnimationActivity
,
AppManagerActivity
::
class
.
java
))
finish
()
}
}
override
fun
onResume
()
{
super
.
onResume
()
if
(
job
?.
isActive
==
false
||
job
==
null
)
{
job
=
jumpJob
()
}
}
override
fun
onPause
()
{
super
.
onPause
()
job
?.
cancel
()
job
=
null
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/activity/appprocess/AppProcessActivity.kt
deleted
100644 → 0
View file @
c1d33939
package
com.base.filerecoveryrecyclebin.activity.appprocess
import
android.annotation.SuppressLint
import
android.content.Context
import
android.content.Intent
import
android.content.pm.ApplicationInfo
import
android.content.pm.PackageInfo
import
android.graphics.Color
import
android.net.Uri
import
android.provider.Settings
import
android.view.View
import
androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.adapter.AppManagerAdapter
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.showBackInterAdSp
import
com.base.filerecoveryrecyclebin.bean.AppBean
import
com.base.filerecoveryrecyclebin.databinding.ActivityAppProcessBinding
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatSize
import
com.base.filerecoveryrecyclebin.utils.BarUtils
import
com.base.filerecoveryrecyclebin.utils.RamUtils.ramPair
import
com.base.filerecoveryrecyclebin.view.DialogViews.showAppProcessExitDialog
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
class
AppProcessActivity
:
BaseActivity
<
ActivityAppProcessBinding
>()
{
override
val
binding
:
ActivityAppProcessBinding
by
lazy
{
ActivityAppProcessBinding
.
inflate
(
layoutInflater
)
}
private
lateinit
var
adapter
:
AppManagerAdapter
private
var
ePercent
=
0
@SuppressLint
(
"SetTextI18n"
)
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
binding
.
root
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
val
ramPair
=
ramPair
()
val
percent
=
((
ramPair
.
first
.
toFloat
()
/
ramPair
.
second
.
toFloat
())
*
100
).
toInt
()
ePercent
=
percent
binding
.
tvPercent
.
text
=
percent
.
toString
()
binding
.
pbRam
.
progress
=
percent
binding
.
tvSize
.
text
=
"${ramPair.first.toFormatSize()}/${ramPair.second.toFormatSize()}"
adapter
=
AppManagerAdapter
{
pkg
->
val
intent
=
Intent
(
Settings
.
ACTION_APPLICATION_DETAILS_SETTINGS
)
val
uri
=
Uri
.
fromParts
(
"package"
,
pkg
,
null
)
// 替换为需要跳转的应用包名
intent
.
setData
(
uri
)
startActivity
(
intent
)
}
binding
.
rv
.
adapter
=
adapter
initData
()
}
override
fun
initListener
()
{
super
.
initListener
()
onBackPressedDispatcher
.
addCallback
{
showAppProcessExitDialog
(
ePercent
)
{
if
(
showBackInterAdSp
())
{
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
@AppProcessActivity
,
false
)
{
finishToMain
()
}
}
else
{
finishToMain
()
}
}
}
binding
.
flFanhui
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
}
@SuppressLint
(
"QueryPermissionsNeeded"
)
private
fun
initData
()
=
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
val
pm
=
packageManager
val
packages
=
pm
.
getInstalledPackages
(
0
)
val
list
=
arrayListOf
<
AppBean
>()
packages
.
forEach
{
app
->
if
(
isLaunchApp
(
this
@AppProcessActivity
,
app
))
{
val
appBean
=
AppBean
(
app
.
applicationInfo
.
loadIcon
(
pm
),
app
.
applicationInfo
.
loadLabel
(
pm
).
toString
(),
app
.
applicationInfo
.
packageName
)
list
.
add
(
appBean
)
}
}
launch
(
Dispatchers
.
Main
)
{
binding
.
pbLoading
.
visibility
=
View
.
GONE
adapter
.
setData
(
list
)
}
}
private
fun
isLaunchApp
(
context
:
Context
,
app
:
PackageInfo
,
filterSystem
:
Boolean
=
true
):
Boolean
{
val
flagSystem
=
(
app
.
applicationInfo
.
flags
and
ApplicationInfo
.
FLAG_SYSTEM
)
<
1
val
flag
=
if
(
filterSystem
)
flagSystem
else
true
return
flag
&&
app
.
applicationInfo
.
packageName
!=
context
.
packageName
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/activity/appprocess/AppProcessAnimationActivity.kt
deleted
100644 → 0
View file @
c1d33939
package
com.base.filerecoveryrecyclebin.activity.appprocess
import
android.annotation.SuppressLint
import
android.content.Intent
import
android.view.View
import
android.widget.Toast
import
androidx.activity.addCallback
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.databinding.ActivityAppProcessAnimationBinding
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Job
import
kotlinx.coroutines.delay
import
kotlinx.coroutines.launch
import
kotlin.random.Random
class
AppProcessAnimationActivity
:
BaseActivity
<
ActivityAppProcessAnimationBinding
>()
{
override
val
binding
:
ActivityAppProcessAnimationBinding
by
lazy
{
ActivityAppProcessAnimationBinding
.
inflate
(
layoutInflater
)
}
private
var
job
:
Job
?
=
null
override
fun
initView
()
{
playLottie
()
AdmobMaxHelper
.
admobMaxShowNativeAd
(
this
,
binding
.
idFlNative
)
}
override
fun
initListener
()
{
onBackPressedDispatcher
.
addCallback
{
Toast
.
makeText
(
this
@AppProcessAnimationActivity
,
"wait a moment"
,
Toast
.
LENGTH_SHORT
).
show
()
}
}
@SuppressLint
(
"SetTextI18n"
)
private
fun
playLottie
()
{
binding
.
lottie
.
imageAssetsFolder
=
"app_manager/images/"
binding
.
lottie
.
setAnimation
(
"app_manager/data.json"
)
binding
.
lottie
.
playAnimation
()
}
@SuppressLint
(
"SetTextI18n"
)
fun
jumpJob
()
=
lifecycleScope
.
launch
(
Dispatchers
.
Main
)
{
delay
(
Random
.
nextLong
(
4000
,
6000
))
binding
.
lottie
.
visibility
=
View
.
GONE
binding
.
lottieCompleted
.
visibility
=
View
.
VISIBLE
binding
.
lottieCompleted
.
playAnimation
()
binding
.
tv
.
text
=
"Completed!"
delay
(
1000
)
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
@AppProcessAnimationActivity
)
{
startActivity
(
Intent
(
this
@AppProcessAnimationActivity
,
AppProcessActivity
::
class
.
java
))
finish
()
}
}
override
fun
onResume
()
{
super
.
onResume
()
if
(
job
?.
isActive
==
false
||
job
==
null
)
{
job
=
jumpJob
()
}
}
override
fun
onPause
()
{
super
.
onPause
()
job
?.
cancel
()
job
=
null
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/activity/guide/GuideActivity.kt
View file @
230eb832
...
...
@@ -2,35 +2,35 @@ package com.base.filerecoveryrecyclebin.activity.guide
import
android.content.Intent
import
android.graphics.Color
import
androidx.core.content.ContextCompat
import
androidx.fragment.app.Fragment
import
androidx.viewpager2.adapter.FragmentStateAdapter
import
androidx.viewpager2.widget.ViewPager2
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.databinding.ActivityGuideBinding
import
com.base.filerecoveryrecyclebin.fragment.GuideFragment
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
com.base.filerecoveryrecyclebin.help.PermissionHelp.requestStorePermission
import
com.base.filerecoveryrecyclebin.utils.BarUtils
import
com.zhpan.indicator.enums.IndicatorSlideMode
import
com.zhpan.indicator.enums.IndicatorStyle
class
GuideActivity
:
BaseActivity
<
ActivityGuideBinding
>()
{
private
val
page1
:
GuideFragment
by
lazy
{
GuideFragment
().
apply
{
page
=
1
}
GuideFragment
().
apply
{
page
=
0
}
}
private
val
page2
:
GuideFragment
by
lazy
{
GuideFragment
().
apply
{
page
=
2
}
GuideFragment
().
apply
{
page
=
1
}
}
private
val
pageNative
:
NativeFullFragment
by
lazy
{
NativeFullFragment
()
}
private
val
page3
:
GuideFragment
by
lazy
{
GuideFragment
().
apply
{
page
=
3
}
}
private
val
fragments
by
lazy
{
mutableListOf
(
page1
,
page2
,
page3
)
mutableListOf
(
page1
,
page2
,
page
Native
,
page
3
)
}
private
var
currentIndex
=
0
override
val
binding
:
ActivityGuideBinding
by
lazy
{
ActivityGuideBinding
.
inflate
(
layoutInflater
)
...
...
@@ -44,7 +44,7 @@ class GuideActivity : BaseActivity<ActivityGuideBinding>() {
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
AdmobMaxHelper
.
admobMaxShowNativeAd
(
this
,
binding
.
idFlNative
)
binding
.
viewpager2
.
run
{
adapter
=
object
:
FragmentStateAdapter
(
this
@GuideActivity
)
{
override
fun
getItemCount
():
Int
{
...
...
@@ -59,25 +59,27 @@ class GuideActivity : BaseActivity<ActivityGuideBinding>() {
binding
.
viewpager2
.
registerOnPageChangeCallback
(
object
:
ViewPager2
.
OnPageChangeCallback
()
{
override
fun
onPageSelected
(
position
:
Int
)
{
currentIndex
=
position
}
})
val
normalColor
=
ContextCompat
.
getColor
(
this
,
R
.
color
.
color_cccccc
)
val
selectedColor
=
ContextCompat
.
getColor
(
this
,
R
.
color
.
color_4f86eb
)
binding
.
indicatorView
.
setSliderColor
(
normalColor
,
selectedColor
)
.
setSliderWidth
(
resources
.
getDimension
(
R
.
dimen
.
dp_9
))
.
setSliderHeight
(
resources
.
getDimension
(
R
.
dimen
.
dp_9
))
.
setSlideMode
(
IndicatorSlideMode
.
WORM
)
.
setIndicatorStyle
(
IndicatorStyle
.
CIRCLE
)
.
setupWithViewPager
(
binding
.
viewpager2
)
}
fun
lauchPermisson
()
{
startActivity
(
Intent
(
this
,
CleanGuideActivity
::
class
.
java
))
finish
()
requestStorePermission
(
launcher
)
{
fun
next
(
page
:
Int
)
{
if
(
page
==
0
)
{
binding
.
viewpager2
.
currentItem
=
1
return
}
if
(
page
==
1
)
{
binding
.
viewpager2
.
currentItem
=
2
return
}
if
(
page
==
3
)
{
startActivity
(
Intent
(
this
,
CleanGuideActivity
::
class
.
java
))
finish
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/activity/splash/StartUtils.kt
View file @
230eb832
...
...
@@ -5,17 +5,12 @@ import android.content.Intent
import
android.util.Log
import
com.base.filerecoveryrecyclebin.activity.MainActivity
import
com.base.filerecoveryrecyclebin.activity.XzLoadingActivity
import
com.base.filerecoveryrecyclebin.activity.appmanager.AppManagerAnimationActivity
import
com.base.filerecoveryrecyclebin.activity.appprocess.AppProcessAnimationActivity
import
com.base.filerecoveryrecyclebin.activity.battery.BatteryInfoAnimationActivity
import
com.base.filerecoveryrecyclebin.activity.guide.GuideActivity
import
com.base.filerecoveryrecyclebin.activity.guide.
WhichWant
GuideActivity
import
com.base.filerecoveryrecyclebin.activity.junkclean.ScanJunkActivity
import
com.base.filerecoveryrecyclebin.activity.photomanager.PhotoManagerAnimationActivity
import
com.base.filerecoveryrecyclebin.activity.recovery.FileScanResultActivity
import
com.base.filerecoveryrecyclebin.activity.whatsapp.WhatsAppCleanerAnimationActivity
import
com.base.filerecoveryrecyclebin.bean.ConstObject
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_APP_MANAGER
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_APP_PROCESS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_BATTERY_INFO
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_JUNK_CLEAN_PUSH
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_DOCUMENTS
...
...
@@ -23,7 +18,6 @@ import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_PHOTOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_VIDEOS
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_SCREENSHOT_CLEAN
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_SIMILAR_IMAGE
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_WHATSAPP
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_WHEATHER
import
com.base.filerecoveryrecyclebin.bean.ConstObject.ID_XINGZUO
import
com.base.filerecoveryrecyclebin.bean.ConstObject.isGuide
...
...
@@ -50,37 +44,21 @@ object StartUtils {
ID_JUNK_CLEAN_PUSH
->
{
context
.
startActivity
(
Intent
(
context
,
ScanJunkActivity
::
class
.
java
))
}
ID_SIMILAR_IMAGE
->
{
context
.
startActivity
(
Intent
(
context
,
PhotoManagerAnimationActivity
::
class
.
java
))
}
ID_SCREENSHOT_CLEAN
->
{
context
.
startActivity
(
Intent
(
context
,
PhotoManagerAnimationActivity
::
class
.
java
))
}
ID_RECOVERY_PHOTOS
->
{
context
.
startActivity
(
Intent
(
context
,
FileScanResultActivity
::
class
.
java
).
putExtra
(
"ScanType"
,
ConstObject
.
SCAN_PHOTOS
))
}
ID_RECOVERY_VIDEOS
->
{
context
.
startActivity
(
Intent
(
context
,
FileScanResultActivity
::
class
.
java
).
putExtra
(
"ScanType"
,
ConstObject
.
SCAN_VIDEOS
))
}
ID_RECOVERY_DOCUMENTS
->
{
context
.
startActivity
(
Intent
(
context
,
FileScanResultActivity
::
class
.
java
).
putExtra
(
"ScanType"
,
ConstObject
.
SCAN_DOCUMENTS
))
}
ID_WHATSAPP
->
{
context
.
startActivity
(
Intent
(
context
,
WhatsAppCleanerAnimationActivity
::
class
.
java
))
}
ID_APP_PROCESS
->{
context
.
startActivity
(
Intent
(
context
,
AppProcessAnimationActivity
::
class
.
java
))
}
ID_APP_MANAGER
->{
context
.
startActivity
(
Intent
(
context
,
AppManagerAnimationActivity
::
class
.
java
))
}
ID_BATTERY_INFO
->
{
context
.
startActivity
(
Intent
(
context
,
BatteryInfoAnimationActivity
::
class
.
java
))
}
...
...
@@ -98,7 +76,8 @@ object StartUtils {
val
isHotLaunch
=
context
.
intent
?.
extras
?.
getBoolean
(
"isHotLaunch"
,
false
)
?:
false
if
(!
isHotLaunch
)
{
if
(!
isGuide
)
{
context
.
startActivity
(
Intent
(
context
,
GuideActivity
::
class
.
java
))
// context.startActivity(Intent(context, GuideActivity::class.java))
context
.
startActivity
(
Intent
(
context
,
WhichWantGuideActivity
::
class
.
java
))
isGuide
=
true
}
else
{
context
.
startActivity
(
Intent
(
context
,
MainActivity
::
class
.
java
))
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/activity/whatsapp/WhatsAppCleanerActivity.kt
deleted
100644 → 0
View file @
c1d33939
package
com.base.filerecoveryrecyclebin.activity.whatsapp
import
android.content.Intent
import
android.graphics.Color
import
android.os.Environment
import
androidx.activity.addCallback
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.activity.ResultActivity
import
com.base.filerecoveryrecyclebin.adapter.WhatsAppCleanerAdapter
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.bean.ConstObject.WHATSAPP_CLEANER
import
com.base.filerecoveryrecyclebin.bean.WhatsAppCleanerBean
import
com.base.filerecoveryrecyclebin.databinding.ActivityWhatsAppCleanerBinding
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
com.base.filerecoveryrecyclebin.help.FileHelp.getDirFiles
import
com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatSize
import
com.base.filerecoveryrecyclebin.help.PermissionHelp.checkStorePermission
import
com.base.filerecoveryrecyclebin.help.PermissionHelp.requestStorePermission
import
com.base.filerecoveryrecyclebin.utils.BarUtils
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isImage
import
com.base.filerecoveryrecyclebin.utils.FileHexEx.isVideo
import
com.base.filerecoveryrecyclebin.utils.LogEx
import
com.base.filerecoveryrecyclebin.view.DialogViews.showExitFunctionDialog
import
com.base.filerecoveryrecyclebin.view.DialogViews.showGerPermission
import
com.google.gson.Gson
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
java.io.File
class
WhatsAppCleanerActivity
:
BaseActivity
<
ActivityWhatsAppCleanerBinding
>()
{
private
val
TAG
=
"WhatsAppCleanerActivity"
private
lateinit
var
adapter
:
WhatsAppCleanerAdapter
private
val
whatsAppMediaDir
=
"${Environment.getExternalStorageDirectory()}/Android/media/com.whatsapp/WhatsApp/Media/"
override
val
binding
:
ActivityWhatsAppCleanerBinding
by
lazy
{
ActivityWhatsAppCleanerBinding
.
inflate
(
layoutInflater
)
}
override
fun
initView
()
{
setupStatusBar
()
setupAdapter
()
checkAndRequestPermissions
()
showNativeAd
()
}
private
fun
setupStatusBar
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
}
private
fun
setupAdapter
()
{
adapter
=
WhatsAppCleanerAdapter
{
item
->
navigateToWhatsAppMessageCleanActivity
(
item
)
}
binding
.
rv
.
adapter
=
adapter
}
private
fun
checkAndRequestPermissions
()
{
if
(
checkStorePermission
())
{
initData
()
}
else
{
requestStoragePermissionWithDialog
()
}
}
private
fun
requestStoragePermissionWithDialog
()
{
showGerPermission
(
desc
=
"This feature requires access to your storage to scan your files and clean up junk files and unused APK files. We will not transmit your data to any third-party service. Please grant permission so that we can provide you with better service."
,
deny
=
{
finishToMain
()
},
allow
=
{
requestStorePermission
(
launcher
,
result
=
{
flag
->
if
(
flag
)
{
initData
()
}
else
{
finishToMain
()
}
}
)
})
}
private
fun
navigateToWhatsAppMessageCleanActivity
(
item
:
WhatsAppCleanerBean
)
{
val
intent
=
Intent
(
this
,
WhatsAppMessageCleanActivity
::
class
.
java
).
apply
{
putExtra
(
"PathList"
,
Gson
().
toJson
(
item
.
subFile
.
toTypedArray
()))
putExtra
(
"Tittle"
,
item
.
tittle
)
}
startActivity
(
intent
)
}
private
fun
showNativeAd
()
{
AdmobMaxHelper
.
admobMaxShowNativeAd
(
this
,
binding
.
flAd
,
0
)
}
override
fun
initListener
()
{
setupBackButton
()
binding
.
tvGotIt
.
setOnClickListener
{
startActivity
(
Intent
(
this
,
ResultActivity
::
class
.
java
).
apply
{
putExtra
(
"from"
,
WHATSAPP_CLEANER
)
})
finish
()
}
}
private
fun
setupBackButton
()
{
binding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
onBackPressedDispatcher
.
addCallback
{
showInterstitialAdAndFinish
()
}
}
private
fun
showInterstitialAdAndFinish
()
{
showExitFunctionDialog
(
this
)
{
showAd
->
if
(
showAd
)
{
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
,
false
)
{
finishToMain
()
}
}
else
{
finishToMain
()
}
}
}
private
fun
initData
()
=
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
val
list
=
arrayListOf
<
WhatsAppCleanerBean
>()
list
.
add
(
WhatsAppCleanerBean
(
R
.
mipmap
.
videomessages
,
"Video Messages"
))
list
.
add
(
WhatsAppCleanerBean
(
R
.
mipmap
.
imagemessages
,
"Image Messages"
))
list
.
add
(
WhatsAppCleanerBean
(
R
.
mipmap
.
audiomessages
,
"Audio Messages"
))
var
totalSize
=
0L
File
(
whatsAppMediaDir
).
listFiles
()
?.
forEach
{
file
->
if
(
file
.
name
==
"WhatsApp Video"
)
{
LogEx
.
logDebug
(
TAG
,
"whatsapp file=${file.absolutePath}"
)
val
bean
=
list
.
find
{
it
.
tittle
==
"Video Messages"
}
val
subFile
=
getDirFiles
(
file
).
filter
{
isVideo
(
it
)
}
val
size
=
subFile
.
sumOf
{
it
.
length
()
}
bean
?.
size
=
size
totalSize
+=
size
bean
?.
subFile
=
subFile
.
map
{
it
.
absolutePath
}
// subFile.forEach { path ->
// LogEx.logDebug(TAG, "path=$path")
// }
}
if
(
file
.
name
==
"WhatsApp Images"
)
{
val
bean
=
list
.
find
{
it
.
tittle
==
"Image Messages"
}
val
subFile
=
getDirFiles
(
file
).
filter
{
isImage
(
it
)
}
val
size
=
subFile
.
sumOf
{
it
.
length
()
}
bean
?.
size
=
size
totalSize
+=
size
bean
?.
subFile
=
subFile
.
map
{
it
.
absolutePath
}
}
if
(
file
.
name
==
"WhatsApp Audio"
)
{
val
bean
=
list
.
find
{
it
.
tittle
==
"Audio Messages"
}
val
subFile
=
getDirFiles
(
file
).
filter
{
it
.
name
.
contains
(
".mp3"
)
}
val
size
=
subFile
.
sumOf
{
it
.
length
()
}
bean
?.
size
=
size
totalSize
+=
size
bean
?.
subFile
=
subFile
.
map
{
it
.
absolutePath
}
}
}
launch
(
Dispatchers
.
Main
)
{
adapter
.
setData
(
list
)
updateTotalSizeUI
(
list
)
}
}
private
fun
updateTotalSizeUI
(
list
:
List
<
WhatsAppCleanerBean
>)
{
val
totalSize
=
list
.
sumOf
{
it
.
size
}
val
formattedSize
=
totalSize
.
toFormatSize
()
binding
.
tvSize
.
text
=
formattedSize
.
split
(
" "
)[
0
]
binding
.
tvUnit
.
text
=
formattedSize
.
split
(
" "
)[
1
]
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/activity/whatsapp/WhatsAppCleanerAnimationActivity.kt
deleted
100644 → 0
View file @
c1d33939
package
com.base.filerecoveryrecyclebin.activity.whatsapp
import
android.annotation.SuppressLint
import
android.content.Intent
import
android.view.View
import
android.widget.Toast
import
androidx.activity.addCallback
import
androidx.lifecycle.lifecycleScope
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.databinding.ActivityWhatsAppCleanerAnimationBinding
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
com.base.filerecoveryrecyclebin.utils.LogEx
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Job
import
kotlinx.coroutines.delay
import
kotlinx.coroutines.launch
class
WhatsAppCleanerAnimationActivity
:
BaseActivity
<
ActivityWhatsAppCleanerAnimationBinding
>()
{
private
val
TAG
=
"WhatsAppCleanerAnimationActivity"
override
val
binding
:
ActivityWhatsAppCleanerAnimationBinding
by
lazy
{
ActivityWhatsAppCleanerAnimationBinding
.
inflate
(
layoutInflater
)
}
private
var
job
:
Job
?
=
null
override
fun
initView
()
{
playLottie
()
AdmobMaxHelper
.
admobMaxShowNativeAd
(
this
,
binding
.
idFlNative
)
}
override
fun
initListener
()
{
onBackPressedDispatcher
.
addCallback
{
Toast
.
makeText
(
this
@WhatsAppCleanerAnimationActivity
,
"wait a moment"
,
Toast
.
LENGTH_SHORT
).
show
()
}
}
@SuppressLint
(
"SetTextI18n"
)
private
fun
playLottie
()
{
binding
.
lottie
.
imageAssetsFolder
=
"whupscan/images/"
binding
.
lottie
.
setAnimation
(
"whupscan/data.json"
)
binding
.
lottie
.
playAnimation
()
}
@SuppressLint
(
"SetTextI18n"
)
fun
jumpJob
()
=
lifecycleScope
.
launch
(
Dispatchers
.
Main
)
{
delay
(
5000
)
LogEx
.
logDebug
(
TAG
,
"delay over"
)
binding
.
lottie
.
cancelAnimation
()
binding
.
lottie
.
visibility
=
View
.
GONE
binding
.
lottieCompleted
.
visibility
=
View
.
VISIBLE
binding
.
lottieCompleted
.
playAnimation
()
binding
.
tv
.
text
=
"Completed!"
delay
(
1000
)
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
@WhatsAppCleanerAnimationActivity
)
{
startActivity
(
Intent
(
this
@WhatsAppCleanerAnimationActivity
,
WhatsAppCleanerActivity
::
class
.
java
))
finish
()
}
}
override
fun
onResume
()
{
super
.
onResume
()
LogEx
.
logDebug
(
TAG
,
"onResume"
)
if
(
job
?.
isActive
==
false
||
job
==
null
)
{
job
=
jumpJob
()
}
}
override
fun
onPause
()
{
super
.
onPause
()
LogEx
.
logDebug
(
TAG
,
"onPause"
)
job
?.
cancel
()
job
=
null
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/activity/whatsapp/WhatsAppMessageCleanActivity.kt
deleted
100644 → 0
View file @
c1d33939
package
com.base.filerecoveryrecyclebin.activity.whatsapp
import
android.content.Intent
import
android.graphics.Color
import
androidx.activity.addCallback
import
androidx.recyclerview.widget.GridLayoutManager
import
androidx.recyclerview.widget.LinearLayoutManager
import
com.base.filerecoveryrecyclebin.activity.ResultActivity
import
com.base.filerecoveryrecyclebin.adapter.WhatsAppMediaAdapter
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.bean.ConstObject
import
com.base.filerecoveryrecyclebin.bean.MediaBean
import
com.base.filerecoveryrecyclebin.databinding.ActivityWhatsAppMessageCleanBinding
import
com.base.filerecoveryrecyclebin.help.BaseActivity
import
com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatSize
import
com.base.filerecoveryrecyclebin.utils.BarUtils
import
com.base.filerecoveryrecyclebin.view.DialogViews.showExitFunctionDialog
import
com.google.gson.Gson
import
java.io.File
class
WhatsAppMessageCleanActivity
:
BaseActivity
<
ActivityWhatsAppMessageCleanBinding
>()
{
private
val
pathList
by
lazy
{
val
json
=
intent
.
extras
?.
getString
(
"PathList"
)
val
list
=
Gson
().
fromJson
(
json
,
Array
<
String
>
::
class
.
java
)
list
.
map
{
MediaBean
(
it
)
}
}
private
lateinit
var
adapter
:
WhatsAppMediaAdapter
override
val
binding
:
ActivityWhatsAppMessageCleanBinding
by
lazy
{
ActivityWhatsAppMessageCleanBinding
.
inflate
(
layoutInflater
)
}
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
val
tittle
=
intent
.
extras
?.
getString
(
"Tittle"
)
?:
""
binding
.
tvTitle
.
text
=
tittle
var
isList
=
false
when
(
tittle
)
{
"Audio Messages"
->
{
binding
.
rv
.
layoutManager
=
LinearLayoutManager
(
this
)
isList
=
true
}
else
->
{
binding
.
rv
.
layoutManager
=
GridLayoutManager
(
this
,
3
)
}
}
adapter
=
WhatsAppMediaAdapter
(
isList
)
{
binding
.
llSelectAll
.
isSelected
=
it
binding
.
tvClean
.
isEnabled
=
adapter
.
getSelectData
().
isNotEmpty
()
val
split
=
adapter
.
getSelectDataSize
().
toFormatSize
().
split
(
" "
)
binding
.
tvSize
.
text
=
split
[
0
]
binding
.
tvUnit
.
text
=
split
[
1
]
}
binding
.
rv
.
adapter
=
adapter
adapter
.
setData
(
pathList
)
}
override
fun
initListener
()
{
binding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
onBackPressedDispatcher
.
addCallback
{
showExitFunctionDialog
(
this
@WhatsAppMessageCleanActivity
)
{
showAd
->
if
(
showAd
)
{
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
@WhatsAppMessageCleanActivity
,
isLoading
=
false
)
{
finishToMain
()
}
}
else
{
finishToMain
()
}
}
}
binding
.
llSelectAll
.
setOnClickListener
{
it
.
isSelected
=
!
it
.
isSelected
adapter
.
toggleSelect
(
it
.
isSelected
)
binding
.
tvClean
.
isEnabled
=
it
.
isSelected
val
split
=
adapter
.
getSelectDataSize
().
toFormatSize
().
split
(
" "
)
binding
.
tvSize
.
text
=
split
[
0
]
binding
.
tvUnit
.
text
=
split
[
1
]
}
binding
.
tvClean
.
setOnClickListener
{
AdmobInterstitialUtils
.
showInterstitialAd
(
this
)
{
val
list
=
adapter
.
getSelectData
()
runCatching
{
list
.
forEach
{
File
(
it
).
delete
()
}
}
startActivity
(
Intent
(
this
@WhatsAppMessageCleanActivity
,
ResultActivity
::
class
.
java
).
apply
{
putExtra
(
"from"
,
ConstObject
.
WHATSAPP_CLEANER
)
})
finish
()
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/ads/AdCommonUtils.kt
deleted
100644 → 0
View file @
c1d33939
package
com.base.filerecoveryrecyclebin.ads
//object AdmobCommonUtils {
//
// private var lastAd: Any? = null
// private var maxMultiClick = AppPreferences.getInstance().getString("maxMultiClick", "10").toInt()
// private var multiClick = 0
// fun isMultiClick(currentAd: Any?) {
// if (currentAd == null) {
// return
// }
// if (lastAd == currentAd) {
// multiClick++
// if (multiClick >= maxMultiClick) {
// AdDisplayUtils.getInstance()
// .setAdClickCount(AdDisplayUtils.getInstance().maxAdClickCount)
// ActivityManagerUtils.getInstance().finishAllActivity()
// return
// }
// } else {
// multiClick = 0
// }
//
// lastAd = currentAd
//
// }
//}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/ads/AdmobMaxHelper.kt
View file @
230eb832
...
...
@@ -7,6 +7,10 @@ import com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import
com.base.filerecoveryrecyclebin.ads.admob.AdmobOpenUtils
import
com.base.filerecoveryrecyclebin.ads.max.AdMaxInit.initAdMax
import
com.base.filerecoveryrecyclebin.ads.max.AdMaxInterstitialUtils
import
com.base.filerecoveryrecyclebin.ads.max.AdMaxNativeUtils
import
com.base.filerecoveryrecyclebin.ads.max.AdMaxOpenUtils
import
com.base.filerecoveryrecyclebin.help.BaseApplication
import
com.base.filerecoveryrecyclebin.utils.AppPreferences
import
com.base.filerecoveryrecyclebin.utils.EventUtils
...
...
@@ -19,15 +23,21 @@ object AdmobMaxHelper {
var
isAdInit
=
AtomicBoolean
(
false
)
var
isBlack
:
Boolean
=
false
fun
haveSpAdmobTrueMaxFalse
():
Boolean
{
return
AppPreferences
.
getInstance
().
getString
(
"admobTrueMaxFalse"
,
"-1"
).
toInt
()
!=
-
1
}
private
fun
getSpAdmobTrueMaxFalse
():
Boolean
{
fun
getSpAdmobTrueMaxFalse
():
Boolean
{
val
ss
=
AppPreferences
.
getInstance
().
getString
(
"admobTrueMaxFalse"
,
"1"
).
toInt
()
return
ss
==
1
}
fun
showExitNativeSp
():
Boolean
{
val
isShowExitNative
=
AppPreferences
.
getInstance
().
getString
(
"isShowExitNative"
,
"0"
).
toInt
()
return
isShowExitNative
==
1
}
fun
showGuideNativeSp
():
Boolean
{
val
isShowGuideNative
=
AppPreferences
.
getInstance
().
getString
(
"isShowGuideNative"
,
"0"
).
toInt
()
return
isShowGuideNative
==
1
}
fun
showBackInterAdSp
():
Boolean
{
val
isShowBackIntAd
=
AppPreferences
.
getInstance
().
getString
(
"isShowBackIntAd"
,
"0"
).
toInt
()
//1要看插屏 0不看
...
...
@@ -46,7 +56,7 @@ object AdmobMaxHelper {
if
(
isBlack
)
{
return
}
if
(
true
)
{
if
(
getSpAdmobTrueMaxFalse
()
)
{
if
(!
isAdInit
.
get
())
{
LogEx
.
logDebug
(
TAG
,
"init sp Admob"
)
MobileAds
.
initialize
(
BaseApplication
.
context
)
{
initializationStatus
->
...
...
@@ -54,21 +64,20 @@ object AdmobMaxHelper {
}
}
}
else
{
//
if (!isAdInit.get()) {
//
LogEx.logDebug(TAG, "init sp AdMax")
//
BaseApplication.context.initAdMax()
//
}
if
(!
isAdInit
.
get
())
{
LogEx
.
logDebug
(
TAG
,
"init sp AdMax"
)
BaseApplication
.
context
.
initAdMax
()
}
}
}
//End end
fun
isOpenAdLoaded
():
Boolean
{
// if (getSpAdmobTrueMaxFalse()) {
//
// } else {
// AdMaxOpenUtils.isOpenAdLoaded()
// }
return
AdmobOpenUtils
.
isOpenAdLoaded
()
if
(
getSpAdmobTrueMaxFalse
())
{
return
AdmobOpenUtils
.
isOpenAdLoaded
()
}
else
{
return
AdMaxOpenUtils
.
isOpenAdLoaded
()
}
}
//展示广告关闭时赋值
...
...
@@ -96,14 +105,14 @@ object AdmobMaxHelper {
return
}
if
(
true
)
{
if
(
getSpAdmobTrueMaxFalse
()
)
{
AdmobInterstitialUtils
.
showInterstitialAd
(
activity
)
{
onHidden
?.
invoke
()
}
}
else
{
//
AdMaxInterstitialUtils.showInterstitialAd(activity) {
//
onHidden?.invoke()
//
}
AdMaxInterstitialUtils
.
showInterstitialAd
(
activity
)
{
onHidden
?.
invoke
()
}
}
}
...
...
@@ -116,47 +125,40 @@ object AdmobMaxHelper {
onHidden
?.
invoke
()
return
}
if
(
true
)
{
if
(
getSpAdmobTrueMaxFalse
()
)
{
AdmobOpenUtils
.
showAppOpenAd
(
activity
,
showBefore
=
showBeforeAction
)
{
onHidden
?.
invoke
()
}
}
else
{
// AdMaxOpenUtils.showAppOpenAd(activity
, loadCallBack = showBeforeAction) {
//
onHidden?.invoke()
//
}
AdMaxOpenUtils
.
showAppOpenAd
(
activity
,
showBefore
=
showBeforeAction
,
loadCallBack
=
showBeforeAction
)
{
onHidden
?.
invoke
()
}
}
}
fun
admobMaxShowNativeAd
(
activity
:
Activity
,
parent
:
ViewGroup
,
where
:
Int
=
0
)
{
fun
admobMaxShowNativeAd
(
activity
:
Activity
,
parent
:
ViewGroup
,
where
:
Int
=
-
1
)
{
if
(
isBlack
)
{
return
}
val
isShowResultNaAd
=
AppPreferences
.
getInstance
().
getString
(
"isShowResultNaAd"
,
"0"
).
toInt
()
Log
.
e
(
"MXL"
,
"admobMaxShowNativeAd: $isShowResultNaAd"
)
if
(
isShowResultNaAd
==
0
)
return
var
layout
=
R
.
layout
.
layout_native_custom
when
(
where
)
{
0
->
layout
=
R
.
layout
.
layout_native_custom
1
->
layout
=
R
.
layout
.
layout_nativie_custom2
if
(
getSpAdmobTrueMaxFalse
())
{
val
layout
=
when
(
where
)
{
0
->
R
.
layout
.
layout_native_custom
1
->
R
.
layout
.
layout_nativie_custom2
3
->
R
.
layout
.
layout_native_full
else
->
R
.
layout
.
layout_native_custom
}
AdmobNativeUtils
.
showNativeAd
(
activity
,
parent
,
layout
)
}
else
{
val
layout
=
when
(
where
)
{
0
->
R
.
layout
.
layout_max_native_small_f8f8f8
1
->
R
.
layout
.
layout_max_native_big
2
->
R
.
layout
.
layout_max_native_big_2
3
->
R
.
layout
.
layout_max_native_full
else
->
R
.
layout
.
layout_max_native_small_f8f8f8
}
AdMaxNativeUtils
.
showNativeAd
(
activity
,
parent
,
layout
)
}
AdmobNativeUtils
.
showNativeAd
(
activity
,
parent
,
layout
)
// if (true) {
// AdmobNativeUtils.showNativeAd(activity, parent)
// } else {
//// var layout = R.layout.layout_max_native_small
//// if (where == 0) {
//// layout = R.layout.layout_max_native_small_f8f8f8
//// }
//// if (where == 1) {
//// layout = R.layout.layout_max_native_big
//// }
//// if (where == 2) {
//// layout = R.layout.layout_max_native_big_2
//// }
//// AdMaxNativeUtils.showNativeAd(activity, parent, layout)
// }
}
fun
preloadAd
(
activity
:
Activity
)
{
...
...
@@ -164,19 +166,18 @@ object AdmobMaxHelper {
return
}
if
(
true
)
{
if
(
getSpAdmobTrueMaxFalse
()
)
{
// AdmobOpenUtils.loadAppOpenAd()
AdmobInterstitialUtils
.
loadInterstitialAd
(
activity
)
}
else
{
if
(
isAdInit
.
get
())
{
//
AdMaxOpenUtils.loadAppOpenAd(activity)
//
AdMaxInterstitialUtils.loadInterstitialAd(activity)
AdMaxOpenUtils
.
loadAppOpenAd
(
activity
)
AdMaxInterstitialUtils
.
loadInterstitialAd
(
activity
)
}
else
{
// AdMaxInit.maxInitAction = {
Log
.
d
(
TAG
,
"max init suc"
)
// AdMaxOpenUtils.loadAppOpenAd(activity)
// AdMaxInterstitialUtils.loadInterstitialAd(activity)
// }
AdMaxOpenUtils
.
loadAppOpenAd
(
activity
)
AdMaxInterstitialUtils
.
loadInterstitialAd
(
activity
)
}
}
}
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/ads/admob/AdmobBannerColla.kt
View file @
230eb832
...
...
@@ -9,6 +9,7 @@ import android.view.ViewTreeObserver
import
androidx.core.view.children
import
com.base.filerecoveryrecyclebin.BuildConfig
import
com.base.filerecoveryrecyclebin.GlobalConfig
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.help.ConfigHelper
import
com.base.filerecoveryrecyclebin.utils.AppPreferences
import
com.base.filerecoveryrecyclebin.utils.LogEx
...
...
@@ -26,6 +27,9 @@ object AdmobBannerUtils {
private
var
listener
:
ViewTreeObserver
.
OnGlobalLayoutListener
?
=
null
fun
showCollapsibleBannerAd
(
context
:
Context
,
parent
:
ViewGroup
)
{
if
(!
AdmobMaxHelper
.
getSpAdmobTrueMaxFalse
())
return
val
isShowBanner
=
AppPreferences
.
getInstance
().
getString
(
"isShowBanner"
,
"0"
).
toInt
()
if
(
isShowBanner
==
0
)
{
return
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/ads/max/AdMaxEvent.kt
View file @
230eb832
//package com.base.filerecoveryrecyclebin.ads.max
//
//import android.os.Bundle
//import com.applovin.mediation.MaxAd
//import com.applovin.mediation.MaxAdRevenueListener
//import com.applovin.sdk.AppLovinSdk
//import com.base.filerecoveryrecyclebin.help.BaseApplication
//import com.base.filerecoveryrecyclebin.utils.EventUtils
//import com.base.filerecoveryrecyclebin.utils.LogEx
//import com.facebook.FacebookSdk
//import com.facebook.appevents.AppEventsConstants
//import com.facebook.appevents.AppEventsLogger
//import com.google.firebase.analytics.FirebaseAnalytics
//import org.json.JSONObject
//
//object AdMaxEvent {
// fun pullAd(ad: MaxAd?, adUnit: String, error: String? = null, reqId: String? = null, code: Int? = null) {
// val obj = JSONObject()
// obj.put("UnitId", ad?.adUnitId)
// obj.put("ad_unit", adUnit)
// obj.put(
// "creativeId",
// ad?.creativeId
// )
// obj.put("req_id", reqId)
// obj.put("status", if (ad == null) "0" else "1")
// obj.put("networkname", ad?.networkName)
// obj.put("placement", ad?.placement)
// obj.put("networkplacement", ad?.networkPlacement)
// obj.put("latency", ad?.requestLatencyMillis)
// obj.put("valueMicros", ad?.revenue)
// if (error == null) {
// obj.put("status", "1")
// } else {
// obj.put("errMsg", error)
// obj.put("status", "2")
// }
// EventUtils.event("ad_pull", ext = obj)
// }
//
// fun clickAd(ad: MaxAd?, adUnit: String) {
//
// val obj = JSONObject()
// obj.put("UnitId", ad?.adUnitId)
// obj.put("ad_unit", adUnit)
// obj.put(
// "creativeId",
// ad?.creativeId
// )
// obj.put("networkname", ad?.networkName)
// obj.put("placement", ad?.placement)
// obj.put("networkplacement", ad?.networkPlacement)
// obj.put("latency", ad?.requestLatencyMillis)
// obj.put("valueMicros", ad?.revenue)
// if (!adUnit.equals("nativeAd")) {
// EventUtils.event("ad_click", ext = obj)
// } else {
// EventUtils.event("big_imgad_click", ext = obj)
// }
//
// }
//
// fun showAd(ad: MaxAd?, adUnit: String, activity: String?) {
// val obj = JSONObject()
// obj.put("UnitId", ad?.adUnitId)
// obj.put("ad_unit", adUnit)
// obj.put(
// "creativeId",
// ad?.creativeId
// )
// obj.put("networkname", ad?.networkName)
// obj.put("placement", ad?.placement)
// obj.put("networkplacement", ad?.networkPlacement)
// obj.put("latency", ad?.requestLatencyMillis)
// obj.put("valueMicros", ad?.revenue)
// obj.put("from", activity)
// obj.put("mediation", "applovin")
// LogEx.logDebug("glc", "from: $activity")
// if (adUnit != "nativeAd") {
// EventUtils.event("ad_show", ext = obj)
// } else {
// EventUtils.event("big_img_show", ext = obj)
// }
//
// }
//
// private val taichiPref = FacebookSdk.getApplicationContext()
// .getSharedPreferences("TaichiTroasCache", 0)
// private val taichiSharedPreferencesEditor = taichiPref.edit()
//
// class EventOnPaidEventListener : MaxAdRevenueListener {
// override fun onAdRevenuePaid(ad: MaxAd) {
// val params = Bundle()
// val currentImpressionRevenue: Double = ad.revenue // In USD
// val mFirebaseAnalytics = FirebaseAnalytics.getInstance(BaseApplication.context)
// params.putString(FirebaseAnalytics.Param.AD_PLATFORM, "appLovin")
// params.putString(FirebaseAnalytics.Param.AD_SOURCE, ad.networkName)
// params.putString(FirebaseAnalytics.Param.AD_FORMAT, ad.format.getDisplayName())
// params.putString(FirebaseAnalytics.Param.AD_UNIT_NAME, ad.adUnitId)
// params.putDouble(FirebaseAnalytics.Param.VALUE, currentImpressionRevenue)
// params.putString(FirebaseAnalytics.Param.CURRENCY, "USD")
// mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION, params)
// mFirebaseAnalytics.logEvent("Ad_Impression_Revenue", params)
// val previousTaichiTroasCache = taichiPref.getFloat("TaichiTroasCache", 0f)
// val currentTaichiTroasCache = previousTaichiTroasCache + currentImpressionRevenue
// if (currentTaichiTroasCache >= 0.01) {
// val roasbundle = Bundle()
// roasbundle.putDouble(FirebaseAnalytics.Param.VALUE, currentTaichiTroasCache)
// roasbundle.putString(FirebaseAnalytics.Param.CURRENCY, "USD")///(Required)tROAS事件必须
// mFirebaseAnalytics.logEvent("Total_Ads_Revenue_001", roasbundle) // 给Taichi用
// taichiSharedPreferencesEditor.putFloat("TaichiTroasCache", 0f)//重新清零,开始计算
//
// val logger = AppEventsLogger.newLogger(BaseApplication.context)
// val parameters = Bundle()
// parameters.putString(AppEventsConstants.EVENT_PARAM_CURRENCY, "USD")
// logger.logEvent("ad_value", currentTaichiTroasCache, parameters)
// } else {
// taichiSharedPreferencesEditor.putFloat(
// "TaichiTroasCache",
// currentTaichiTroasCache.toFloat()
// )
// taichiSharedPreferencesEditor.commit()
// }
// val obj = JSONObject()
// val revenue = ad.revenue
// val countryCode =
// AppLovinSdk.getInstance(BaseApplication.context).configuration.countryCode
// val networkName = ad.networkName
// val adUnitId = ad.adUnitId
// val adFormat = ad.format
// val placement = ad.placement
// val networkPlacement = ad.networkPlacement
// obj.put("valueMicros", revenue)
// obj.put("currencyCode", countryCode)
// obj.put("adUnitId", adUnitId)
// obj.put("networkName", networkName)
// obj.put("adFormat", adFormat)
// obj.put("placement", placement)
// obj.put("networkPlacement", networkPlacement)
// EventUtils.event("ad_price", ext = obj)
// }
//
// }
//}
\ No newline at end of file
package
com.base.filerecoveryrecyclebin.ads.max
import
android.os.Bundle
import
com.applovin.mediation.MaxAd
import
com.applovin.mediation.MaxAdRevenueListener
import
com.applovin.sdk.AppLovinSdk
import
com.base.filerecoveryrecyclebin.help.BaseApplication
import
com.base.filerecoveryrecyclebin.utils.EventUtils
import
com.base.filerecoveryrecyclebin.utils.LogEx
import
com.facebook.FacebookSdk
import
com.facebook.appevents.AppEventsConstants
import
com.facebook.appevents.AppEventsLogger
import
com.google.firebase.analytics.FirebaseAnalytics
import
org.json.JSONObject
object
AdMaxEvent
{
fun
pullAd
(
ad
:
MaxAd
?,
adUnit
:
String
,
error
:
String
?
=
null
,
reqId
:
String
?
=
null
,
code
:
Int
?
=
null
)
{
val
obj
=
JSONObject
()
obj
.
put
(
"UnitId"
,
ad
?.
adUnitId
)
obj
.
put
(
"ad_unit"
,
adUnit
)
obj
.
put
(
"creativeId"
,
ad
?.
creativeId
)
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"status"
,
if
(
ad
==
null
)
"0"
else
"1"
)
obj
.
put
(
"networkname"
,
ad
?.
networkName
)
obj
.
put
(
"placement"
,
ad
?.
placement
)
obj
.
put
(
"networkplacement"
,
ad
?.
networkPlacement
)
obj
.
put
(
"latency"
,
ad
?.
requestLatencyMillis
)
obj
.
put
(
"valueMicros"
,
ad
?.
revenue
)
if
(
error
==
null
)
{
obj
.
put
(
"status"
,
"1"
)
}
else
{
obj
.
put
(
"errMsg"
,
error
)
obj
.
put
(
"status"
,
"2"
)
}
EventUtils
.
event
(
"ad_pull"
,
ext
=
obj
)
}
fun
clickAd
(
ad
:
MaxAd
?,
adUnit
:
String
)
{
val
obj
=
JSONObject
()
obj
.
put
(
"UnitId"
,
ad
?.
adUnitId
)
obj
.
put
(
"ad_unit"
,
adUnit
)
obj
.
put
(
"creativeId"
,
ad
?.
creativeId
)
obj
.
put
(
"networkname"
,
ad
?.
networkName
)
obj
.
put
(
"placement"
,
ad
?.
placement
)
obj
.
put
(
"networkplacement"
,
ad
?.
networkPlacement
)
obj
.
put
(
"latency"
,
ad
?.
requestLatencyMillis
)
obj
.
put
(
"valueMicros"
,
ad
?.
revenue
)
if
(!
adUnit
.
equals
(
"nativeAd"
))
{
EventUtils
.
event
(
"ad_click"
,
ext
=
obj
)
}
else
{
EventUtils
.
event
(
"big_imgad_click"
,
ext
=
obj
)
}
}
fun
showAd
(
ad
:
MaxAd
?,
adUnit
:
String
,
activity
:
String
?)
{
val
obj
=
JSONObject
()
obj
.
put
(
"UnitId"
,
ad
?.
adUnitId
)
obj
.
put
(
"ad_unit"
,
adUnit
)
obj
.
put
(
"creativeId"
,
ad
?.
creativeId
)
obj
.
put
(
"networkname"
,
ad
?.
networkName
)
obj
.
put
(
"placement"
,
ad
?.
placement
)
obj
.
put
(
"networkplacement"
,
ad
?.
networkPlacement
)
obj
.
put
(
"latency"
,
ad
?.
requestLatencyMillis
)
obj
.
put
(
"valueMicros"
,
ad
?.
revenue
)
obj
.
put
(
"from"
,
activity
)
obj
.
put
(
"mediation"
,
"applovin"
)
LogEx
.
logDebug
(
"glc"
,
"from: $activity"
)
if
(
adUnit
!=
"nativeAd"
)
{
EventUtils
.
event
(
"ad_show"
,
ext
=
obj
)
}
else
{
EventUtils
.
event
(
"big_img_show"
,
ext
=
obj
)
}
}
private
val
taichiPref
=
FacebookSdk
.
getApplicationContext
()
.
getSharedPreferences
(
"TaichiTroasCache"
,
0
)
private
val
taichiSharedPreferencesEditor
=
taichiPref
.
edit
()
class
EventOnPaidEventListener
:
MaxAdRevenueListener
{
override
fun
onAdRevenuePaid
(
ad
:
MaxAd
)
{
val
params
=
Bundle
()
val
currentImpressionRevenue
:
Double
=
ad
.
revenue
// In USD
val
mFirebaseAnalytics
=
FirebaseAnalytics
.
getInstance
(
BaseApplication
.
context
)
params
.
putString
(
FirebaseAnalytics
.
Param
.
AD_PLATFORM
,
"appLovin"
)
params
.
putString
(
FirebaseAnalytics
.
Param
.
AD_SOURCE
,
ad
.
networkName
)
params
.
putString
(
FirebaseAnalytics
.
Param
.
AD_FORMAT
,
ad
.
format
.
getDisplayName
())
params
.
putString
(
FirebaseAnalytics
.
Param
.
AD_UNIT_NAME
,
ad
.
adUnitId
)
params
.
putDouble
(
FirebaseAnalytics
.
Param
.
VALUE
,
currentImpressionRevenue
)
params
.
putString
(
FirebaseAnalytics
.
Param
.
CURRENCY
,
"USD"
)
mFirebaseAnalytics
.
logEvent
(
FirebaseAnalytics
.
Event
.
AD_IMPRESSION
,
params
)
mFirebaseAnalytics
.
logEvent
(
"Ad_Impression_Revenue"
,
params
)
val
previousTaichiTroasCache
=
taichiPref
.
getFloat
(
"TaichiTroasCache"
,
0f
)
val
currentTaichiTroasCache
=
previousTaichiTroasCache
+
currentImpressionRevenue
if
(
currentTaichiTroasCache
>=
0.01
)
{
val
roasbundle
=
Bundle
()
roasbundle
.
putDouble
(
FirebaseAnalytics
.
Param
.
VALUE
,
currentTaichiTroasCache
)
roasbundle
.
putString
(
FirebaseAnalytics
.
Param
.
CURRENCY
,
"USD"
)
///(Required)tROAS事件必须
mFirebaseAnalytics
.
logEvent
(
"Total_Ads_Revenue_001"
,
roasbundle
)
// 给Taichi用
taichiSharedPreferencesEditor
.
putFloat
(
"TaichiTroasCache"
,
0f
)
//重新清零,开始计算
val
logger
=
AppEventsLogger
.
newLogger
(
BaseApplication
.
context
)
val
parameters
=
Bundle
()
parameters
.
putString
(
AppEventsConstants
.
EVENT_PARAM_CURRENCY
,
"USD"
)
logger
.
logEvent
(
"ad_value"
,
currentTaichiTroasCache
,
parameters
)
}
else
{
taichiSharedPreferencesEditor
.
putFloat
(
"TaichiTroasCache"
,
currentTaichiTroasCache
.
toFloat
()
)
taichiSharedPreferencesEditor
.
commit
()
}
val
obj
=
JSONObject
()
val
revenue
=
ad
.
revenue
val
countryCode
=
AppLovinSdk
.
getInstance
(
BaseApplication
.
context
).
configuration
.
countryCode
val
networkName
=
ad
.
networkName
val
adUnitId
=
ad
.
adUnitId
val
adFormat
=
ad
.
format
val
placement
=
ad
.
placement
val
networkPlacement
=
ad
.
networkPlacement
obj
.
put
(
"valueMicros"
,
revenue
)
obj
.
put
(
"currencyCode"
,
countryCode
)
obj
.
put
(
"adUnitId"
,
adUnitId
)
obj
.
put
(
"networkName"
,
networkName
)
obj
.
put
(
"adFormat"
,
adFormat
)
obj
.
put
(
"placement"
,
placement
)
obj
.
put
(
"networkPlacement"
,
networkPlacement
)
EventUtils
.
event
(
"ad_price"
,
ext
=
obj
)
}
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/ads/max/AdMaxInit.kt
View file @
230eb832
//package com.base.filerecoveryrecyclebin.ads.max
//
//import android.content.Context
//import com.applovin.sdk.AppLovinMediationProvider
//import com.applovin.sdk.AppLovinSdk
//import com.applovin.sdk.AppLovinSdkInitializationConfiguration
//import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.isAdInit
//import com.base.filerecoveryrecyclebin.utils.EventUtils
//import com.base.filerecoveryrecyclebin.utils.LogEx
//import java.util.concurrent.Executors
//
//object AdMaxInit {
//
// private val TAG = "AdMaxInit"
// var maxInitAction: (() -> Unit)? = null
//
// fun Context.initAdMax() {
// // If you want to test your own AppLovin SDK key, change the value here and update the package name in the build.gradle
//// val YOUR_SDK_KEY = "05TMDQ5tZabpXQ45_UTbmEGNUtVAzSTzT6KmWQc5_CuWdzccS4DCITZoL3yIWUG3bbq60QC_d4WF28tUC4gVTF"
// val YOUR_SDK_KEY = "GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
//
// val executor = Executors.newSingleThreadExecutor();
// executor.execute {
//
// val initConfigBuilder = AppLovinSdkInitializationConfiguration.builder(YOUR_SDK_KEY, this)
// initConfigBuilder.mediationProvider = AppLovinMediationProvider.MAX
//
// // Enable test mode by default for the current device. Cannot be run on the main thread.
//// val currentGaid = AdvertisingIdClient.getAdvertisingIdInfo(this).id
//// if (currentGaid != null) {
//// initConfigBuilder.testDeviceAdvertisingIds = Collections.singletonList(currentGaid)
//// }
//
//
// // Initialize the AppLovin SDK
// val sdk = AppLovinSdk.getInstance(this)
// sdk.initialize(initConfigBuilder.build()) {
// LogEx.logDebug(TAG, "max init")
// isAdInit.set(true)
// maxInitAction?.invoke()
// maxInitAction = null
// EventUtils.event("MaxInit", "MaxInit")
// }
//
// executor.shutdown()
// }
// }
//}
\ No newline at end of file
package
com.base.filerecoveryrecyclebin.ads.max
import
android.content.Context
import
com.applovin.sdk.AppLovinMediationProvider
import
com.applovin.sdk.AppLovinSdk
import
com.applovin.sdk.AppLovinSdkInitializationConfiguration
import
com.base.filerecoveryrecyclebin.BuildConfig
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.isAdInit
import
com.base.filerecoveryrecyclebin.utils.EventUtils
import
com.base.filerecoveryrecyclebin.utils.LogEx
import
com.google.android.gms.ads.identifier.AdvertisingIdClient
import
java.util.Collections
import
java.util.concurrent.Executors
object
AdMaxInit
{
private
val
TAG
=
"AdMaxInit"
var
maxInitAction
:
(()
->
Unit
)?
=
null
fun
Context
.
initAdMax
()
{
// If you want to test your own AppLovin SDK key, change the value here and update the package name in the build.gradle
// val YOUR_SDK_KEY = "05TMDQ5tZabpXQ45_UTbmEGNUtVAzSTzT6KmWQc5_CuWdzccS4DCITZoL3yIWUG3bbq60QC_d4WF28tUC4gVTF"
val
YOUR_SDK_KEY
=
"GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
val
executor
=
Executors
.
newSingleThreadExecutor
();
executor
.
execute
{
val
initConfigBuilder
=
AppLovinSdkInitializationConfiguration
.
builder
(
YOUR_SDK_KEY
,
this
)
initConfigBuilder
.
mediationProvider
=
AppLovinMediationProvider
.
MAX
// Enable test mode by default for the current device. Cannot be run on the main thread.
if
(
BuildConfig
.
DEBUG
)
{
kotlin
.
runCatching
{
val
currentGaid
=
AdvertisingIdClient
.
getAdvertisingIdInfo
(
this
).
id
if
(
currentGaid
!=
null
)
{
initConfigBuilder
.
testDeviceAdvertisingIds
=
Collections
.
singletonList
(
currentGaid
)
}
}
}
// Initialize the AppLovin SDK
val
sdk
=
AppLovinSdk
.
getInstance
(
this
)
sdk
.
initialize
(
initConfigBuilder
.
build
())
{
LogEx
.
logDebug
(
TAG
,
"max init"
)
isAdInit
.
set
(
true
)
maxInitAction
?.
invoke
()
maxInitAction
=
null
EventUtils
.
event
(
"MaxInit"
,
"MaxInit"
)
}
executor
.
shutdown
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/ads/max/AdMaxInterstitialUtils.kt
View file @
230eb832
//package com.base.filerecoveryrecyclebin.ads.max
//
//import android.app.Activity
//import android.app.Dialog
//import com.applovin.mediation.MaxAd
//import com.applovin.mediation.MaxAdListener
//import com.applovin.mediation.MaxError
//import com.applovin.mediation.ads.MaxInterstitialAd
//import com.base.filerecoveryrecyclebin.MyApplication.Companion.isInterOpenShowing
//import com.base.filerecoveryrecyclebin.R
//import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
//import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.isAdInit
//import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.lastShowedOnHiddenTime
//import com.base.filerecoveryrecyclebin.help.ConfigHelper
//import com.base.filerecoveryrecyclebin.utils.EventUtils
//import com.base.filerecoveryrecyclebin.utils.LogEx
//import com.base.filerecoveryrecyclebin.view.CustomDialog
//import org.json.JSONObject
//import java.util.UUID
//
//object AdMaxInterstitialUtils {
//
// private val TAG = "AdMaxInterstitialUtils"
// private var interstitialAd: MaxInterstitialAd? = null
// private var interLoadTime = Long.MAX_VALUE
// private var onHidden: (() -> Unit)? = null
// private var loadingListener: (() -> Unit)? = null
// private var activityString: String = ""
//
// private fun setListener(activity: Activity) {
// activityString = activity::class.java.toString().split(".").last()
// if (interstitialAd == null) {
//
// interstitialAd = MaxInterstitialAd(ConfigHelper.interAdMaxId, activity)
// interstitialAd?.setListener(object : MaxAdListener {
// override fun onAdLoaded(p0: MaxAd) {
// LogEx.logDebug(TAG, "onAdLoaded")
//
// loadingListener?.invoke()
// loadingListener = null
//
// interLoadTime = System.currentTimeMillis()
// val reqId = UUID.randomUUID().toString()
// AdMaxEvent.pullAd(p0, "interAd", reqId = reqId)
// }
//
// override fun onAdLoadFailed(p0: String, p1: MaxError) {
// LogEx.logDebug(TAG, "onAdLoadFailed")
// val reqId = UUID.randomUUID().toString()
// AdMaxEvent.pullAd(null, "interAd", reqId = reqId, error = p1.message, code = p1.code)
// AdDisplayUtils.getInstance().incrementAdRequestFailCount()
//
// loadingListener?.invoke()
// loadingListener = null
// }
//
// override fun onAdDisplayed(p0: MaxAd) {
// LogEx.logDebug(TAG, "onAdDisplayed")
// AdDisplayUtils.getInstance().incrementAdDisplayCount()
// AdMaxEvent.showAd(p0, "interAd", activityString)
//
// isInterOpenShowing = true
// }
//
// override fun onAdHidden(p0: MaxAd) {
// LogEx.logDebug(TAG, "onAdHidden")
// onHidden?.invoke()
// onHidden = null
// AdMaxOpenUtils.loadAppOpenAd(activity)
//// loadInterstitialAd(activity)
//
// isInterOpenShowing = false
// lastShowedOnHiddenTime = System.currentTimeMillis()
// }
//
// override fun onAdClicked(p0: MaxAd) {
// LogEx.logDebug(TAG, "onAdClicked activity=$activityString")
// AdDisplayUtils.getInstance().incrementAdClickCount()
// AdMaxEvent.clickAd(p0, "interAd")
// }
//
//
// override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
// LogEx.logDebug(TAG, "onAdDisplayFailed")
// onHidden?.invoke()
// onHidden = null
// val obj2 = JSONObject()
// obj2.put("code", p1.code)
// obj2.put("reason", p1.message)
// obj2.put("ad_unit", "interAd")
// EventUtils.event("ad_show_error", ext = obj2)
//
// isInterOpenShowing = false
// }
// })
// interstitialAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
// }
// }
//
// fun showInterstitialAd(activity: Activity, onHidden: (() -> Unit)? = null) {
// setListener(activity)
//
// if (activity.isFinishing || activity.isDestroyed) {
// return
// }
//
// if (isAdExpired()) {
// val obj2 = JSONObject()
// obj2.put("ad_unit", "interAd")
// EventUtils.event("ad_expire", ext = obj2)
// onHidden?.invoke()
// loadInterstitialAd(activity)
// return
// }
//
//
// if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
// onHidden?.invoke()
// return
// }
//
// LogEx.logDebug(TAG, "showInterstitialAd,展示插屏广告")
//
// val obj1 = JSONObject()
// obj1.put("ad_unit", "interAd")
// EventUtils.event("ad_prepare_show", ext = obj1)
// isInterOpenShowing = false
//
// if (interstitialAd?.isReady == true) {
// LogEx.logDebug(TAG, "有缓存直接播放。")
// this.onHidden = onHidden
// interstitialAd?.showAd(activity)
// } else {
// LogEx.logDebug(TAG, "展示广告时,没有缓存,需要拉取。")
// val obj2 = JSONObject()
// obj2.put("reason", "no cache ad")
// obj2.put("ad_unit", "interAd")
// EventUtils.event("ad_nocache_pull", ext = obj2)
// val loaded = loadInterstitialAd(activity)
// if (loaded) {
// LogEx.logDebug(TAG, "loaded=true")
// val dialog = showAdDialogAndLoadInterstitial(activity)
// loadingListener = {
// dialog?.dismiss()
// if (interstitialAd?.isReady == true) {
// this.onHidden = onHidden
// interstitialAd?.showAd(activity)
// } else {
// onHidden?.invoke()
// }
// }
// } else {
// LogEx.logDebug(TAG, "loaded=false")
// onHidden?.invoke()
// }
// }
//
// }
//
// private fun isAdExpired(): Boolean {
// return System.currentTimeMillis() - interLoadTime > 1000 * 60 * 60
// }
//
//
// private fun showAdDialogAndLoadInterstitial(
// activity: Activity,
// ): Dialog? {
// var customDialog: Dialog? = null
// if (!activity.isFinishing && !activity.isDestroyed) {
// customDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
// // 设置对话框的样式和内容
// customDialog.show()
// }
// return customDialog
// }
//
// fun loadInterstitialAd(activity: Activity): Boolean {
// setListener(activity)
//
// if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
// return false
// }
//
// LogEx.logDebug(TAG, "loadInterstitialAd")
// val reqId = UUID.randomUUID().toString()
// val obj = JSONObject()
// obj.put("req_id", reqId)
// obj.put("ad_type", "interAd")
// EventUtils.event("ad_pull_start", ext = obj)
// interstitialAd?.loadAd()
// AdDisplayUtils.getInstance().incrementAdRequestCount()
// return true
// }
//
//
//}
\ No newline at end of file
package
com.base.filerecoveryrecyclebin.ads.max
import
android.animation.ObjectAnimator
import
android.app.Activity
import
android.app.Dialog
import
android.os.Handler
import
android.os.Looper
import
android.view.View
import
android.view.Window
import
android.widget.ImageView
import
android.widget.TextView
import
androidx.core.content.ContextCompat
import
com.applovin.mediation.MaxAd
import
com.applovin.mediation.MaxAdListener
import
com.applovin.mediation.MaxError
import
com.applovin.mediation.ads.MaxInterstitialAd
import
com.base.filerecoveryrecyclebin.GlobalConfig
import
com.base.filerecoveryrecyclebin.MyApplication.Companion.isInterOpenShowing
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.lastShowedOnHiddenTime
import
com.base.filerecoveryrecyclebin.utils.EventUtils
import
com.base.filerecoveryrecyclebin.utils.LogEx
import
com.base.filerecoveryrecyclebin.view.CustomDialog
import
org.json.JSONObject
import
java.util.UUID
object
AdMaxInterstitialUtils
{
private
val
TAG
=
"AdMaxInterstitialUtils"
private
var
interstitialAd
:
MaxInterstitialAd
?
=
null
private
var
interLoadTime
=
Long
.
MAX_VALUE
private
var
onHidden
:
(()
->
Unit
)?
=
null
private
var
loadingListener
:
(()
->
Unit
)?
=
null
private
var
activityString
:
String
=
""
private
fun
setListener
(
activity
:
Activity
)
{
activityString
=
activity
::
class
.
java
.
toString
().
split
(
"."
).
last
()
if
(
interstitialAd
==
null
)
{
interstitialAd
=
MaxInterstitialAd
(
GlobalConfig
.
ID_MAX_INTER
,
activity
)
interstitialAd
?.
setListener
(
object
:
MaxAdListener
{
override
fun
onAdLoaded
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdLoaded"
)
loadingListener
?.
invoke
()
loadingListener
=
null
interLoadTime
=
System
.
currentTimeMillis
()
val
reqId
=
UUID
.
randomUUID
().
toString
()
AdMaxEvent
.
pullAd
(
p0
,
"interAd"
,
reqId
=
reqId
)
}
override
fun
onAdLoadFailed
(
p0
:
String
,
p1
:
MaxError
)
{
LogEx
.
logDebug
(
TAG
,
"onAdLoadFailed"
)
val
reqId
=
UUID
.
randomUUID
().
toString
()
AdMaxEvent
.
pullAd
(
null
,
"interAd"
,
reqId
=
reqId
,
error
=
p1
.
message
,
code
=
p1
.
code
)
AdDisplayUtils
.
getInstance
().
incrementAdRequestFailCount
()
loadingListener
?.
invoke
()
loadingListener
=
null
}
override
fun
onAdDisplayed
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdDisplayed"
)
AdDisplayUtils
.
getInstance
().
incrementAdDisplayCount
()
AdMaxEvent
.
showAd
(
p0
,
"interAd"
,
activityString
)
isInterOpenShowing
=
true
}
override
fun
onAdHidden
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdHidden"
)
onHidden
?.
invoke
()
onHidden
=
null
AdMaxOpenUtils
.
loadAppOpenAd
(
activity
)
// loadInterstitialAd(activity)
isInterOpenShowing
=
false
lastShowedOnHiddenTime
=
System
.
currentTimeMillis
()
}
override
fun
onAdClicked
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdClicked activity=$activityString"
)
AdDisplayUtils
.
getInstance
().
incrementAdClickCount
()
AdMaxEvent
.
clickAd
(
p0
,
"interAd"
)
}
override
fun
onAdDisplayFailed
(
p0
:
MaxAd
,
p1
:
MaxError
)
{
LogEx
.
logDebug
(
TAG
,
"onAdDisplayFailed"
)
onHidden
?.
invoke
()
onHidden
=
null
val
obj2
=
JSONObject
()
obj2
.
put
(
"code"
,
p1
.
code
)
obj2
.
put
(
"reason"
,
p1
.
message
)
obj2
.
put
(
"ad_unit"
,
"interAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj2
)
isInterOpenShowing
=
false
}
})
interstitialAd
?.
setRevenueListener
(
AdMaxEvent
.
EventOnPaidEventListener
())
}
}
fun
showInterstitialAd
(
activity
:
Activity
,
onHidden
:
(()
->
Unit
)?
=
null
)
{
setListener
(
activity
)
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
return
}
if
(
isAdExpired
())
{
val
obj2
=
JSONObject
()
obj2
.
put
(
"ad_unit"
,
"interAd"
)
EventUtils
.
event
(
"ad_expire"
,
ext
=
obj2
)
onHidden
?.
invoke
()
loadInterstitialAd
(
activity
)
return
}
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"interAd"
))
{
onHidden
?.
invoke
()
return
}
LogEx
.
logDebug
(
TAG
,
"showInterstitialAd,展示插屏广告"
)
val
obj1
=
JSONObject
()
obj1
.
put
(
"ad_unit"
,
"interAd"
)
EventUtils
.
event
(
"ad_prepare_show"
,
ext
=
obj1
)
isInterOpenShowing
=
false
if
(
interstitialAd
?.
isReady
==
true
)
{
LogEx
.
logDebug
(
TAG
,
"有缓存直接播放。"
)
this
.
onHidden
=
onHidden
showLoadingScreen
(
activity
)
{
startCountdownAndShowAd
{
interstitialAd
?.
showAd
(
activity
)
}
}
}
else
{
LogEx
.
logDebug
(
TAG
,
"展示广告时,没有缓存,需要拉取。"
)
val
obj2
=
JSONObject
()
obj2
.
put
(
"reason"
,
"no cache ad"
)
obj2
.
put
(
"ad_unit"
,
"interAd"
)
EventUtils
.
event
(
"ad_nocache_pull"
,
ext
=
obj2
)
val
loaded
=
loadInterstitialAd
(
activity
)
showLoadingScreen
(
activity
)
{}
if
(
loaded
)
{
LogEx
.
logDebug
(
TAG
,
"loaded=true"
)
loadingListener
=
{
LogEx
.
logDebug
(
TAG
,
"loadingListener"
)
if
(
interstitialAd
?.
isReady
==
true
)
{
this
.
onHidden
=
onHidden
startCountdownAndShowAd
{
loadingDialog
?.
dismiss
()
interstitialAd
?.
showAd
(
activity
)
}
}
else
{
loadingDialog
?.
dismiss
()
onHidden
?.
invoke
()
}
}
}
else
{
loadingDialog
?.
dismiss
()
LogEx
.
logDebug
(
TAG
,
"loaded=false"
)
onHidden
?.
invoke
()
}
}
}
private
fun
isAdExpired
():
Boolean
{
return
System
.
currentTimeMillis
()
-
interLoadTime
>
1000
*
60
*
60
}
private
fun
showAdDialogAndLoadInterstitial
(
activity
:
Activity
,
):
Dialog
?
{
var
customDialog
:
Dialog
?
=
null
if
(!
activity
.
isFinishing
&&
!
activity
.
isDestroyed
)
{
customDialog
=
CustomDialog
(
activity
,
R
.
layout
.
dialog_ad_loading
)
// 设置对话框的样式和内容
customDialog
.
show
()
}
return
customDialog
}
fun
loadInterstitialAd
(
activity
:
Activity
):
Boolean
{
setListener
(
activity
)
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"interAd"
))
{
return
false
}
LogEx
.
logDebug
(
TAG
,
"loadInterstitialAd"
)
val
reqId
=
UUID
.
randomUUID
().
toString
()
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"ad_type"
,
"interAd"
)
EventUtils
.
event
(
"ad_pull_start"
,
ext
=
obj
)
interstitialAd
?.
loadAd
()
AdDisplayUtils
.
getInstance
().
incrementAdRequestCount
()
return
true
}
private
fun
showLoadingScreen
(
activity
:
Activity
,
callBack
:
(()
->
Unit
))
{
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
return
}
if
(
loadingDialog
==
null
)
{
loadingDialog
=
Dialog
(
activity
).
apply
{
requestWindowFeature
(
Window
.
FEATURE_NO_TITLE
)
setContentView
(
R
.
layout
.
dialog_loading
)
setCancelable
(
false
)
window
?.
setBackgroundDrawable
(
ContextCompat
.
getDrawable
(
activity
,
R
.
drawable
.
bg_loadingads
))
}
}
val
imageView
=
loadingDialog
?.
findViewById
<
ImageView
>(
R
.
id
.
loading_image
)
val
countdownTextView
=
loadingDialog
?.
findViewById
<
TextView
>(
R
.
id
.
countdown_text
)
imageView
?.
let
{
startRotateAnimation
(
it
)
}
// 开始旋转动画
// 控制倒计时文本是否显示
countdownTextView
?.
visibility
=
View
.
VISIBLE
loadingDialog
?.
show
()
callBack
.
invoke
()
}
private
fun
startRotateAnimation
(
imageView
:
ImageView
)
{
ObjectAnimator
.
ofFloat
(
imageView
,
"rotation"
,
0f
,
360f
).
apply
{
duration
=
3000
// 持续 3 秒
repeatCount
=
ObjectAnimator
.
INFINITE
// 无限循环
start
()
}
}
private
var
countdown
=
3
// 初始倒计时
private
var
countdownHandler
:
Handler
?
=
null
private
var
loadingDialog
:
Dialog
?
=
null
private
fun
startCountdownAndShowAd
(
callBack
:
(()
->
Unit
)?)
{
countdown
=
3
updateCountdownText
(
count
=
countdown
)
// 显示倒计时文本
countdownHandler
?.
removeCallbacksAndMessages
(
null
)
countdownHandler
=
Handler
(
Looper
.
getMainLooper
())
countdownHandler
?.
post
(
object
:
Runnable
{
override
fun
run
()
{
if
(
countdown
<=
0
)
{
loadingDialog
?.
dismiss
()
loadingDialog
=
null
callBack
?.
invoke
()
}
else
{
updateCountdownText
(
countdown
)
// 更新倒计时文本
countdown
--
countdownHandler
?.
postDelayed
(
this
,
1000
)
}
}
})
}
// 更新倒计时文本并控制是否显示括号和数字
private
fun
updateCountdownText
(
count
:
Int
)
{
val
countdownTextView
=
loadingDialog
?.
findViewById
<
TextView
>(
R
.
id
.
countdown_text
)
// LogEx.logDebug(AdmobOpenUtils.TAG, "updateCountdownText $count countdownTextView=$countdownTextView")
countdownTextView
?.
text
=
"Ads are about to be shown($count)"
countdownTextView
?.
visibility
=
View
.
VISIBLE
}
}
app/src/main/java/com/base/filerecoveryrecyclebin/ads/max/AdMaxNativeUtils.kt
View file @
230eb832
//package com.base.filerecoveryrecyclebin.ads.max
//
//import android.app.Activity
//import android.content.Context
//import android.view.ViewGroup
//import androidx.core.view.isVisible
//import com.applovin.mediation.MaxAd
//import com.applovin.mediation.MaxError
//import com.applovin.mediation.nativeAds.MaxNativeAdListener
//import com.applovin.mediation.nativeAds.MaxNativeAdLoader
//import com.applovin.mediation.nativeAds.MaxNativeAdView
//import com.applovin.mediation.nativeAds.MaxNativeAdViewBinder
//import com.base.filerecoveryrecyclebin.R
//import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
//import com.base.filerecoveryrecyclebin.help.BaseApplication
//import com.base.filerecoveryrecyclebin.help.ConfigHelper
//import com.base.filerecoveryrecyclebin.utils.EventUtils
//import com.base.filerecoveryrecyclebin.utils.LogEx
//import org.json.JSONObject
//
//object AdMaxNativeUtils {
//
// private val TAG = "AdMaxNativeUtils"
// private var nativeAdLoader: MaxNativeAdLoader = MaxNativeAdLoader(ConfigHelper.nativeAdMaxId, BaseApplication.context)
// private var nativeAd: MaxAd? = null
// private var nativeLoadTime = Long.MAX_VALUE
// private var haveSetAdListener: Boolean = false
// private var loadingListener: (() -> Unit)? = null
// private var activityString: String = ""
// private fun setNativeAdListener() {
// if (!haveSetAdListener) {
// //加载展示监听
// nativeAdLoader.setNativeAdListener(object : MaxNativeAdListener() {
// override fun onNativeAdLoaded(nativeAdView: MaxNativeAdView?, ad: MaxAd) {
// LogEx.logDebug(TAG, "onNativeAdLoaded")
// // Cleanup any pre-existing native ad to prevent memory leaks.
// if (nativeAd?.nativeAd?.isExpired == true) {
// nativeAdLoader.destroy(nativeAd)
// }
//
// // Save ad to be rendered later.
// nativeAd = ad
// nativeLoadTime = System.currentTimeMillis()
// loadingListener?.invoke()
// loadingListener = null
// }
//
// override fun onNativeAdLoadFailed(p0: String, p1: MaxError) {
// super.onNativeAdLoadFailed(p0, p1)
// loadingListener?.invoke()
// loadingListener = null
// LogEx.logDebug(TAG, "onNativeAdLoadFailed")
// LogEx.logDebug(TAG, "code=${p1.code}")
// LogEx.logDebug(TAG, "message=${p1.message}")
//// AdDisplayUtils.getInstance().incrementAdRequestFailCount()
// val obj2 = JSONObject()
// obj2.put("reason", "no_ad")
// obj2.put("ad_unit", "nativeAd")
// EventUtils.event("ad_show_error", ext = obj2)
// }
//
// override fun onNativeAdClicked(p0: MaxAd) {
// super.onNativeAdClicked(p0)
// LogEx.logDebug(TAG, "onNativeAdClicked")
//// AdDisplayUtils.getInstance().incrementAdClickCount()
// nativeAd?.let { AdMaxEvent.clickAd(it, "nativeAd") }
// }
//
// override fun onNativeAdExpired(p0: MaxAd) {
// super.onNativeAdExpired(p0)
// }
// })
//
//
// //广告价格监听
// nativeAdLoader.setRevenueListener { ad ->
//
// }
//
//
// haveSetAdListener = true
//
//
// }
// }
//
// private fun createNativeAdView(context: Context, layout: Int): MaxNativeAdView {
//
//// val binder: MaxNativeAdViewBinder = MaxNativeAdViewBinder.Builder(R.layout.layout_max_native_custom)
//// .setTitleTextViewId(R.id.title_text_view)
//// .setBodyTextViewId(R.id.body_text_view)
//// .setAdvertiserTextViewId(R.id.advertiser_text_view)
//// .setIconImageViewId(R.id.icon_image_view)
//// .setMediaContentViewGroupId(R.id.media_view_container)
//// .setOptionsContentViewGroupId(R.id.options_view)
//// .setStarRatingContentViewGroupId(R.id.star_rating_view)
//// .setCallToActionButtonId(R.id.cta_button)
//// .build()
//// return MaxNativeAdView(binder, context)
//
// val binder: MaxNativeAdViewBinder = MaxNativeAdViewBinder.Builder(layout)
// .setTitleTextViewId(R.id.ad_headline)
// .setBodyTextViewId(R.id.ad_body)
//// .setAdvertiserTextViewId(R.id.advertiser_text_view)
// .setIconImageViewId(R.id.ad_app_icon)
// .setMediaContentViewGroupId(R.id.ad_media)
//// .setOptionsContentViewGroupId(R.id.options_view)
//// .setStarRatingContentViewGroupId(R.id.star_rating_view)
// .setCallToActionButtonId(R.id.ad_call_to_action)
package
com.base.filerecoveryrecyclebin.ads.max
import
android.app.Activity
import
android.content.Context
import
android.view.ViewGroup
import
androidx.core.view.isVisible
import
com.applovin.mediation.MaxAd
import
com.applovin.mediation.MaxError
import
com.applovin.mediation.nativeAds.MaxNativeAdListener
import
com.applovin.mediation.nativeAds.MaxNativeAdLoader
import
com.applovin.mediation.nativeAds.MaxNativeAdView
import
com.applovin.mediation.nativeAds.MaxNativeAdViewBinder
import
com.base.filerecoveryrecyclebin.BuildConfig
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import
com.base.filerecoveryrecyclebin.help.BaseApplication
import
com.base.filerecoveryrecyclebin.help.ConfigHelper
import
com.base.filerecoveryrecyclebin.utils.EventUtils
import
com.base.filerecoveryrecyclebin.utils.LogEx
import
org.json.JSONObject
object
AdMaxNativeUtils
{
private
val
TAG
=
"AdMaxNativeUtils"
private
var
nativeAdLoader
:
MaxNativeAdLoader
=
MaxNativeAdLoader
(
ConfigHelper
.
nativeAdMaxId
,
BaseApplication
.
context
)
private
var
nativeAd
:
MaxAd
?
=
null
private
var
nativeLoadTime
=
Long
.
MAX_VALUE
private
var
haveSetAdListener
:
Boolean
=
false
private
var
loadingListener
:
(()
->
Unit
)?
=
null
private
var
activityString
:
String
=
""
private
fun
setNativeAdListener
()
{
if
(!
haveSetAdListener
)
{
//加载展示监听
nativeAdLoader
.
setNativeAdListener
(
object
:
MaxNativeAdListener
()
{
override
fun
onNativeAdLoaded
(
nativeAdView
:
MaxNativeAdView
?,
ad
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onNativeAdLoaded"
)
// Cleanup any pre-existing native ad to prevent memory leaks.
if
(
nativeAd
?.
nativeAd
?.
isExpired
==
true
)
{
nativeAdLoader
.
destroy
(
nativeAd
)
}
// Save ad to be rendered later.
nativeAd
=
ad
nativeLoadTime
=
System
.
currentTimeMillis
()
loadingListener
?.
invoke
()
loadingListener
=
null
}
override
fun
onNativeAdLoadFailed
(
p0
:
String
,
p1
:
MaxError
)
{
super
.
onNativeAdLoadFailed
(
p0
,
p1
)
loadingListener
?.
invoke
()
loadingListener
=
null
LogEx
.
logDebug
(
TAG
,
"onNativeAdLoadFailed"
)
LogEx
.
logDebug
(
TAG
,
"code=${p1.code}"
)
LogEx
.
logDebug
(
TAG
,
"message=${p1.message}"
)
// AdDisplayUtils.getInstance().incrementAdRequestFailCount()
val
obj2
=
JSONObject
()
obj2
.
put
(
"reason"
,
"no_ad"
)
obj2
.
put
(
"ad_unit"
,
"nativeAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj2
)
}
override
fun
onNativeAdClicked
(
p0
:
MaxAd
)
{
super
.
onNativeAdClicked
(
p0
)
LogEx
.
logDebug
(
TAG
,
"onNativeAdClicked"
)
// AdDisplayUtils.getInstance().incrementAdClickCount()
nativeAd
?.
let
{
AdMaxEvent
.
clickAd
(
it
,
"nativeAd"
)
}
}
override
fun
onNativeAdExpired
(
p0
:
MaxAd
)
{
super
.
onNativeAdExpired
(
p0
)
}
})
//广告价格监听
nativeAdLoader
.
setRevenueListener
{
ad
->
}
haveSetAdListener
=
true
}
}
private
fun
createNativeAdView
(
context
:
Context
,
layout
:
Int
):
MaxNativeAdView
{
// val binder: MaxNativeAdViewBinder = MaxNativeAdViewBinder.Builder(R.layout.layout_max_native_custom)
// .setTitleTextViewId(R.id.title_text_view)
// .setBodyTextViewId(R.id.body_text_view)
// .setAdvertiserTextViewId(R.id.advertiser_text_view)
// .setIconImageViewId(R.id.icon_image_view)
// .setMediaContentViewGroupId(R.id.media_view_container)
// .setOptionsContentViewGroupId(R.id.options_view)
// .setStarRatingContentViewGroupId(R.id.star_rating_view)
// .setCallToActionButtonId(R.id.cta_button)
// .build()
// return MaxNativeAdView(binder, context)
// }
//
// fun loadNativeAd() {
// setNativeAdListener()
// if (!AdDisplayUtils.getInstance().shouldShowAd("nativeAd")) {
// return
// }
// nativeAdLoader.loadAd()
// }
//
//
// fun showNativeAd(activity: Activity, parent: ViewGroup, layout: Int) {
// activityString = activity::class.java.toString().split(".").last()
// LogEx.logDebug(TAG, "activityString=$activityString")
// setNativeAdListener()
//
// if (!AdDisplayUtils.getInstance().shouldShowAd("nativeAd")) {
// LogEx.logDebug(TAG, "!shouldShowAd")
// return
// }
//
// if (nativeAd?.nativeAd?.isExpired == true || nativeAd == null) {
// LogEx.logDebug(TAG, "nativeAd?.nativeAd?.isExpired == true")
// nativeAdLoader.destroy(nativeAd)
// nativeAdLoader.loadAd()
// loadingListener = {
// if (nativeAd != null) {
// showReadyNative(activity, parent, layout)
// }
// }
// } else {
// showReadyNative(activity, parent, layout)
// }
//
// }
//
// private fun showReadyNative(activity: Activity, parent: ViewGroup, layout: Int) {
// val adView = createNativeAdView(activity, layout)
//
// LogEx.logDebug(TAG, "showReadNative adUnitId=${nativeAd?.adUnitId}")
// parent.isVisible = true
// parent.removeAllViews()
// nativeAdLoader.render(adView, nativeAd)
// parent.addView(adView)
// nativeAd?.let { AdMaxEvent.showAd(it, "nativeAd", activityString) }
//// AdDisplayUtils.getInstance().incrementAdDisplayCount()
//
// LogEx.logDebug(TAG, "loadingListener finish")
// }
//
//}
\ No newline at end of file
val
binder
:
MaxNativeAdViewBinder
=
MaxNativeAdViewBinder
.
Builder
(
layout
)
.
setTitleTextViewId
(
R
.
id
.
ad_headline
)
.
setBodyTextViewId
(
R
.
id
.
ad_body
)
// .setAdvertiserTextViewId(R.id.advertiser_text_view)
.
setIconImageViewId
(
R
.
id
.
ad_app_icon
)
.
setMediaContentViewGroupId
(
R
.
id
.
ad_media
)
// .setOptionsContentViewGroupId(R.id.options_view)
// .setStarRatingContentViewGroupId(R.id.star_rating_view)
.
setCallToActionButtonId
(
R
.
id
.
ad_call_to_action
)
.
build
()
return
MaxNativeAdView
(
binder
,
context
)
}
fun
loadNativeAd
()
{
setNativeAdListener
()
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"nativeAd"
))
{
return
}
nativeAdLoader
.
loadAd
()
}
fun
showNativeAd
(
activity
:
Activity
,
parent
:
ViewGroup
,
layout
:
Int
)
{
activityString
=
activity
::
class
.
java
.
toString
().
split
(
"."
).
last
()
LogEx
.
logDebug
(
TAG
,
"activityString=$activityString"
)
setNativeAdListener
()
if
(!
BuildConfig
.
DEBUG
)
{
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"nativeAd"
))
{
LogEx
.
logDebug
(
TAG
,
"!shouldShowAd"
)
return
}
}
if
(
nativeAd
?.
nativeAd
?.
isExpired
==
true
||
nativeAd
==
null
)
{
LogEx
.
logDebug
(
TAG
,
"nativeAd?.nativeAd?.isExpired == true"
)
nativeAdLoader
.
destroy
(
nativeAd
)
nativeAdLoader
.
loadAd
()
loadingListener
=
{
LogEx
.
logDebug
(
TAG
,
"loadingListener nativeAd==$nativeAd"
)
if
(
nativeAd
!=
null
)
{
showReadyNative
(
activity
,
parent
,
layout
)
}
}
}
else
{
showReadyNative
(
activity
,
parent
,
layout
)
}
}
private
fun
showReadyNative
(
activity
:
Activity
,
parent
:
ViewGroup
,
layout
:
Int
)
{
val
adView
=
createNativeAdView
(
activity
,
layout
)
LogEx
.
logDebug
(
TAG
,
"showReadNative adUnitId=${nativeAd?.adUnitId}"
)
parent
.
isVisible
=
true
parent
.
removeAllViews
()
nativeAdLoader
.
render
(
adView
,
nativeAd
)
parent
.
addView
(
adView
)
nativeAd
?.
let
{
AdMaxEvent
.
showAd
(
it
,
"nativeAd"
,
activityString
)
}
// AdDisplayUtils.getInstance().incrementAdDisplayCount()
LogEx
.
logDebug
(
TAG
,
"loadingListener finish"
)
}
}
\ No newline at end of file
app/src/main/java/com/base/filerecoveryrecyclebin/ads/max/AdMaxOpenUtils.kt
View file @
230eb832
//package com.base.filerecoveryrecyclebin.ads.max
//
//import android.app.Activity
//import com.applovin.mediation.MaxAd
//import com.applovin.mediation.MaxAdListener
//import com.applovin.mediation.MaxError
//import com.applovin.mediation.ads.MaxAppOpenAd
//import com.base.filerecoveryrecyclebin.MyApplication.Companion.isInterOpenShowing
//import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
//import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper.isAdInit
//import com.base.filerecoveryrecyclebin.help.ConfigHelper
//import com.base.filerecoveryrecyclebin.utils.EventUtils
//import com.base.filerecoveryrecyclebin.utils.LogEx
//import org.json.JSONObject
//import java.util.UUID
//
//object AdMaxOpenUtils {
// private val TAG = "AdMaxOpenUtils"
// private var appOpenAd: MaxAppOpenAd? = null
// private var openLoadTime = Long.MAX_VALUE
// private var onHidden: (() -> Unit)? = null
// private var loadingListener: ((flag: Boolean) -> Unit)? = null
// private var activityString = ""
//
// private fun setListener(activity: Activity) {
// activityString = activity::class.java.toString().split(".").last()
// if (appOpenAd == null) {
// appOpenAd = MaxAppOpenAd(ConfigHelper.openAdMaxId, activity)
//
// appOpenAd?.setListener(object : MaxAdListener {
// override fun onAdLoaded(p0: MaxAd) {
// LogEx.logDebug(TAG, "广告拉取成功")
// openLoadTime = System.currentTimeMillis()
// loadingListener?.invoke(true)
// loadingListener = null
// AdMaxEvent.pullAd(p0, "openAd")
// }
//
// override fun onAdLoadFailed(p0: String, p1: MaxError) {
// LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p0)
// LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p1.message.toString())
// LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p1.code)
// loadingListener?.invoke(false)
// loadingListener = null
// AdDisplayUtils.getInstance().incrementAdRequestFailCount()
// val reqId = UUID.randomUUID().toString()
// AdMaxEvent.pullAd(null, "openAd", reqId = reqId, error = p1.message, code = p1.code)
// }
//
// override fun onAdDisplayed(p0: MaxAd) {
// AdDisplayUtils.getInstance().incrementAdDisplayCount()
// AdMaxEvent.showAd(p0, "openAd", activityString)
//
// isInterOpenShowing = true
// }
//
// override fun onAdHidden(p0: MaxAd) {
// LogEx.logDebug(TAG, "onAdHidden")
// onHidden?.invoke()
// onHidden = null
// loadAppOpenAd(activity)
//
// isInterOpenShowing = false
// }
//
// override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
// LogEx.logDebug(TAG, "onAdDisplayFailed")
// onHidden?.invoke()
// onHidden = null
// loadAppOpenAd(activity)
// val obj = JSONObject()
// obj.put("code", p1.code)
// obj.put("reason", p1.message)
// obj.put("ad_unit", "openAd")
// EventUtils.event("ad_show_error", ext = obj)
//
// isInterOpenShowing = false
// }
//
// override fun onAdClicked(p0: MaxAd) {
// AdDisplayUtils.getInstance().incrementAdClickCount()
// AdMaxEvent.clickAd(p0, "openAd")
// }
//
// })
//
// appOpenAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
// }
// }
//
// fun showAppOpenAd(
// activity: Activity,
// loadCallBack: ((loaded: Boolean) -> Unit)? = null,
// onHidden: (() -> Unit)? = null
// ) {
//
// setListener(activity)
//
// if (activity.isFinishing || activity.isDestroyed) {
// return
// }
//
// if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
// LogEx.logDebug(TAG, "!shouldShowAd")
// onHidden?.invoke()
// return
// }
//
// if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) {
// LogEx.logDebug(TAG, "openLoadTime > ")
// onHidden?.invoke()
// val obj2 = JSONObject()
// obj2.put("ad_unit", "openAd")
// EventUtils.event("ad_expire", ext = obj2)
// appOpenAd?.loadAd()
// }
//
//
//
// LogEx.logDebug(TAG, "showAppOpenAd")
// val obj1 = JSONObject()
// obj1.put("ad_unit", "openAd")
// EventUtils.event("ad_prepare_show", ext = obj1)
//
// isInterOpenShowing = false
//
// if (appOpenAd?.isReady == true) {
// LogEx.logDebug(TAG, "广告准备好了,展示广告")
// AdMaxOpenUtils.onHidden = onHidden
// appOpenAd?.showAd()
// } else {
// val obj = JSONObject()
// obj.put("reason", "no cache ad")
// obj.put("ad_unit", "openAd")
// EventUtils.event("ad_nocache_pull", ext = obj)
// LogEx.logDebug(TAG, "展示时候,发现广告需要拉取")
// val loaded = loadAppOpenAd(activity)
// if (loaded) {
// loadingListener = { loadResult ->
// loadCallBack?.invoke(loadResult)
// LogEx.logDebug(TAG, "loadingListener callback")
// if (appOpenAd?.isReady == true) {
// AdMaxOpenUtils.onHidden = onHidden
// appOpenAd?.showAd()
// } else {
// onHidden?.invoke()
// }
// }
// } else {
// onHidden?.invoke()
// }
//
// }
// }
//
// fun loadAppOpenAd(activity: Activity): Boolean {
// setListener(activity)
//
// if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
// LogEx.logDebug(TAG, "!shouldShowAd")
// return false
// }
//
// val reqId = UUID.randomUUID().toString()
// val obj = JSONObject()
// obj.put("req_id", reqId)
// obj.put("ad_type", "openAd")
// EventUtils.event("ad_pull_start", ext = obj)
// appOpenAd?.loadAd()
// AdDisplayUtils.getInstance().incrementAdRequestCount()
// return true
// }
//
// fun isOpenAdLoaded(): Boolean {
// return appOpenAd?.isReady == true
// }
//
//}
//
package
com.base.filerecoveryrecyclebin.ads.max
import
android.animation.ObjectAnimator
import
android.app.Activity
import
android.app.Dialog
import
android.os.Handler
import
android.os.Looper
import
android.view.View
import
android.view.Window
import
android.widget.ImageView
import
android.widget.TextView
import
androidx.core.content.ContextCompat
import
com.applovin.mediation.MaxAd
import
com.applovin.mediation.MaxAdListener
import
com.applovin.mediation.MaxError
import
com.applovin.mediation.ads.MaxAppOpenAd
import
com.base.filerecoveryrecyclebin.MyApplication.Companion.isInterOpenShowing
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.activity.splash.Splash2Activity
import
com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import
com.base.filerecoveryrecyclebin.help.ConfigHelper
import
com.base.filerecoveryrecyclebin.utils.EventUtils
import
com.base.filerecoveryrecyclebin.utils.LogEx
import
org.json.JSONObject
import
java.util.UUID
object
AdMaxOpenUtils
{
private
val
TAG
=
"AdMaxOpenUtils"
private
var
appOpenAd
:
MaxAppOpenAd
?
=
null
private
var
openLoadTime
=
Long
.
MAX_VALUE
private
var
onHidden
:
(()
->
Unit
)?
=
null
private
var
loadingListener
:
((
flag
:
Boolean
)
->
Unit
)?
=
null
private
var
activityString
=
""
private
fun
setListener
(
activity
:
Activity
)
{
activityString
=
activity
::
class
.
java
.
toString
().
split
(
"."
).
last
()
if
(
appOpenAd
==
null
)
{
appOpenAd
=
MaxAppOpenAd
(
ConfigHelper
.
openAdMaxId
,
activity
)
appOpenAd
?.
setListener
(
object
:
MaxAdListener
{
override
fun
onAdLoaded
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"广告拉取成功"
)
openLoadTime
=
System
.
currentTimeMillis
()
loadingListener
?.
invoke
(
true
)
loadingListener
=
null
AdMaxEvent
.
pullAd
(
p0
,
"openAd"
)
}
override
fun
onAdLoadFailed
(
p0
:
String
,
p1
:
MaxError
)
{
LogEx
.
logDebug
(
TAG
,
"广告拉取失败了,onAdLoadFailed:"
+
p0
)
LogEx
.
logDebug
(
TAG
,
"广告拉取失败了,onAdLoadFailed:"
+
p1
.
message
.
toString
())
LogEx
.
logDebug
(
TAG
,
"广告拉取失败了,onAdLoadFailed:"
+
p1
.
code
)
loadingListener
?.
invoke
(
false
)
loadingListener
=
null
AdDisplayUtils
.
getInstance
().
incrementAdRequestFailCount
()
val
reqId
=
UUID
.
randomUUID
().
toString
()
AdMaxEvent
.
pullAd
(
null
,
"openAd"
,
reqId
=
reqId
,
error
=
p1
.
message
,
code
=
p1
.
code
)
}
override
fun
onAdDisplayed
(
p0
:
MaxAd
)
{
AdDisplayUtils
.
getInstance
().
incrementAdDisplayCount
()
AdMaxEvent
.
showAd
(
p0
,
"openAd"
,
activityString
)
isInterOpenShowing
=
true
}
override
fun
onAdHidden
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdHidden"
)
onHidden
?.
invoke
()
onHidden
=
null
loadAppOpenAd
(
activity
)
isInterOpenShowing
=
false
}
override
fun
onAdDisplayFailed
(
p0
:
MaxAd
,
p1
:
MaxError
)
{
LogEx
.
logDebug
(
TAG
,
"onAdDisplayFailed"
)
onHidden
?.
invoke
()
onHidden
=
null
loadAppOpenAd
(
activity
)
val
obj
=
JSONObject
()
obj
.
put
(
"code"
,
p1
.
code
)
obj
.
put
(
"reason"
,
p1
.
message
)
obj
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj
)
isInterOpenShowing
=
false
}
override
fun
onAdClicked
(
p0
:
MaxAd
)
{
AdDisplayUtils
.
getInstance
().
incrementAdClickCount
()
AdMaxEvent
.
clickAd
(
p0
,
"openAd"
)
}
})
appOpenAd
?.
setRevenueListener
(
AdMaxEvent
.
EventOnPaidEventListener
())
}
}
fun
showAppOpenAd
(
activity
:
Activity
,
showBefore
:
((
flag
:
Boolean
)
->
Unit
)?
=
null
,
loadCallBack
:
((
loaded
:
Boolean
)
->
Unit
)?
=
null
,
onHidden
:
(()
->
Unit
)?
=
null
)
{
setListener
(
activity
)
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
return
}
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"openAd"
))
{
LogEx
.
logDebug
(
TAG
,
"!shouldShowAd"
)
onHidden
?.
invoke
()
return
}
if
(
System
.
currentTimeMillis
()
-
openLoadTime
>
1000
*
60
*
60
)
{
LogEx
.
logDebug
(
TAG
,
"openLoadTime > "
)
onHidden
?.
invoke
()
val
obj2
=
JSONObject
()
obj2
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_expire"
,
ext
=
obj2
)
appOpenAd
?.
loadAd
()
}
LogEx
.
logDebug
(
TAG
,
"showAppOpenAd"
)
val
obj1
=
JSONObject
()
obj1
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_prepare_show"
,
ext
=
obj1
)
isInterOpenShowing
=
false
if
(
appOpenAd
?.
isReady
==
true
)
{
LogEx
.
logDebug
(
TAG
,
"广告准备好了,展示广告"
)
AdMaxOpenUtils
.
onHidden
=
onHidden
LogEx
.
logDebug
(
TAG
,
"Splash2Activity.isSplashHot=${Splash2Activity.isSplashHot}"
)
showBefore
?.
invoke
(
true
)
if
(
Splash2Activity
.
isSplashHot
)
{
startCountdownAndShowAd
{
appOpenAd
?.
showAd
()
}
}
else
{
appOpenAd
?.
showAd
()
}
}
else
{
val
obj
=
JSONObject
()
obj
.
put
(
"reason"
,
"no cache ad"
)
obj
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_nocache_pull"
,
ext
=
obj
)
LogEx
.
logDebug
(
TAG
,
"展示时候,发现广告需要拉取"
)
val
loaded
=
loadAppOpenAd
(
activity
)
if
(
loaded
)
{
loadingListener
=
{
loadResult
->
loadCallBack
?.
invoke
(
loadResult
)
LogEx
.
logDebug
(
TAG
,
"loadingListener callback"
)
if
(
appOpenAd
?.
isReady
==
true
)
{
AdMaxOpenUtils
.
onHidden
=
onHidden
showBefore
?.
invoke
(
true
)
LogEx
.
logDebug
(
TAG
,
"Splash2Activity.isSplashHot=${Splash2Activity.isSplashHot}"
)
if
(
Splash2Activity
.
isSplashHot
)
{
startCountdownAndShowAd
{
appOpenAd
?.
showAd
()
}
}
else
{
appOpenAd
?.
showAd
()
}
}
else
{
showBefore
?.
invoke
(
false
)
onHidden
?.
invoke
()
}
}
}
else
{
onHidden
?.
invoke
()
}
}
}
fun
loadAppOpenAd
(
activity
:
Activity
):
Boolean
{
setListener
(
activity
)
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"openAd"
))
{
LogEx
.
logDebug
(
TAG
,
"!shouldShowAd"
)
return
false
}
val
reqId
=
UUID
.
randomUUID
().
toString
()
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"ad_type"
,
"openAd"
)
EventUtils
.
event
(
"ad_pull_start"
,
ext
=
obj
)
appOpenAd
?.
loadAd
()
AdDisplayUtils
.
getInstance
().
incrementAdRequestCount
()
return
true
}
fun
isOpenAdLoaded
():
Boolean
{
return
appOpenAd
?.
isReady
==
true
}
private
fun
showLoadingScreen
(
activity
:
Activity
,
callBack
:
(()
->
Unit
))
{
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
return
}
if
(
loadingDialog
==
null
)
{
loadingDialog
=
Dialog
(
activity
).
apply
{
requestWindowFeature
(
Window
.
FEATURE_NO_TITLE
)
setContentView
(
R
.
layout
.
dialog_loading
)
setCancelable
(
false
)
window
?.
setBackgroundDrawable
(
ContextCompat
.
getDrawable
(
activity
,
R
.
drawable
.
bg_loadingads
))
}
}
val
imageView
=
loadingDialog
?.
findViewById
<
ImageView
>(
R
.
id
.
loading_image
)
val
countdownTextView
=
loadingDialog
?.
findViewById
<
TextView
>(
R
.
id
.
countdown_text
)
imageView
?.
let
{
startRotateAnimation
(
it
)
}
// 开始旋转动画
// 控制倒计时文本是否显示
countdownTextView
?.
visibility
=
View
.
VISIBLE
loadingDialog
?.
show
()
startCountdownAndShowAd
(
callBack
=
callBack
)
}
private
fun
startRotateAnimation
(
imageView
:
ImageView
)
{
ObjectAnimator
.
ofFloat
(
imageView
,
"rotation"
,
0f
,
360f
).
apply
{
duration
=
3000
// 持续 3 秒
repeatCount
=
ObjectAnimator
.
INFINITE
// 无限循环
start
()
}
}
private
var
countdown
=
3
// 初始倒计时
private
var
countdownHandler
:
Handler
?
=
null
private
var
loadingDialog
:
Dialog
?
=
null
private
fun
startCountdownAndShowAd
(
callBack
:
(()
->
Unit
)?)
{
countdown
=
3
updateCountdownText
(
count
=
countdown
)
// 显示倒计时文本
countdownHandler
?.
removeCallbacksAndMessages
(
null
)
countdownHandler
=
Handler
(
Looper
.
getMainLooper
())
countdownHandler
?.
post
(
object
:
Runnable
{
override
fun
run
()
{
if
(
countdown
<=
0
)
{
loadingDialog
?.
dismiss
()
Splash2Activity
.
progressCallBack
=
null
callBack
?.
invoke
()
}
else
{
Splash2Activity
.
progressCallBack
?.
invoke
()
updateCountdownText
(
countdown
)
// 更新倒计时文本
countdown
--
LogEx
.
logDebug
(
TAG
,
"startCountdownAndShowAd countdown=$countdown"
)
countdownHandler
?.
postDelayed
(
this
,
1000
)
}
}
})
}
// 更新倒计时文本并控制是否显示括号和数字
private
fun
updateCountdownText
(
count
:
Int
)
{
val
countdownTextView
=
loadingDialog
?.
findViewById
<
TextView
>(
R
.
id
.
countdown_text
)
// LogEx.logDebug(AdmobOpenUtils.TAG, "updateCountdownText $count countdownTextView=$countdownTextView")
countdownTextView
?.
text
=
"Ads are about to be shown($count)"
countdownTextView
?.
visibility
=
View
.
VISIBLE
}
}
app/src/main/java/com/base/filerecoveryrecyclebin/bean/ConstObject.kt
View file @
230eb832
...
...
@@ -11,8 +11,6 @@ object ConstObject {
const
val
ID_RECOVERY_VIDEOS
=
13001
const
val
ID_RECOVERY_DOCUMENTS
=
13002
const
val
ID_WHATSAPP
=
12001
const
val
ID_APP_PROCESS
=
12056
const
val
ID_APP_MANAGER
=
12076
const
val
ID_BATTERY_INFO
=
12086
const
val
ID_WHEATHER
=
12087
const
val
ID_XINGZUO
=
12088
...
...
@@ -26,9 +24,6 @@ object ConstObject {
const
val
SCREENSHOT_CLEANER
=
"Screenshot Cleaner"
const
val
PRIVACY_SPACE
=
"Privacy Space"
const
val
RECYCLE_BIN
=
"Recycle Bin"
const
val
WHATSAPP_CLEANER
=
"WhatsApp Cleaner"
const
val
APP_PROCESS
=
"App Process"
const
val
APP_MANAGER
=
"App Manager"
const
val
LARGE_FILE
=
"Large File"
const
val
BATTERY_INFO
=
"Battery Info"
...
...
app/src/main/java/com/base/filerecoveryrecyclebin/fragment/GuideFragment.kt
View file @
230eb832
package
com.base.filerecoveryrecyclebin.fragment
import
android.annotation.SuppressLint
import
android.content.Intent
import
androidx.core.view.isVisible
import
com.base.filerecoveryrecyclebin.BuildConfig
import
com.base.filerecoveryrecyclebin.R
import
com.base.filerecoveryrecyclebin.activity.MainActivity
import
com.base.filerecoveryrecyclebin.activity.guide.CleanGuideActivity
import
com.base.filerecoveryrecyclebin.activity.guide.GuideActivity
import
com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import
com.base.filerecoveryrecyclebin.databinding.FragmentGuideBinding
import
com.base.filerecoveryrecyclebin.help.BaseFragment
import
com.base.filerecoveryrecyclebin.utils.AppPreferences
class
GuideFragment
:
BaseFragment
<
FragmentGuideBinding
>()
{
...
...
@@ -25,56 +21,50 @@ class GuideFragment : BaseFragment<FragmentGuideBinding>() {
@SuppressLint
(
"SetTextI18n"
)
override
fun
setView
()
{
if
(
page
==
1
)
{
binding
.
iv
.
setImageResource
(
R
.
mipmap
.
yindaoye1
)
binding
.
tv0
.
text
=
"Deleted precious photos or important\n"
+
"filesbyaccident?Regret kicks in."
binding
.
tvBtn
.
text
=
"Next"
}
else
if
(
page
==
2
)
{
binding
.
iv
.
setImageResource
(
R
.
mipmap
.
yindaoye2
)
binding
.
tv0
.
text
=
"Don't leave any regrets! Our APP\n"
+
"can accurately retrieve the files\n"
+
"you've accidentally deleted."
binding
.
tvBtn
.
text
=
"Next"
// binding.flSkip.visibility = View.GONE
}
else
{
binding
.
iv
.
isVisible
=
false
binding
.
tv0
.
isVisible
=
false
binding
.
idLl111
.
isVisible
=
true
binding
.
tvBtn
.
text
=
"Next"
when
(
page
)
{
0
->
{
binding
.
iv
.
setImageResource
(
R
.
mipmap
.
yindaotu1
)
binding
.
ivDian
.
setImageResource
(
R
.
mipmap
.
dian1
)
binding
.
tvContent
.
text
=
"Clean up clutter to unlock more space and\n"
+
"keep your phone running smoothly."
}
1
->
{
binding
.
iv
.
setImageResource
(
R
.
mipmap
.
yindaotu2
)
binding
.
ivDian
.
setImageResource
(
R
.
mipmap
.
dian2
)
binding
.
tvContent
.
text
=
"Quickly clear junk files and free up valuable\n"
+
"storage with just a few taps."
}
3
->
{
binding
.
iv
.
setImageResource
(
R
.
mipmap
.
yindaotu3
)
binding
.
ivDian
.
setImageResource
(
R
.
mipmap
.
dian3
)
binding
.
tvContent
.
text
=
"Clean photos,videos,and audio files to\n"
+
"save space and keep your phone tidy."
}
}
}
override
fun
setListener
()
{
super
.
setListener
()
binding
.
tvBtn
.
setOnClickListener
{
if
(
page
==
1
)
{
(
requireActivity
()
as
GuideActivity
).
setPosition
(
1
)
}
else
if
(
page
==
2
)
{
(
requireActivity
()
as
GuideActivity
).
setPosition
(
2
)
}
else
{
(
requireActivity
()
as
GuideActivity
).
lauchPermisson
()
}
}
binding
.
idTvAllow
.
setOnClickListener
{
(
requireActivity
()
as
GuideActivity
).
lauchPermisson
()
}
binding
.
idTvNotAllow
.
setOnClickListener
{
startActivity
(
Intent
(
requireContext
(),
MainActivity
::
class
.
java
))
requireActivity
().
finish
()
val
activity
=
requireActivity
()
as
GuideActivity
?
activity
?:
requireActivity
()
activity
?.
next
(
page
)
}
}
private
fun
jumpNext
()
{
val
showAd
=
AppPreferences
.
getInstance
().
getString
(
"isShowGuideAd"
,
"0"
)
?.
toInt
()
if
(
showAd
==
1
)
{
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
requireActivity
(),
isLoading
=
false
)
{
startActivity
(
Intent
(
requireContext
(),
CleanGuideActivity
::
class
.
java
))
requireActivity
().
finish
(
)
override
fun
onResume
()
{
super
.
onResume
()
if
(
AdmobMaxHelper
.
showGuideNativeSp
()
||
BuildConfig
.
DEBUG
)
{
kotlin
.
runCatching
{
AdmobMaxHelper
.
admobMaxShowNativeAd
(
requireActivity
(),
binding
.
flAd
)
}
}
else
{
startActivity
(
Intent
(
requireContext
(),
CleanGuideActivity
::
class
.
java
))
requireActivity
().
finish
()
}
}
}
\ No newline at end of file
app/src/main/res/drawable/bg_4676ff_69.xml
0 → 100644
View file @
230eb832
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<solid
android:color=
"#4676FF"
/>
<corners
android:radius=
"69dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_ebf3ff_16.xml
0 → 100644
View file @
230eb832
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<solid
android:color=
"#EBF3FF"
/>
<corners
android:radius=
"16dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_loadingads.xml
0 → 100644
View file @
230eb832
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<solid
android:color=
"#80000000"
/>
<corners
android:radius=
"0dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_select_yuan.xml
0 → 100644
View file @
230eb832
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<item
android:drawable=
"@mipmap/icon_yuan_s"
android:state_selected=
"true"
/>
<item
android:drawable=
"@mipmap/icon_yuan_n"
android:state_selected=
"false"
/>
</selector>
\ No newline at end of file
app/src/main/res/layout/activity_which_want_guide.xml
0 → 100644
View file @
230eb832
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:id=
"@+id/main"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:context=
".activity.guide.WhichWantGuideActivity"
>
<TextView
android:id=
"@+id/tv"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"35dp"
android:layout_marginTop=
"56dp"
android:gravity=
"center"
android:text=
"Which type do you want to clean?"
android:textSize=
"24sp"
android:textStyle=
"bold"
app:layout_constraintTop_toTopOf=
"parent"
/>
<LinearLayout
android:id=
"@+id/ll"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"20dp"
android:orientation=
"vertical"
app:layout_constraintTop_toBottomOf=
"@id/tv"
>
<LinearLayout
android:id=
"@+id/llPhoto"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"16dp"
android:layout_marginVertical=
"4dp"
android:background=
"@drawable/bg_ebf3ff_16"
android:foreground=
"?attr/selectableItemBackground"
android:orientation=
"horizontal"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginVertical=
"12dp"
android:layout_marginStart=
"20dp"
android:src=
"@mipmap/icon_photo"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"25dp"
android:layout_weight=
"1"
android:text=
"Photo"
android:textColor=
"#111111"
android:textSize=
"20sp"
android:textStyle=
"bold"
/>
<ImageView
android:id=
"@+id/iv1"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginEnd=
"20dp"
android:background=
"@drawable/bg_select_yuan"
tools:ignore=
"ContentDescription"
/>
</LinearLayout>
<LinearLayout
android:id=
"@+id/llVideo"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"16dp"
android:layout_marginVertical=
"4dp"
android:background=
"@drawable/bg_ebf3ff_16"
android:foreground=
"?attr/selectableItemBackground"
android:orientation=
"horizontal"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginVertical=
"12dp"
android:layout_marginStart=
"20dp"
android:src=
"@mipmap/icon_video"
/>
<TextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"25dp"
android:layout_weight=
"1"
android:text=
"Video"
android:textColor=
"#111111"
android:textSize=
"20sp"
android:textStyle=
"bold"
/>
<ImageView
android:id=
"@+id/iv2"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginEnd=
"20dp"
android:background=
"@drawable/bg_select_yuan"
/>
</LinearLayout>
<LinearLayout
android:id=
"@+id/llAudio"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"16dp"
android:layout_marginVertical=
"4dp"
android:background=
"@drawable/bg_ebf3ff_16"
android:foreground=
"?attr/selectableItemBackground"
android:orientation=
"horizontal"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginVertical=
"12dp"
android:layout_marginStart=
"20dp"
android:src=
"@mipmap/icon_audio"
/>
<TextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"25dp"
android:layout_weight=
"1"
android:text=
"Audio"
android:textColor=
"#111111"
android:textSize=
"20sp"
android:textStyle=
"bold"
/>
<ImageView
android:id=
"@+id/iv3"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginEnd=
"20dp"
android:background=
"@drawable/bg_select_yuan"
/>
</LinearLayout>
<LinearLayout
android:id=
"@+id/llDocument"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"16dp"
android:layout_marginVertical=
"4dp"
android:background=
"@drawable/bg_ebf3ff_16"
android:foreground=
"?attr/selectableItemBackground"
android:orientation=
"horizontal"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginVertical=
"12dp"
android:layout_marginStart=
"20dp"
android:src=
"@mipmap/icon_document"
/>
<TextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"25dp"
android:layout_weight=
"1"
android:text=
"Document"
android:textColor=
"#111111"
android:textSize=
"20sp"
android:textStyle=
"bold"
/>
<ImageView
android:id=
"@+id/iv4"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginEnd=
"20dp"
android:background=
"@drawable/bg_select_yuan"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id=
"@+id/llContinue"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"50dp"
android:orientation=
"horizontal"
android:padding=
"16dp"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/ll"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"Continue"
android:textColor=
"#1364FF"
android:textSize=
"17sp"
android:textStyle=
"bold"
/>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:src=
"@mipmap/jiantou"
/>
</LinearLayout>
<FrameLayout
android:id=
"@+id/flAd"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"#EDEDED"
android:minHeight=
"80dp"
app:layout_constraintBottom_toBottomOf=
"parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/dialog_loading.xml
0 → 100644
View file @
230eb832
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:gravity=
"center"
android:orientation=
"vertical"
>
<LinearLayout
android:layout_width=
"300dp"
android:layout_height=
"124dp"
android:layout_gravity=
"center"
android:background=
"@drawable/bg_ffffff_10"
tools:ignore=
"UselessParent"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<ImageView
android:id=
"@+id/loading_image"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginStart=
"20dp"
android:layout_marginTop=
"20dp"
android:scaleType=
"centerInside"
android:src=
"@mipmap/zhuanquan"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"10dp"
android:layout_marginTop=
"32dp"
android:text=
"AD LOADING"
android:textColor=
"#ff111111"
android:textSize=
"20sp"
app:layout_constraintStart_toEndOf=
"@id/loading_image"
app:layout_constraintTop_toTopOf=
"parent"
tools:ignore=
"HardcodedText"
/>
<TextView
android:id=
"@+id/countdown_text"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"6dp"
android:text=
"Ads are about to be shown"
android:textColor=
"#ff666666"
android:textSize=
"14sp"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/loading_image"
tools:ignore=
"HardcodedText"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</LinearLayout>
app/src/main/res/layout/fragment_guide.xml
View file @
230eb832
...
...
@@ -4,160 +4,94 @@
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#
EFEFE
F"
android:background=
"#
FFFFF
F"
tools:context=
".fragment.GuideFragment"
>
<TextView
android:id=
"@+id/tvSkip"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"50dp"
android:layout_marginEnd=
"20dp"
android:text=
"Skip"
android:textColor=
"#B6B6B6"
android:textSize=
"16sp"
android:visibility=
"gone"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
<ImageView
android:id=
"@+id/iv"
android:layout_width=
"
200dp
"
android:layout_height=
"
200dp
"
android:layout_width=
"
wrap_content
"
android:layout_height=
"
wrap_content
"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintVertical_bias=
"0.
25
"
app:layout_constraintVertical_bias=
"0.
3
"
tools:ignore=
"ContentDescription"
tools:src=
"@mipmap/yindaoye1"
/>
tools:src=
"@mipmap/yindaotu1"
/>
<
androidx.appcompat.widget.LinearLayoutCompat
android:id=
"@+id/
id_ll_111
"
<
TextView
android:id=
"@+id/
tvContent
"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"20dp"
android:layout_marginTop=
"18dp"
android:gravity=
"center"
android:orientation=
"vertical"
android:visibility=
"gone"
android:text=
"Clean up clutter to unlock more space and keep your phone running smoothly."
android:textColor=
"#000000"
android:textSize=
"16sp"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_to
TopOf=
"parent"
>
app:layout_constraintTop_to
BottomOf=
"@id/iv"
/
>
<TextView
android:id=
"@+id/id_tv_need"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"100dp"
android:text=
"Need to obtain storage permissions"
android:textColor=
"#000000"
android:textSize=
"15sp"
android:textStyle=
"bold"
android:visibility=
"visible"
/>
<androidx.appcompat.widget.LinearLayoutCompat
android:id=
"@+id/id_ll_need"
android:layout_width=
"264dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"74dp"
android:background=
"@drawable/shape_ffffff_r20"
android:gravity=
"center_horizontal"
android:orientation=
"vertical"
android:visibility=
"visible"
>
<androidx.appcompat.widget.AppCompatImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"12dp"
android:src=
"@mipmap/folder"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"20dp"
android:layout_marginTop=
"18dp"
android:text=
"Allow Dumpster: Photo Recovery to
access all files on your device?"
android:textColor=
"#7D7D7D"
android:textSize=
"13sp"
/>
<TextView
android:id=
"@+id/id_tv_allow"
android:layout_width=
"match_parent"
android:layout_height=
"38dp"
android:layout_marginHorizontal=
"40dp"
android:layout_marginTop=
"18dp"
android:background=
"@drawable/shape_f5f5f5_r8"
android:gravity=
"center"
android:text=
"allow"
android:textColor=
"#4773FF"
android:textSize=
"13sp"
/>
<TextView
android:id=
"@+id/id_tv_not_allow"
android:layout_width=
"match_parent"
android:layout_height=
"38dp"
android:layout_marginHorizontal=
"40dp"
android:layout_marginTop=
"4dp"
android:layout_marginBottom=
"12dp"
android:background=
"@drawable/shape_f5f5f5_r8"
android:gravity=
"center"
android:text=
"not allow"
android:textColor=
"#A7A7A7"
android:textSize=
"13sp"
/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
<LinearLayout
android:id=
"@+id/ll"
<ImageView
android:id=
"@+id/ivDian"
android:layout_width=
"wrap_content"
android:layout_height=
"120dp"
android:layout_marginTop=
"50dp"
android:orientation=
"vertical"
app:layout_constraintEnd_toEndOf=
"@id/iv"
app:layout_constraintStart_toStartOf=
"@id/iv"
app:layout_constraintTop_toBottomOf=
"@id/iv"
>
<TextView
android:id=
"@+id/tv_0"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginHorizontal=
"40dp"
android:text=
"Deleted precious photos or important
filesbyaccident?Regret kicks in."
android:textSize=
"15sp"
android:textStyle=
"bold"
tools:ignore=
"HardcodedText"
/>
<FrameLayout
android:layout_width=
"wrap_content"
android:layout_height=
"0dp"
android:layout_weight=
"1"
>
<TextView
android:id=
"@+id/tv_1"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:gravity=
"center|bottom"
android:text=
"One click scanning can restore various\ntypes of files such as photos,video,audio,\ndocuments,etc"
android:textSize=
"18sp"
android:visibility=
"gone"
tools:ignore=
"HardcodedText"
/>
</FrameLayout>
</LinearLayout>
<View
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
app:layout_constraintBottom_toTopOf=
"@id/tv_btn"
app:layout_constraintTop_toBottomOf=
"@id/ll"
/>
android:layout_height=
"wrap_content"
android:layout_marginTop=
"25dp"
android:src=
"@mipmap/dian1"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/tvContent"
/>
<TextView
android:id=
"@+id/tv_btn"
android:layout_width=
"match_parent"
android:layout_height=
"45dp"
android:layout_marginHorizontal=
"30dp"
android:layout_marginHorizontal=
"80dp"
android:layout_marginTop=
"24dp"
android:layout_marginBottom=
"28dp"
android:background=
"@drawable/bg_
577dfd_10
"
android:background=
"@drawable/bg_
4676ff_69
"
android:gravity=
"center"
android:text=
"Next"
android:textColor=
"@color/white"
android:textSize=
"18sp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/ivDian"
tools:ignore=
"MissingConstraints"
/>
<FrameLayout
android:id=
"@+id/flAd"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"#D9D9D9"
android:minHeight=
"75dp"
app:layout_constraintBottom_toBottomOf=
"parent"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:text=
"AD"
android:textColor=
"#ffffff"
android:textSize=
"16sp"
/>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/fragment_native_full.xml
0 → 100644
View file @
230eb832
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
android:id=
"@+id/flAd"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#D9D9D9"
tools:context=
".activity.guide.NativeFullFragment"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"bottom"
android:background=
"@color/white"
>
<TextView
android:layout_width=
"match_parent"
android:layout_height=
"80dp"
android:layout_marginTop=
"16dp"
android:background=
"#D9D9D9"
android:gravity=
"center"
android:text=
"ad"
android:textColor=
"@color/white"
android:textSize=
"16sp"
android:textStyle=
"bold"
/>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
app/src/main/res/layout/layout_max_native_full.xml
0 → 100644
View file @
230eb832
<FrameLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_margin=
"10dp"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_gravity=
"center"
android:background=
"@drawable/bg_ad_border_ffffff"
android:baselineAligned=
"false"
android:orientation=
"vertical"
android:padding=
"10dp"
tools:ignore=
"UselessParent"
>
<FrameLayout
android:id=
"@+id/ad_media"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_gravity=
"center_vertical"
android:layout_marginTop=
"10dp"
android:layout_weight=
"1"
/>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<ImageView
android:id=
"@+id/ad_app_icon"
android:layout_width=
"46dp"
android:layout_height=
"46dp"
android:layout_gravity=
"center_vertical"
tools:ignore=
"ContentDescription"
/>
<LinearLayout
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginHorizontal=
"8dp"
android:layout_weight=
"1"
android:orientation=
"vertical"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:background=
"#FF923E"
android:padding=
"2dp"
android:paddingHorizontal=
"3dp"
android:text=
"Ad"
android:textColor=
"@color/white"
android:textSize=
"12sp"
tools:ignore=
"HardcodedText"
/>
<TextView
android:id=
"@+id/ad_headline"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"5dp"
android:ellipsize=
"end"
android:maxLines=
"2"
android:textColor=
"@color/black"
android:textSize=
"14sp"
android:textStyle=
"bold"
/>
</LinearLayout>
<TextView
android:id=
"@+id/ad_body"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:ellipsize=
"end"
android:maxLines=
"2"
android:textColor=
"@color/black"
android:textSize=
"12sp"
/>
</LinearLayout>
<androidx.appcompat.widget.AppCompatButton
android:id=
"@+id/ad_call_to_action"
android:layout_width=
"wrap_content"
android:layout_height=
"38dp"
android:layout_gravity=
"center_vertical"
android:background=
"@drawable/bg_ad_button_0073c3"
android:gravity=
"center"
android:textAllCaps=
"false"
android:textColor=
"@color/white"
android:textSize=
"15sp"
tools:text=
"Install"
/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
app/src/main/res/layout/layout_native_full.xml
0 → 100644
View file @
230eb832
<com.google.android.gms.ads.nativead.NativeAdView
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_margin=
"10dp"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"@drawable/bg_ad_border"
>
<com.google.android.gms.ads.nativead.MediaView
android:id=
"@+id/ad_media"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:layout_constraintBottom_toTopOf=
"@id/ll"
app:layout_constraintTop_toTopOf=
"parent"
/>
<LinearLayout
android:id=
"@+id/ll"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
app:layout_constraintBottom_toBottomOf=
"parent"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<LinearLayout
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"8dp"
android:layout_marginTop=
"11dp"
android:layout_weight=
"1"
android:orientation=
"vertical"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginBottom=
"10dp"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginEnd=
"4dp"
android:background=
"#FF923E"
android:padding=
"2dp"
android:text=
"Ad"
android:textColor=
"@color/white"
android:textSize=
"12sp"
tools:ignore=
"HardcodedText"
/>
<TextView
android:id=
"@+id/ad_headline"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:ellipsize=
"end"
android:maxLines=
"1"
android:textColor=
"@color/black"
android:textSize=
"14sp"
android:textStyle=
"bold"
tools:text=
"Competition Countdown"
/>
</LinearLayout>
<TextView
android:id=
"@+id/ad_body"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:ellipsize=
"end"
android:maxLines=
"2"
android:textColor=
"@color/black"
android:textSize=
"12sp"
tools:text=
"Best competitions, One App We don't run any competitions,we just show you them all in one"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:paddingVertical=
"14dp"
>
<androidx.appcompat.widget.AppCompatButton
android:id=
"@+id/ad_call_to_action"
android:layout_width=
"match_parent"
android:layout_height=
"36dp"
android:layout_gravity=
"center_vertical"
android:layout_marginHorizontal=
"8dp"
android:background=
"@drawable/bg_ad_button"
android:gravity=
"center"
android:textColor=
"@color/white"
android:textSize=
"15sp"
/>
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
app/src/main/res/mipmap-xxhdpi/dian1.png
0 → 100644
View file @
230eb832
2.4 KB
app/src/main/res/mipmap-xxhdpi/dian2.png
0 → 100644
View file @
230eb832
2.45 KB
app/src/main/res/mipmap-xxhdpi/dian3.png
0 → 100644
View file @
230eb832
2.43 KB
app/src/main/res/mipmap-xxhdpi/icon_audio.png
0 → 100644
View file @
230eb832
3.14 KB
app/src/main/res/mipmap-xxhdpi/icon_document.png
0 → 100644
View file @
230eb832
2.31 KB
app/src/main/res/mipmap-xxhdpi/icon_photo.png
0 → 100644
View file @
230eb832
5.94 KB
app/src/main/res/mipmap-xxhdpi/icon_video.png
0 → 100644
View file @
230eb832
4.83 KB
app/src/main/res/mipmap-xxhdpi/icon_yuan_n.png
0 → 100644
View file @
230eb832
2.32 KB
app/src/main/res/mipmap-xxhdpi/icon_yuan_s.png
0 → 100644
View file @
230eb832
3.02 KB
app/src/main/res/mipmap-xxhdpi/yindaotu1.png
0 → 100644
View file @
230eb832
173 KB
app/src/main/res/mipmap-xxhdpi/yindaotu2.png
0 → 100644
View file @
230eb832
116 KB
app/src/main/res/mipmap-xxhdpi/yindaotu3.png
0 → 100644
View file @
230eb832
104 KB
app/src/main/res/mipmap-xxhdpi/zhuanquan.png
0 → 100644
View file @
230eb832
11.2 KB
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