Commit 70df2429 authored by wanglei's avatar wanglei

[AI重构]AI重构插页广告

parent a22342fc
......@@ -21,32 +21,44 @@ import com.google.android.gms.ads.interstitial.InterstitialAd
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
import com.simplecleaner.app.business.ads.admob.AdmobEvent.AdmobOnPaidEventListener
/**
*插屏广告加载显示管理类
* 插屏广告加载显示管理类(重构版)
*/
class AdInterMgr {
// 内部状态管理
private data class InterAdState(
var currentAd: InterstitialAd? = null,
var loading: Boolean = false,
var adDialog: android.app.Dialog? = null,
var showCallBack: AdsShowCallBack? = null,
var loadingCallBack: ((Boolean) -> Unit)? = null,
var currentAdEvent: AdEvent? = null
) {
fun reset() {
currentAd = null
loading = false
adDialog?.dismiss()
adDialog = null
showCallBack = null
loadingCallBack = null
currentAdEvent = null
}
}
private var adState = AdState<InterstitialAd>()
private var showCallBack: AdsShowCallBack? = null
//正在加载回调
private var loadingCallBack: ((flag: Boolean) -> Unit)? = null
private val state = InterAdState()
/**
* 展示插屏广告
*/
fun show(
activity: Activity,
adEvent: AdEvent,
showCallBack: AdsShowCallBack? = null
) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
//currentAdEvent!=null 表示有缓存广告,关联reqId
adState.currentAdEvent?.let { adEvent.reqId = it.reqId }
if (activity.isFinishing || activity.isDestroyed) return
// 关联reqId
state.currentAdEvent?.let { adEvent.reqId = it.reqId }
// 限流判断
if (!adEvent.isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
showCallBack?.failed(2)
......@@ -57,166 +69,115 @@ class AdInterMgr {
return
}
}
val needLoad = adState.needLoad()
this.showCallBack = showCallBack
if (adState.adDialog == null) {
adState.adDialog = activity.showAdCountDownDialog()
} else {
adState.adDialog?.dismiss()
}
state.showCallBack = showCallBack
// 弹窗管理
state.adDialog?.dismiss()
state.adDialog = activity.showAdCountDownDialog()
adEvent.adPrepareShow()
LogEx.logDebug(adEvent.TAG, "needLoad=$needLoad")
if (needLoad) {
if (!adState.loadingAd) {
LogEx.logDebug(adEvent.TAG, "inter adState !loadingAd")
loadAd(activity, adEvent) {
if (it) {
showReadyAd(activity, adEvent)
} else {
showCallBack?.adFailed()
}
// 加载或直接展示
if (state.currentAd == null) {
if (!state.loading) {
loadAd(activity, adEvent) { success ->
if (success) showReadyAd(activity, adEvent)
else state.showCallBack?.adFailed()
}
} else {
LogEx.logDebug(adEvent.TAG, "inter adState is loadingAd")
loadingCallBack = {
showReadyAd(activity, adEvent)
}
state.loadingCallBack = { showReadyAd(activity, adEvent) }
}
} else {
LogEx.logDebug(adEvent.TAG, "inter ad ready")
showReadyAd(activity, adEvent)
}
}
private fun showReadyAd(ac: Activity, adEvent: AdEvent) {
val admobEvent = (adEvent as AdmobEvent)
val tag = adEvent.TAG
LogEx.logDebug(tag, "inter showReadyAd ac=${ac.javaClass.simpleName} currentAd=${adState.currentAd}")
if (ac.isFinishing || ac.isDestroyed || adState.currentAd == null) {
LogEx.logDebug(tag, "inter showReadyAd ac=null isFinishing isDestroyed")
showCallBack?.failed()
adState.onAdDisplayFailed()
/**
* 展示已准备好的广告
*/
private fun showReadyAd(activity: Activity, adEvent: AdEvent) {
val admobEvent = adEvent as? AdmobEvent ?: return
val ad = state.currentAd
if (activity.isFinishing || activity.isDestroyed || ad == null) {
state.showCallBack?.failed()
state.reset()
return
}
adState.currentAd?.run {
fullScreenContentCallback = object : FullScreenContentCallback() {
ad.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
adState.onAdDisplayed(AdsType.INSERT)
showCallBack?.show()
state.currentAd = null
state.showCallBack?.show()
LimitUtils.addDisplayNum()
admobEvent.showAd(responseInfo, ac)
admobEvent.showAd(ad.responseInfo, activity)
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
super.onAdFailedToShowFullScreenContent(adError)
adState.onAdDisplayFailed()
showCallBack?.adFailed()
showCallBack = null
state.showCallBack?.adFailed()
admobEvent.adShowError(adError)
state.reset()
}
override fun onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent()
adState.onAdHidden(AdsType.INSERT)
showCallBack?.close()
showCallBack = null
state.showCallBack?.close()
state.reset()
// 自动预加载
loadAd(MyApplication.appContext, AdmobEvent("interAd", "preload"))
}
override fun onAdClicked() {
super.onAdClicked()
admobEvent.clickAd(responseInfo)
//计数
admobEvent.clickAd(ad.responseInfo)
LimitUtils.addClickNum()
}
}
if (AdConfigBean.adsConfigBean.showCountdown) {
createUICountdownTimer(adState.adDialog) {
show(ac)
}
createUICountdownTimer(state.adDialog) { ad.show(activity) }
} else {
show(ac)
ad.show(activity)
}
}
}
/**
* 加载插屏广告
*/
fun loadAd(
context: Context,
adEvent: AdEvent,
loadCallBack: ((flag: Boolean) -> Unit)? = null
loadCallBack: ((Boolean) -> Unit)? = null
) {
if (!adEvent.isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
this.showCallBack?.close(4)
this.showCallBack = null
adState.onAdLoadFailed()
return
}
}
//避免无效预加载
if (adState.loadingAd) {
if (!adEvent.isUnLimit && !LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
state.showCallBack?.close(4)
state.reset()
return
}
if (state.loading) return
state.loading = true
adEvent.adPulStart()
adState.loadStart(adEvent)
state.currentAdEvent = adEvent
InterstitialAd.load(
context, GlobalConfig.ID_ADMOB_INTER, AdRequest.Builder().build(),
context,
GlobalConfig.ID_ADMOB_INTER,
AdRequest.Builder().build(),
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(ad: InterstitialAd) {
val event = (adEvent as AdmobEvent)
ad.onPaidEventListener = AdmobOnPaidEventListener(ad, adEvent.scope)
adState.onAdLoaded(ad)
state.currentAd = ad
state.loading = false
loadCallBack?.invoke(true)
loadingCallBack?.invoke(true)
loadingCallBack = null
state.loadingCallBack?.invoke(true)
state.loadingCallBack = null
LimitUtils.addRequestNum()
event.pullAd(ad.responseInfo)
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
adState.onAdLoadFailed()
if (loadCallBack != null) {
adState.onAdDisplayFailed()
(adEvent as? AdmobEvent)?.pullAd(ad.responseInfo)
}
override fun onAdFailedToLoad(error: LoadAdError) {
state.currentAd = null
state.loading = false
loadCallBack?.invoke(false)
loadingCallBack?.invoke(false)
loadingCallBack = null
(adEvent as AdmobEvent).pullAd(loadAdError.responseInfo, loadAdError)
state.loadingCallBack?.invoke(false)
state.loadingCallBack = null
(adEvent as? AdmobEvent)?.pullAd(error.responseInfo, error)
}
}
)
}
/**
* 主动释放资源
*/
fun clear() {
state.reset()
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment