Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
A
appzxhy
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
appzxhy
Commits
191187b2
Commit
191187b2
authored
Jun 24, 2025
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[同步]广告的问题
parent
c069ba6c
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
268 additions
and
136 deletions
+268
-136
AdEvent.kt
...rc/main/java/com/dumpster/cleaner/business/ads/AdEvent.kt
+8
-2
AdState.kt
...rc/main/java/com/dumpster/cleaner/business/ads/AdState.kt
+14
-15
AdBannerMgr.kt
...va/com/dumpster/cleaner/business/ads/admob/AdBannerMgr.kt
+2
-1
AdInterMgr.kt
...ava/com/dumpster/cleaner/business/ads/admob/AdInterMgr.kt
+78
-31
AdNativeMgr.kt
...va/com/dumpster/cleaner/business/ads/admob/AdNativeMgr.kt
+17
-16
AdOpenMgr.kt
...java/com/dumpster/cleaner/business/ads/admob/AdOpenMgr.kt
+61
-34
AdmobEvent.kt
...ava/com/dumpster/cleaner/business/ads/admob/AdmobEvent.kt
+88
-37
No files found.
app/src/main/java/com/dumpster/cleaner/business/ads/AdEvent.kt
View file @
191187b2
...
...
@@ -3,6 +3,9 @@ package com.dumpster.cleaner.business.ads
import
com.dumpster.cleaner.MyApplication
import
com.dumpster.cleaner.business.helper.EventUtils
import
com.dumpster.cleaner.utils.LogEx
import
kotlinx.coroutines.CoroutineScope
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.SupervisorJob
import
org.json.JSONObject
import
java.util.UUID
...
...
@@ -22,7 +25,10 @@ abstract class AdEvent {
var
adUnit
:
String
=
""
var
from
:
String
=
""
val
reqId
=
UUID
.
randomUUID
().
toString
()
var
reqId
=
UUID
.
randomUUID
().
toString
()
var
isUnLimit
:
Boolean
=
false
val
scope
=
CoroutineScope
(
SupervisorJob
()
+
Dispatchers
.
IO
)
fun
adPrepareShow
()
{
val
obj1
=
JSONObject
()
...
...
@@ -37,8 +43,8 @@ abstract class AdEvent {
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"ad_unit"
,
adUnit
)
obj
.
put
(
"ad_type"
,
adUnit
)
obj
.
put
(
"from"
,
from
)
obj
.
put
(
"ad_type"
,
adUnit
)
EventUtils
.
event
(
"ad_pull_start"
,
ext
=
obj
)
LogEx
.
logDebug
(
TAG
,
"ad_pull_start_$adUnit $obj"
)
}
...
...
app/src/main/java/com/dumpster/cleaner/business/ads/AdState.kt
View file @
191187b2
package
com.dumpster.cleaner.business.ads
import
android.app.Activity
import
android.app.Dialog
import
com.dumpster.cleaner.business.ads.LimitUtils.openInterLastShowTime
import
java.lang.ref.WeakReference
class
AdState
<
T
>()
{
var
adDialog
:
Dialog
?
=
null
...
...
@@ -17,33 +16,27 @@ class AdState<T>() {
var
currentAd
:
T
?
=
null
/**
*
是否正在缓存加载广告
*
当前缓存广告对应的event
*/
var
loadingAd
:
Boolean
=
false
var
currentAdEvent
:
AdEvent
?
=
null
/**
*
用于保存引用现有页面,在此页面显示广告(因为要等待广告加载完毕)
*
是否正在缓存加载广告
*/
var
activityRef
:
WeakReference
<
Activity
>?
=
null
var
loadingAd
:
Boolean
=
false
/**
* 上一次的缓存成功时间
*/
var
lastLoadTime
:
Long
=
0
/**
* 上次展示时间
*/
// var lastShowTime: Long = 0
/**
* 广告已经展示
*/
fun
onAdDisplayed
()
{
currentAd
=
null
activityRef
=
null
currentAdEvent
=
null
adDialog
?.
dismiss
()
adDialog
=
null
...
...
@@ -63,14 +56,17 @@ class AdState<T>() {
adDialog
=
null
currentAd
=
null
activityRef
=
null
currentAdEvent
=
null
}
fun
onAdLoaded
(
ad
:
T
?)
{
fun
onAdLoaded
(
ad
:
T
?
,
adEvent
:
AdEvent
?
)
{
//这里可能提前设置,所有可以不设置,max回调的类型可能不同
if
(
ad
!=
null
)
{
currentAd
=
ad
}
if
(
adEvent
!=
null
)
{
currentAdEvent
=
adEvent
}
loadingAd
=
false
lastLoadTime
=
System
.
currentTimeMillis
()
}
...
...
@@ -82,4 +78,7 @@ class AdState<T>() {
}
fun
adAvailable
()
=
currentAd
!=
null
||
((
System
.
currentTimeMillis
()
-
lastLoadTime
)
/
1000
/
60
).
toInt
()
<
30
}
app/src/main/java/com/dumpster/cleaner/business/ads/admob/AdBannerMgr.kt
View file @
191187b2
...
...
@@ -7,6 +7,7 @@ import com.dumpster.cleaner.GlobalConfig
import
com.dumpster.cleaner.bean.config.AdConfigBean
import
com.dumpster.cleaner.business.ads.AdsType
import
com.dumpster.cleaner.business.ads.LimitUtils
import
com.dumpster.cleaner.business.ads.admob.AdmobEvent.AdmobOnPaidEventListener
import
com.google.ads.mediation.admob.AdMobAdapter
import
com.google.android.gms.ads.AdListener
import
com.google.android.gms.ads.AdRequest
...
...
@@ -42,7 +43,7 @@ class AdBannerMgr {
adView
=
AdView
(
parent
.
context
)
parent
.
addView
(
adView
)
adView
?.
onPaidEventListener
=
AdmobEvent
.
EventOnPaidEventListener
(
adView
)
adView
?.
let
{
it
.
onPaidEventListener
=
AdmobOnPaidEventListener
(
it
,
admobEvent
.
scope
)
}
listener
=
ViewTreeObserver
.
OnGlobalLayoutListener
{
val
screenPixelDensity
=
parent
.
context
.
resources
.
displayMetrics
.
density
...
...
app/src/main/java/com/dumpster/cleaner/business/ads/admob/AdInterMgr.kt
View file @
191187b2
...
...
@@ -4,6 +4,7 @@ import android.app.Activity
import
android.content.Context
import
com.dumpster.cleaner.GlobalConfig
import
com.dumpster.cleaner.MyApplication
import
com.dumpster.cleaner.bean.config.AdConfigBean
import
com.dumpster.cleaner.business.ads.AdCountDownDialog.createUICountdownTimer
import
com.dumpster.cleaner.business.ads.AdCountDownDialog.showAdCountDownDialog
import
com.dumpster.cleaner.business.ads.AdEvent
...
...
@@ -11,13 +12,14 @@ import com.dumpster.cleaner.business.ads.AdState
import
com.dumpster.cleaner.business.ads.AdsShowCallBack
import
com.dumpster.cleaner.business.ads.AdsType
import
com.dumpster.cleaner.business.ads.LimitUtils
import
com.dumpster.cleaner.business.ads.admob.AdmobEvent.AdmobOnPaidEventListener
import
com.dumpster.cleaner.utils.LogEx
import
com.google.android.gms.ads.AdError
import
com.google.android.gms.ads.AdRequest
import
com.google.android.gms.ads.FullScreenContentCallback
import
com.google.android.gms.ads.LoadAdError
import
com.google.android.gms.ads.interstitial.InterstitialAd
import
com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
import
java.lang.ref.WeakReference
/**
...
...
@@ -28,58 +30,88 @@ class AdInterMgr {
private
var
adState
=
AdState
<
InterstitialAd
>()
private
var
showCallBack
:
AdsShowCallBack
?
=
null
//正在加载回调
private
var
loadingCallBack
:
(()
->
Unit
)?
=
null
fun
show
(
activity
:
Activity
,
isUnLimit
:
Boolean
,
adEvent
:
AdEvent
,
showCallBack
:
AdsShowCallBack
?
=
null
)
{
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
showCallBack
?.
failed
(
0
)
adState
.
onAdDisplayFailed
()
return
}
if
(!
isUnLimit
)
{
if
(!
LimitUtils
.
isAdShow
(
AdsType
.
INSERT
,
adEvent
))
{
val
nowAdEvent
=
adEvent
//currentAdEvent!=null 表示有缓存广告,关联reqId
adState
.
currentAdEvent
?.
let
{
nowAdEvent
.
reqId
=
it
.
reqId
}
if
(!
nowAdEvent
.
isUnLimit
)
{
if
(!
LimitUtils
.
isAdShow
(
AdsType
.
INSERT
,
nowAdEvent
))
{
showCallBack
?.
failed
(
2
)
return
}
if
(
LimitUtils
.
isIntervalLimited
(
a
dEvent
))
{
if
(
LimitUtils
.
isIntervalLimited
(
nowA
dEvent
))
{
showCallBack
?.
failed
(
3
)
return
}
}
adEvent
.
adPrepareShow
()
adState
.
activityRef
=
WeakReference
(
activity
)
val
needLoad
=
!
adState
.
adAvailable
(
)
this
.
showCallBack
=
showCallBack
if
(
adState
.
adDialog
==
null
)
{
adState
.
adDialog
=
activity
.
showAdCountDownDialog
()
}
else
{
adState
.
adDialog
?.
dismiss
()
}
val
needLoad
=
adState
.
currentAd
==
null
||
!
adAvailable
()
nowAdEvent
.
adPrepareShow
()
LogEx
.
logDebug
(
adEvent
.
TAG
,
"needLoad=$needLoad"
)
if
(
needLoad
)
{
if
(!
adState
.
loadingAd
)
{
loadAd
(
activity
,
adEvent
,
isUnLimit
,
true
)
LogEx
.
logDebug
(
adEvent
.
TAG
,
"inter adState !loadingAd"
)
loadAd
(
activity
,
nowAdEvent
)
{
showReadyAd
(
activity
,
nowAdEvent
)
}
}
else
{
LogEx
.
logDebug
(
adEvent
.
TAG
,
"inter adState is loadingAd"
)
loadingCallBack
=
{
showReadyAd
(
activity
,
nowAdEvent
)
}
}
}
else
{
showReadyAd
(
adEvent
)
LogEx
.
logDebug
(
adEvent
.
TAG
,
"inter ad ready"
)
showReadyAd
(
activity
,
nowAdEvent
)
}
}
private
fun
showReadyAd
(
adEvent
:
AdEvent
)
{
private
fun
showReadyAd
(
ac
:
Activity
,
adEvent
:
AdEvent
)
{
val
admobEvent
=
(
adEvent
as
AdmobEvent
)
val
tag
=
adEvent
.
TAG
LogEx
.
logDebug
(
tag
,
"showReadyAd ac=$ac currentAd=${adState.currentAd}"
)
if
(
ac
.
isFinishing
||
ac
.
isDestroyed
||
adState
.
currentAd
==
null
)
{
LogEx
.
logDebug
(
tag
,
"showReadyAd ac=null isFinishing isDestroyed"
)
showCallBack
?.
failed
()
adState
.
onAdDisplayFailed
()
return
}
adState
.
currentAd
?.
run
{
fullScreenContentCallback
=
object
:
FullScreenContentCallback
()
{
override
fun
onAdShowedFullScreenContent
()
{
super
.
onAdShowedFullScreenContent
()
val
ac
=
adState
.
activityRef
?.
get
()
(
adEvent
as
AdmobEvent
).
showAd
(
responseInfo
,
ac
)
admobEvent
.
showAd
(
responseInfo
,
ac
)
adState
.
onAdDisplayed
()
showCallBack
?.
show
()
...
...
@@ -94,7 +126,7 @@ class AdInterMgr {
showCallBack
?.
adFailed
()
showCallBack
=
null
adEvent
.
adShowError
(
adError
)
ad
mob
Event
.
adShowError
(
adError
)
}
override
fun
onAdDismissedFullScreenContent
()
{
...
...
@@ -109,27 +141,28 @@ class AdInterMgr {
override
fun
onAdClicked
()
{
super
.
onAdClicked
()
(
adEvent
as
AdmobEvent
)
.
clickAd
(
responseInfo
)
admobEvent
.
clickAd
(
responseInfo
)
//计数
LimitUtils
.
addClickNum
()
}
}
val
activity
=
adState
.
activityRef
?.
get
()
activity
?.
let
{
if
(
AdConfigBean
.
adsConfigBean
.
showCountdown
)
{
createUICountdownTimer
(
adState
.
adDialog
)
{
show
(
it
)
show
(
ac
)
}
}
else
{
show
(
ac
)
}
}
}
fun
loadAd
(
context
:
Context
,
adEvent
:
AdEvent
,
isUnLimit
:
Boolean
=
false
,
isShow
:
Boolean
=
false
,
loadCallBack
:
(()
->
Unit
)?
=
null
)
{
if
(!
isUnLimit
)
{
if
(!
adEvent
.
isUnLimit
)
{
if
(!
LimitUtils
.
isAdShow
(
AdsType
.
INSERT
,
adEvent
))
{
this
.
showCallBack
?.
close
(
4
)
this
.
showCallBack
=
null
...
...
@@ -138,26 +171,41 @@ class AdInterMgr {
}
}
//避免无效预加载
if
(
adState
.
loadingAd
&&
loadCallBack
==
null
&&
loadingCallBack
==
null
)
{
//容错机制
adState
.
loadingAd
=
false
return
}
adState
.
loadingAd
=
true
adEvent
.
adPulStart
()
InterstitialAd
.
load
(
context
,
GlobalConfig
.
ID_ADMOB_INTER
,
AdRequest
.
Builder
().
build
(),
object
:
InterstitialAdLoadCallback
()
{
override
fun
onAdLoaded
(
ad
:
InterstitialAd
)
{
adState
.
onAdLoaded
(
ad
)
if
(
this
@AdInterMgr
.
showCallBack
!=
null
||
isShow
)
{
showReadyAd
(
adEvent
)
}
(
adEvent
as
AdmobEvent
).
pullAd
(
ad
.
responseInfo
)
val
event
=
(
adEvent
as
AdmobEvent
)
ad
.
onPaidEventListener
=
AdmobOnPaidEventListener
(
ad
,
adEvent
.
scope
)
adState
.
onAdLoaded
(
ad
,
adEvent
)
loadCallBack
?.
invoke
()
loadingCallBack
?.
invoke
()
loadingCallBack
=
null
LimitUtils
.
addRequestNum
()
ad
.
onPaidEventListener
=
AdmobEvent
.
EventOnPaidEventListener
(
ad
)
event
.
pullAd
(
ad
.
responseInfo
)
}
override
fun
onAdFailedToLoad
(
loadAdError
:
LoadAdError
)
{
adState
.
onAdLoadFailed
()
(
adEvent
as
AdmobEvent
).
pullAd
(
loadAdError
.
responseInfo
,
loadAdError
)
if
(
loadCallBack
!=
null
)
{
adState
.
onAdDisplayFailed
()
}
showCallBack
?.
adFailed
()
showCallBack
=
null
(
adEvent
as
AdmobEvent
).
pullAd
(
loadAdError
.
responseInfo
,
loadAdError
)
}
}
)
...
...
@@ -165,5 +213,4 @@ class AdInterMgr {
}
private
fun
adAvailable
()
=
((
System
.
currentTimeMillis
()
-
adState
.
lastLoadTime
)
/
1000
/
60
).
toInt
()
<
30
}
\ No newline at end of file
app/src/main/java/com/dumpster/cleaner/business/ads/admob/AdNativeMgr.kt
View file @
191187b2
...
...
@@ -7,6 +7,7 @@ import com.dumpster.cleaner.MyApplication
import
com.dumpster.cleaner.business.ads.AdsType
import
com.dumpster.cleaner.business.ads.LimitUtils
import
com.dumpster.cleaner.business.ads.NativeParentView
import
com.dumpster.cleaner.business.ads.admob.AdmobEvent.AdmobOnPaidEventListener
import
com.google.android.gms.ads.AdListener
import
com.google.android.gms.ads.AdLoader
import
com.google.android.gms.ads.AdRequest
...
...
@@ -19,7 +20,6 @@ import java.util.concurrent.ConcurrentLinkedDeque
*原生广告加载显示管理类
*/
class
AdNativeMgr
{
private
val
TAG
=
"AdNativeMgr"
/**
...
...
@@ -52,7 +52,7 @@ class AdNativeMgr {
).
forNativeAd
{
nativeAd
->
lastTime
=
System
.
currentTimeMillis
()
nativeAd
.
setOnPaidEventListener
(
Admob
Event
.
EventOnPaidEventListener
(
nativeAd
))
nativeAd
.
setOnPaidEventListener
(
Admob
OnPaidEventListener
(
nativeAd
,
admobEvent
.
scope
))
currentNativeAd
=
nativeAd
admobEvent
.
pullAd
(
nativeAd
.
responseInfo
)
...
...
@@ -101,6 +101,7 @@ class AdNativeMgr {
if
(!
LimitUtils
.
isShowNative
(
AdsType
.
NATIVE
,
admobEvent
))
{
return
}
Log
.
e
(
TAG
,
"adNative can show"
)
if
(!
adAvailable
())
{
...
...
@@ -109,29 +110,28 @@ class AdNativeMgr {
cacheItems
.
clear
()
}
parent
.
isAdShowed
=
true
val
nativeAd
=
cacheItems
.
peek
()
var
showAction
:
(
ad
:
NativeAd
)
->
Unit
=
{
ad
->
parent
.
isAdShowed
=
true
nativeCallBack
?.
invoke
(
ad
)
parent
.
setNativeAd
(
ad
,
layout
)
admobEvent
.
showAd
(
ad
.
responseInfo
)
//添加原生数量
LimitUtils
.
addNativeDisplayNum
()
loadAd
(
MyApplication
.
appContext
,
AdmobEvent
(
"nativeAd"
,
"preload"
),
null
)
}
if
(
nativeAd
==
null
)
{
loadAd
(
parent
.
context
,
admobEvent
)
{
ad
->
Log
.
e
(
TAG
,
"load show"
)
nativeCallBack
?.
invoke
(
ad
)
parent
.
setNativeAd
(
ad
,
layout
)
admobEvent
.
showAd
(
ad
.
responseInfo
)
loadAd
(
MyApplication
.
appContext
,
AdmobEvent
(
"nativeAd"
,
"preload"
),
null
)
showAction
.
invoke
(
ad
)
}
}
else
{
val
flag
=
cacheItems
.
remove
(
nativeAd
)
Log
.
e
(
TAG
,
"ready show remove=$flag size=${cacheItems.size}"
)
nativeCallBack
?.
invoke
(
nativeAd
)
parent
.
setNativeAd
(
nativeAd
,
layout
)
admobEvent
.
showAd
(
nativeAd
.
responseInfo
)
loadAd
(
MyApplication
.
appContext
,
AdmobEvent
(
"nativeAd"
,
"preload"
),
null
)
showAction
.
invoke
(
nativeAd
)
}
}
...
...
@@ -139,4 +139,5 @@ class AdNativeMgr {
private
fun
adAvailable
():
Boolean
{
return
(
lastTime
==
0L
)
||
((
System
.
currentTimeMillis
()
-
lastTime
)
/
1000
/
60
).
toInt
()
<
30
}
}
\ No newline at end of file
app/src/main/java/com/dumpster/cleaner/business/ads/admob/AdOpenMgr.kt
View file @
191187b2
...
...
@@ -9,13 +9,13 @@ import com.dumpster.cleaner.business.ads.AdState
import
com.dumpster.cleaner.business.ads.AdsShowCallBack
import
com.dumpster.cleaner.business.ads.AdsType
import
com.dumpster.cleaner.business.ads.LimitUtils
import
com.dumpster.cleaner.business.ads.admob.AdmobEvent.AdmobOnPaidEventListener
import
com.dumpster.cleaner.utils.LogEx
import
com.google.android.gms.ads.AdError
import
com.google.android.gms.ads.AdRequest
import
com.google.android.gms.ads.FullScreenContentCallback
import
com.google.android.gms.ads.LoadAdError
import
com.google.android.gms.ads.appopen.AppOpenAd
import
java.lang.ref.WeakReference
/**
* 开屏广告加载显示管理类
...
...
@@ -26,47 +26,69 @@ class AdOpenMgr {
private
val
adState
=
AdState
<
AppOpenAd
>()
private
var
showCallBack
:
AdsShowCallBack
?
=
null
//正在加载回调
private
var
loadingCallBack
:
(()
->
Unit
)?
=
null
fun
show
(
activity
:
Activity
,
isUnLimit
:
Boolean
,
adEvent
:
AdEvent
,
showCallBack
:
AdsShowCallBack
?)
{
fun
show
(
activity
:
Activity
,
adEvent
:
AdEvent
,
showCallBack
:
AdsShowCallBack
?
)
{
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
return
}
if
(!
isUnLimit
)
{
if
(!
LimitUtils
.
isAdShow
(
AdsType
.
OPEN
,
adEvent
))
{
val
nowAdEvent
=
adEvent
adState
.
currentAdEvent
?.
let
{
nowAdEvent
.
reqId
=
it
.
reqId
}
if
(!
nowAdEvent
.
isUnLimit
)
{
if
(!
LimitUtils
.
isAdShow
(
AdsType
.
OPEN
,
nowAdEvent
))
{
showCallBack
?.
failed
()
return
}
if
(
LimitUtils
.
isIntervalLimited
(
a
dEvent
))
{
if
(
LimitUtils
.
isIntervalLimited
(
nowA
dEvent
))
{
showCallBack
?.
failed
()
return
}
}
adEvent
.
adPrepareShow
()
adState
.
activityRef
=
WeakReference
(
activity
)
val
needLoad
=
!
adState
.
adAvailable
()
this
.
showCallBack
=
showCallBack
// if (adState.adDialog == null) {
// adState.adDialog = activity.showAdPreparingDialog(1)
// } else {
// adState.adDialog?.dismiss()
// }
val
needLoad
=
adState
.
currentAd
==
null
||
!
adAvailable
()
nowAdEvent
.
adPrepareShow
()
if
(
needLoad
)
{
if
(!
adState
.
loadingAd
)
{
loadAd
(
activity
,
adEvent
,
isUnLimit
,
true
)
LogEx
.
logDebug
(
adEvent
.
TAG
,
"open adState !loadingAd"
)
loadAd
(
activity
,
adEvent
)
{
showReadyAd
(
activity
)
}
}
else
{
LogEx
.
logDebug
(
adEvent
.
TAG
,
"open adState is loadingAd"
)
loadingCallBack
=
{
showReadyAd
(
activity
)
}
}
}
else
{
showReadyAd
(
adEvent
)
LogEx
.
logDebug
(
adEvent
.
TAG
,
"open ad ready"
)
showReadyAd
(
activity
)
}
}
private
fun
showReadyAd
(
adEvent
:
AdEvent
)
{
private
fun
showReadyAd
(
ac
:
Activity
)
{
if
(
ac
.
isFinishing
||
ac
.
isDestroyed
||
adState
.
currentAd
==
null
)
{
LogEx
.
logDebug
(
TAG
,
"showReadyAd ac=null isFinishing isDestroyed"
)
return
}
adState
.
currentAd
?.
run
{
val
adEvent
=
adState
.
currentAdEvent
as
AdmobEvent
?
fullScreenContentCallback
=
object
:
FullScreenContentCallback
()
{
override
fun
onAdShowedFullScreenContent
()
{
val
ac
=
adState
.
activityRef
?.
get
()
(
adEvent
as
AdmobEvent
)
.
showAd
(
this
@run
.
responseInfo
,
ac
)
adEvent
?
.
showAd
(
this
@run
.
responseInfo
,
ac
)
showCallBack
?.
show
()
...
...
@@ -83,7 +105,7 @@ class AdOpenMgr {
showCallBack
=
null
adState
.
onAdDisplayFailed
()
(
adEvent
as
AdmobEvent
)
.
adShowError
(
adError
)
adEvent
?
.
adShowError
(
adError
)
}
...
...
@@ -101,33 +123,38 @@ class AdOpenMgr {
}
override
fun
onAdClicked
()
{
(
adEvent
as
AdmobEvent
)
.
clickAd
(
this
@run
.
responseInfo
)
adEvent
?
.
clickAd
(
this
@run
.
responseInfo
)
//计数
LimitUtils
.
addClickNum
()
}
}
val
activity
=
adState
.
activityRef
?.
get
()
activity
?.
let
{
show
(
it
)
}
show
(
ac
)
}
}
fun
loadAd
(
context
:
Context
,
adEvent
:
AdEvent
,
isUnLimit
:
Boolean
=
false
,
isShow
:
Boolean
=
false
,
loadCallBack
:
(()
->
Unit
)?
=
null
)
{
if
(!
isUnLimit
)
{
if
(!
adEvent
.
isUnLimit
)
{
if
(!
LimitUtils
.
isAdShow
(
AdsType
.
OPEN
,
adEvent
))
{
this
.
showCallBack
?.
close
()
this
.
showCallBack
?.
failed
()
this
.
showCallBack
=
null
adState
.
onAdLoadFailed
()
return
}
}
//避免无效预加载
if
(
adState
.
loadingAd
&&
loadCallBack
==
null
&&
loadingCallBack
==
null
)
{
//容错机制
adState
.
loadingAd
=
false
return
}
adState
.
loadingAd
=
true
adEvent
.
adPulStart
()
AppOpenAd
.
load
(
...
...
@@ -136,14 +163,15 @@ class AdOpenMgr {
AdRequest
.
Builder
().
build
(),
object
:
AppOpenAd
.
AppOpenAdLoadCallback
()
{
override
fun
onAdLoaded
(
appOpenAd
:
AppOpenAd
)
{
adState
.
onAdLoaded
(
appOpenAd
)
if
(
this
@AdOpenMgr
.
showCallBack
!=
null
||
isShow
)
{
showReadyAd
(
adEvent
)
}
adState
.
onAdLoaded
(
appOpenAd
,
adEvent
)
loadCallBack
?.
invoke
()
loadingCallBack
?.
invoke
()
loadingCallBack
=
null
(
adEvent
as
AdmobEvent
).
pullAd
(
appOpenAd
.
responseInfo
)
appOpenAd
.
onPaidEventListener
=
Admob
Event
.
EventOnPaidEventListener
(
appOpenAd
)
appOpenAd
.
onPaidEventListener
=
Admob
OnPaidEventListener
(
appOpenAd
,
adEvent
.
scope
)
LimitUtils
.
addRequestNum
()
}
override
fun
onAdFailedToLoad
(
loadAdError
:
LoadAdError
)
{
...
...
@@ -156,5 +184,4 @@ class AdOpenMgr {
)
}
private
fun
adAvailable
()
=
((
System
.
currentTimeMillis
()
-
adState
.
lastLoadTime
)
/
1000
/
60
).
toInt
()
<
30
}
\ No newline at end of file
app/src/main/java/com/dumpster/cleaner/business/ads/admob/AdmobEvent.kt
View file @
191187b2
...
...
@@ -25,6 +25,9 @@ import com.google.android.gms.ads.rewarded.RewardedAd
import
com.google.firebase.analytics.FirebaseAnalytics
import
com.google.firebase.analytics.ktx.analytics
import
com.google.firebase.ktx.Firebase
import
kotlinx.coroutines.CoroutineScope
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.SupervisorJob
import
org.json.JSONObject
import
java.math.BigDecimal
import
java.util.Currency
...
...
@@ -123,37 +126,74 @@ class AdmobEvent : AdEvent {
LogEx
.
logDebug
(
TAG
,
"ad_show $obj"
)
}
class
EventOnPaidEventListener
(
private
val
ad
:
Any
?)
:
OnPaidEventListener
{
fun
adShowError
(
adError
:
AdError
)
{
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"reason"
,
adError
.
message
)
obj
.
put
(
"code"
,
adError
.
code
)
obj
.
put
(
"from"
,
from
)
obj
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj
)
LogEx
.
logDebug
(
TAG
,
"ad_show_error $obj"
)
}
class
AdmobOnPaidEventListener
(
private
val
ad
:
Any
,
private
val
coroutineScope
:
CoroutineScope
=
CoroutineScope
(
SupervisorJob
()
+
Dispatchers
.
IO
)
)
:
OnPaidEventListener
{
override
fun
onPaidEvent
(
adValue
:
AdValue
)
{
ad
?:
return
SolarEngineEvent
.
eventSolar
(
ad
,
adValue
.
valueMicros
)
val
adRatio
=
AdConfigBean
.
adsConfigBean
.
adRatio
onPaidEvent2
(
ad
,
adValue
)
}
fun
onPaidEvent2
(
ad
:
Any
,
adValue
:
AdValue
)
{
// coroutineScope.launch {
try
{
val
flag
=
eventAdRatio
()
val
valueS
=
adValue
.
valueMicros
>
0
if
(
flag
&&
valueS
)
{
SolarEngineEvent
.
eventSolar
(
ad
,
adValue
.
valueMicros
)
eventFireBase
(
adValue
)
eventEvent
(
adValue
)
}
}
catch
(
e
:
Exception
)
{
EventUtils
.
event
(
"onPaidEvent_Error"
)
}
// }
}
fun
eventAdRatio
():
Boolean
{
val
adRatio
=
AdConfigBean
.
Companion
.
adsConfigBean
.
adRatio
val
random
=
Random
.
Default
.
nextInt
(
1
,
100
)
if
(
random
>
adRatio
)
{
taichiSharedPreferencesEditor
.
putFloat
(
"TaichiTroasCache"
,
0f
)
taichiSharedPreferencesEditor
.
commit
()
EventUtils
.
event
(
"ad_price_limit"
)
return
return
false
}
return
true
}
/**
* 上报给firebase
*/
fun
eventFireBase
(
adValue
:
AdValue
)
{
val
valueMicros
=
adValue
.
valueMicros
val
currencyCode
=
adValue
.
currencyCode
val
precision
=
adValue
.
precisionType
val
currentImpressionRevenue
=
adValue
.
valueMicros
.
toDouble
()
/
1000000.0
val
fbLogger
=
AppEventsLogger
.
newLogger
(
MyApplication
.
appContext
)
fbLogger
.
logPurchase
(
BigDecimal
.
valueOf
(
valueMicros
/
1000000
),
Currency
.
getInstance
(
currencyCode
)
)
//sp里面的价格值
val
previousTaichiTroasCache
=
taichiPref
.
getFloat
(
"TaichiTroasCache"
,
0f
)
val
obj
=
JSONObject
()
obj
.
put
(
"valueMicros"
,
valueMicros
)
obj
.
put
(
"currencyCode"
,
currencyCode
)
obj
.
put
(
"precision"
,
precision
)
//当前缓存加个值
val
currentTaichiTroasCache
=
(
previousTaichiTroasCache
+
currentImpressionRevenue
).
toFloat
()
Firebase
.
analytics
.
logEvent
(
"ad_price"
,
Bundle
().
apply
{
putDouble
(
"valueMicros"
,
valueMicros
/
1000000.0
)
})
//价值上报阀值
val
taichiAdValue
=
AdConfigBean
.
Companion
.
adsConfigBean
.
taichiAdValue
/
100f
val
params
=
Bundle
()
val
currentImpressionRevenue
=
adValue
.
valueMicros
.
toDouble
()
/
1000000.0
params
.
putDouble
(
FirebaseAnalytics
.
Param
.
VALUE
,
currentImpressionRevenue
)
params
.
putString
(
FirebaseAnalytics
.
Param
.
CURRENCY
,
"USD"
)
LogEx
.
logDebug
(
"EventOnPaidEventListener"
,
"precisionType=${adValue.precisionType}"
)
...
...
@@ -165,31 +205,51 @@ class AdmobEvent : AdEvent {
else
->
"Invalid"
}
params
.
putString
(
"precisionType"
,
precisionType
)
Firebase
.
analytics
.
logEvent
(
"Ad_Impression_Revenue"
,
params
)
val
previousTaichiTroasCache
=
taichiPref
.
getFloat
(
"TaichiTroasCache"
,
0f
)
val
currentTaichiTroasCache
=
(
previousTaichiTroasCache
+
currentImpressionRevenue
).
toFloat
()
val
taichiAdValue
=
AdConfigBean
.
adsConfigBean
.
taichiAdValue
/
100f
val
fbLogger
=
AppEventsLogger
.
newLogger
(
MyApplication
.
Companion
.
appContext
)
//上报
fbLogger
.
logPurchase
(
BigDecimal
.
valueOf
(
currentImpressionRevenue
),
Currency
.
getInstance
(
currencyCode
))
//上报ad_price
Firebase
.
analytics
.
logEvent
(
"ad_price"
,
Bundle
().
apply
{
putDouble
(
"valueMicros"
,
currentImpressionRevenue
)
})
//上报Ad_Impression_Revenue
Firebase
.
analytics
.
logEvent
(
"Ad_Impression_Revenue"
,
params
)
//上报Total_Ads_Revenue_001
if
(
currentTaichiTroasCache
>=
taichiAdValue
)
{
//如果超过0.01就触发一次tROAS taichi事件
val
roasbundle
=
Bundle
()
roasbundle
.
putDouble
(
FirebaseAnalytics
.
Param
.
VALUE
,
currentTaichiTroasCache
.
toDouble
()
)
roasbundle
.
putDouble
(
FirebaseAnalytics
.
Param
.
VALUE
,
currentTaichiTroasCache
.
toDouble
())
roasbundle
.
putString
(
FirebaseAnalytics
.
Param
.
CURRENCY
,
"USD"
)
Firebase
.
analytics
.
logEvent
(
"Total_Ads_Revenue_001"
,
roasbundle
)
taichiSharedPreferencesEditor
.
putFloat
(
"TaichiTroasCache"
,
0f
)
//重新清零,开始计算
val
logger
=
AppEventsLogger
.
newLogger
(
MyApplication
.
appContext
)
val
parameters
=
Bundle
()
parameters
.
putString
(
AppEventsConstants
.
EVENT_PARAM_CURRENCY
,
"USD"
)
l
ogger
.
logEvent
(
"ad_value"
,
currentTaichiTroasCache
.
toDouble
(),
parameters
)
fbL
ogger
.
logEvent
(
"ad_value"
,
currentTaichiTroasCache
.
toDouble
(),
parameters
)
}
else
{
taichiSharedPreferencesEditor
.
putFloat
(
"TaichiTroasCache"
,
currentTaichiTroasCache
)
}
taichiSharedPreferencesEditor
.
commit
()
}
/**
* 上报给服务器
*/
fun
eventEvent
(
adValue
:
AdValue
)
{
val
valueMicros
=
adValue
.
valueMicros
val
currencyCode
=
adValue
.
currencyCode
val
precision
=
adValue
.
precisionType
val
obj
=
JSONObject
()
obj
.
put
(
"valueMicros"
,
valueMicros
)
obj
.
put
(
"currencyCode"
,
currencyCode
)
obj
.
put
(
"precision"
,
precision
)
var
key
=
"ad_price"
when
(
ad
)
{
...
...
@@ -313,17 +373,8 @@ class AdmobEvent : AdEvent {
}
}
EventUtils
.
event
(
key
,
ext
=
obj
)
}
}
fun
adShowError
(
adError
:
AdError
)
{
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"reason"
,
adError
.
message
)
obj
.
put
(
"code"
,
adError
.
code
)
obj
.
put
(
"from"
,
from
)
obj
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj
)
LogEx
.
logDebug
(
TAG
,
"ad_show_error $obj"
)
}
}
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