Commit fdd35a54 authored by wanglei's avatar wanglei

[修改]广告代码修改

parent dc0b08ce
package com.base.appzxhy.ads.admob
package com.base.appzxhy.ads
import android.app.Activity
import android.app.Dialog
import java.lang.ref.WeakReference
class AdmobAdState {
class AdState<T>() {
var adDialog: Dialog? = null
/**
* 当前缓存的广告
*/
var currentAd: Any? = null
var currentAd: T? = null
/**
* 是否正在缓存加载广告
......@@ -30,25 +36,36 @@ class AdmobAdState {
*/
var lastShowTime: Long = 0
fun onAdDisplayed() {
lastShowTime = System.currentTimeMillis()
/**
* 广告已经展示
*/
fun onAdDisplayed() {
currentAd = null
activityRef = null
adDialog?.dismiss()
adDialog = null
lastShowTime = System.currentTimeMillis()
}
fun onAdHidden() {
// 广告关闭,清空缓存数据,重新加载
//重置下上次展示的时间,避免看广告的时间算入间隔
lastShowTime = System.currentTimeMillis()
}
fun onAdDisplayFailed() {
adDialog?.dismiss()
adDialog = null
currentAd = null
activityRef = null
}
fun onAdLoaded(ad: Any?) {
fun onAdLoaded(ad: T?) {
//这里可能提前设置,所有可以不设置,max回调的类型可能不同
if (ad != null) {
currentAd = ad
......@@ -58,6 +75,10 @@ class AdmobAdState {
}
fun onAdLoadFailed() {
adDialog?.dismiss()
adDialog = null
loadingAd = false
}
}
......@@ -3,8 +3,6 @@ package com.base.appzxhy.ads
import android.app.Activity
import android.content.Context
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.Toast
import androidx.annotation.LayoutRes
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
......@@ -20,6 +18,7 @@ import com.base.appzxhy.ads.applovin.AdMaxEvent
import com.base.appzxhy.ads.applovin.MaxInsertMgr
import com.base.appzxhy.ads.applovin.MaxNativeMgr
import com.base.appzxhy.ads.applovin.MaxOpenMgr
import com.base.appzxhy.bean.config.AdConfigBean
import com.base.appzxhy.bean.config.AdConfigBean.Companion.adsConfigBean
import com.base.appzxhy.bean.config.ConfigBean.Companion.configBean
import com.base.appzxhy.helper.EventUtils
......@@ -40,7 +39,7 @@ object AdsMgr {
private val adOpenMgr by lazy {
AdOpenMgr()
}
private val adInsertMgr by lazy {
private val adInterMgr by lazy {
AdInterMgr()
}
......@@ -87,11 +86,8 @@ object AdsMgr {
EventUtils.event("isInBlackList", configBean.isInBlackList.toString())
return
}
if (adsConfigBean.adSwitch) {
initAdmob(context)
} else {
initMax(context)
}
initAdmob(context)
initMax(context)
}
......@@ -101,14 +97,14 @@ object AdsMgr {
entry.value.initializationState == AdapterStatus.State.READY
}
isAdmobInit = readyAdapter != null
EventUtils.event("AdmobInit", "AdmobInit")
EventUtils.event("AdmobInit", "AdmobInit=$isAdmobInit")
// context.toast("admob init")
if (adsConfigBean.adSwitch) {
if (AdConfigBean.adsConfigBean.adSwitch) {
admobInitCallBack?.invoke()
admobInitCallBack = null
adOpenMgr.loadAd(context, AdmobEvent("openAd", context::class.java.simpleName))
adInsertMgr.loadAd(context, AdmobEvent("interAd", context::class.java.simpleName))
// adOpenMgr.loadAd(context, true, AdmobEvent("openAd", context::class.java.simpleName))
adInterMgr.loadAd(context, AdmobEvent("interAd", context::class.java.simpleName))
}
}
......@@ -135,7 +131,7 @@ object AdsMgr {
isMaxInit = true
// maxOpenMgr.loadAd(context)
if (!adsConfigBean.adSwitch) {
maxInsertMgr.loadAd( AdMaxEvent("interAd", context::class.java.simpleName))
maxInsertMgr.loadAd(context, AdMaxEvent("interAd", context::class.java.simpleName))
context.toast("max init")
maxInitCallBack?.invoke()
maxInitCallBack = null
......@@ -160,28 +156,30 @@ object AdsMgr {
*/
fun showOpen(
activity: Activity,
isUnLimit: Boolean = false,
showCallBack: AdsShowCallBack? = null,
) {
if (configBean.isInBlackList) {
EventUtils.event("isInBlackList", "isInBlackList=${configBean.isInBlackList}")
showCallBack?.failed()
return
}
val from = activity::class.java.simpleName
if (adsConfigBean.adSwitch) {
if (AdConfigBean.adsConfigBean.adSwitch) {
if (isAdmobInit) {
adOpenMgr.show(activity, AdmobEvent("openAd", from), showCallBack)
adOpenMgr.show(activity, isUnLimit, AdmobEvent("openAd", from), showCallBack)
} else {
admobInitCallBack = {
}
adOpenMgr.show(activity, AdmobEvent("openAd", from), showCallBack)
adOpenMgr.show(activity, isUnLimit, AdmobEvent("openAd", from), showCallBack)
}
} else {
if (isMaxInit) {
maxOpenMgr.show(activity, AdMaxEvent("openAd", from), showCallBack)
maxOpenMgr.show(activity, isUnLimit, AdMaxEvent("openAd", from), showCallBack)
} else {
maxInitCallBack = {
maxOpenMgr.show(activity, AdMaxEvent("openAd", from), showCallBack)
maxOpenMgr.show(activity, isUnLimit, AdMaxEvent("openAd", from), showCallBack)
}
}
}
......@@ -197,49 +195,50 @@ object AdsMgr {
*/
fun showInsert(
activity: Activity,
isUnLimit: Boolean = false,
showCallBack: AdsShowCallBack? = null,
) {
if (configBean.isInBlackList) {
EventUtils.event("isInBlackList", configBean.isInBlackList.toString())
showCallBack?.failed()
return
}
LogEx.logDebug("showAd", "adSwitch=${adsConfigBean.adSwitch}")
LogEx.logDebug("showAd", "adSwitch=${AdConfigBean.adsConfigBean.adSwitch}")
val from = activity::class.java.simpleName
if (adsConfigBean.adSwitch) {
adInsertMgr.show(activity, AdmobEvent("interAd", from), showCallBack)
if (AdConfigBean.adsConfigBean.adSwitch) {
adInterMgr.show(activity, isUnLimit, AdmobEvent("interAd", from), showCallBack)
} else {
maxInsertMgr.show(activity, AdMaxEvent("interAd", from), showCallBack)
maxInsertMgr.show(activity, isUnLimit, AdMaxEvent("interAd", from), showCallBack)
}
}
/**
* 展示原生广告
*
* @param parent 需要展示原生广告的布局容器
* @param layout Admob原生根布局必须为 NativeAdView
* @param nativeView 需要展示广告的布局容器
* @param layout 原生广告布局 ,这里传入的layout要和com.example.mydemo.strategy.ads.admob.NativeView里的id一致
*/
fun showNative(
activity: Activity,
parent: FrameLayout,
@LayoutRes admobLayout: Int,
@LayoutRes maxLayout: Int,
nativeView: NativeParentView,
@LayoutRes layout: Int,
nativeCallBack: ((Any?) -> Unit)? = null
) {
if (configBean.isInBlackList) {
LogEx.logDebug("showNative", "isInBlackList")
EventUtils.event("isInBlackList", configBean.isInBlackList.toString())
return
}
val from = activity::class.java.simpleName
if (!isAdmobInit) return
if (adsConfigBean.adSwitch) {
adNativeMgr.show(AdmobEvent("nativeAd", from), parent, admobLayout, nativeCallBack)
if (AdConfigBean.adsConfigBean.adSwitch) {
adNativeMgr.show(AdmobEvent("nativeAd", "nativeAd"), nativeView, layout, nativeCallBack)
} else {
maxNativeMgr.show(AdMaxEvent("nativeAd", from), parent, maxLayout, nativeCallBack)
maxNativeMgr.show(AdMaxEvent("nativeAd", "nativeAd"), nativeView, layout, nativeCallBack)
}
}
fun isNativeShow() = LimitUtils.isAdShow(AdsType.NATIVE, null)
/**
* 展示banner广告
......@@ -251,7 +250,7 @@ object AdsMgr {
EventUtils.event("isInBlackList", configBean.isInBlackList.toString())
return
}
if (adsConfigBean.adSwitch) {
if (AdConfigBean.adsConfigBean.adSwitch) {
adBannerMgr.show(parent, collapsible, adClose)
}
}
......
......@@ -2,7 +2,19 @@ package com.base.appzxhy.ads
abstract class AdsShowCallBack {
open fun show() {}
abstract fun close(where: Int = 0)
abstract fun failed(where: Int = 0)
abstract fun adFailed(where: Int = 0)
open fun failed(where: Int = 0) {
next()
}
open fun adFailed(where: Int = 0) {
next()
}
open fun close(where: Int = 0) {
next()
}
abstract fun next()
}
\ No newline at end of file
......@@ -65,7 +65,6 @@ object LimitUtils {
.getInt(NUM_CLICK, 0) >= maxCount
}
private fun getAdEventMsg(adsType: AdsType): String {
return when (adsType) {
AdsType.OPEN -> "Open"
......@@ -120,7 +119,6 @@ object LimitUtils {
return !(isDisplayLimited || isClickLimited || isRequestLimited)
}
private fun addNum(key: String) {
val currentDate = System.currentTimeMillis().toFormatTime4()
if (saveDate != currentDate) {
......
package com.base.appzxhy.ads
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.Button
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.LayoutRes
import com.applovin.mediation.MaxAd
import com.applovin.mediation.nativeAds.MaxNativeAdLoader
import com.applovin.mediation.nativeAds.MaxNativeAdView
import com.applovin.mediation.nativeAds.MaxNativeAdViewBinder
import com.base.appzxhy.R
import com.google.android.gms.ads.nativead.NativeAd
import com.google.android.gms.ads.nativead.NativeAdView
@SuppressLint("ViewConstructor")
class NativeParentView(context: Context, attrs: AttributeSet? = null) :
FrameLayout(context, attrs) {
private val TAG = "NativeParentView"
private var removeAll = true
init {
// 获取XML属性
val a = context.obtainStyledAttributes(
attrs,
R.styleable.NativeParentView,
0,
0
)
// 从XML中读取属性值
// 例如,如果你的XML中有自定义属性 `app:customAttribute="value"`
removeAll = a.getBoolean(R.styleable.NativeParentView_removeAll, true)
// 回收TypedArray
a.recycle()
}
fun setNativeAd(
nativeAd: NativeAd,
@LayoutRes resource: Int? = null,
) {
val layout = resource ?: R.layout.layout_admob_native_custom
val adView =
layout.let { LayoutInflater.from(context).inflate(it, null) } as NativeAdView
adView.mediaView = adView.findViewById(R.id.ad_media)
adView.headlineView = adView.findViewById(R.id.ad_headline)
adView.bodyView = adView.findViewById(R.id.ad_body)
adView.callToActionView = adView.findViewById(R.id.ad_call_to_action)
adView.iconView = adView.findViewById(R.id.ad_app_icon)
(adView.headlineView as TextView?)?.text = nativeAd.headline
adView.mediaView?.mediaContent = nativeAd.mediaContent
if (nativeAd.body == null) {
adView.bodyView?.visibility = INVISIBLE
} else {
adView.bodyView?.visibility = VISIBLE
(adView.bodyView as TextView?)?.text = nativeAd.body
}
if (nativeAd.callToAction == null) {
adView.callToActionView?.visibility = INVISIBLE
} else {
adView.callToActionView?.visibility = VISIBLE
(adView.callToActionView as Button?)?.text = nativeAd.callToAction
}
if (nativeAd.icon == null) {
adView.iconView?.visibility = GONE
} else {
(adView.iconView as ImageView?)?.setImageDrawable(
nativeAd.icon?.drawable
)
adView.iconView?.visibility = VISIBLE
}
adView.setNativeAd(nativeAd)
setBackgroundResource(0)
if (removeAll) {
removeAllViews()
}
addView(adView)
}
fun setNativeAd(
nativeAdLoader: MaxNativeAdLoader,
nativeAd: MaxAd,
@LayoutRes resource: Int? = null
) {
val layout = resource ?: R.layout.layout_max_native_custom
val binder: MaxNativeAdViewBinder =
MaxNativeAdViewBinder.Builder(layout)
.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()
val adView = MaxNativeAdView(binder, context)
nativeAdLoader.render(adView, nativeAd)
setBackgroundResource(0)
removeAllViews()
addView(adView)
}
}
......@@ -3,9 +3,10 @@ package com.base.appzxhy.ads.admob
import android.app.Activity
import android.content.Context
import com.base.appzxhy.GlobalConfig
import com.base.appzxhy.ads.AdCountDownDialog.createUICountdownTimer
import com.base.appzxhy.MyApplication
import com.base.appzxhy.ads.AdCountDownDialog.showAdCountDownDialog
import com.base.appzxhy.ads.AdEvent
import com.base.appzxhy.ads.AdState
import com.base.appzxhy.ads.AdsShowCallBack
import com.base.appzxhy.ads.AdsType
import com.base.appzxhy.ads.LimitUtils
......@@ -15,6 +16,7 @@ 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
/**
......@@ -22,51 +24,65 @@ import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
*/
class AdInterMgr {
private var adState = AdmobAdState()
private var adState = AdState<InterstitialAd>()
private var showCallBack: AdsShowCallBack? = null
fun show(activity: Activity, adEvent: AdEvent, showCallBack: AdsShowCallBack?) {
fun show(
activity: Activity,
isUnLimit: Boolean,
adEvent: AdEvent,
showCallBack: AdsShowCallBack? = null
) {
if (activity.isFinishing || activity.isDestroyed) {
showCallBack?.failed(0)
adState.onAdDisplayFailed()
return
}
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
showCallBack?.failed(1)
return
}
if (LimitUtils.isIntervalLimited(adState.lastShowTime, adEvent)) {
showCallBack?.failed(2)
return
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
showCallBack?.failed(2)
return
}
if (LimitUtils.isIntervalLimited(adState.lastShowTime, adEvent)) {
showCallBack?.failed(3)
return
}
}
val loadingDialog = activity.showAdCountDownDialog()
if (adState.currentAd == null || !adAvailable()) {
loadAd(activity, adEvent) {
if (adState.currentAd != null) {
createUICountdownTimer(loadingDialog) {
showReadyAd(activity, adEvent, showCallBack)
}
}
}
adEvent.adPrepareShow()
adState.activityRef = WeakReference(activity)
this.showCallBack = showCallBack
if (adState.adDialog == null) {
adState.adDialog = activity.showAdCountDownDialog()
} else {
createUICountdownTimer(loadingDialog) {
showReadyAd(activity, adEvent, showCallBack)
adState.adDialog?.dismiss()
}
val needLoad = adState.currentAd == null || !adAvailable()
if (needLoad) {
if (!adState.loadingAd) {
loadAd(activity, isUnLimit, adEvent)
}
} else {
showReadyAd(adEvent)
}
}
private fun showReadyAd(activity: Activity, adEvent: AdEvent, showCallBack: AdsShowCallBack?) {
val ad = adState.currentAd as InterstitialAd?
ad?.run {
private fun showReadyAd(adEvent: AdEvent) {
adState.currentAd?.run {
fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
val ac = adState.activityRef?.get()
(adEvent as AdmobEvent).showAd(responseInfo, ac)
adState.onAdDisplayed()
showCallBack?.show()
(adEvent as AdmobEvent).showAd(responseInfo, activity)
LimitUtils.addDisplayNum()
}
......@@ -75,6 +91,8 @@ class AdInterMgr {
adState.onAdDisplayFailed()
showCallBack?.adFailed()
showCallBack = null
adEvent.adShowError(adError)
}
......@@ -84,7 +102,8 @@ class AdInterMgr {
adState.onAdHidden()
showCallBack?.close()
loadAd(activity.applicationContext, AdmobEvent("interAd", "preload"))
showCallBack = null
loadAd(MyApplication.appContext, false, AdmobEvent("interAd", "preload"))
}
override fun onAdClicked() {
......@@ -94,41 +113,48 @@ class AdInterMgr {
LimitUtils.addClickNum()
}
}
show(activity)
val activity = adState.activityRef?.get()
activity?.let { show(it) }
}
}
fun loadAd(context: Context, adEvent: AdEvent, loadCallBack: (() -> Unit)? = null) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
loadCallBack?.invoke()
adState.onAdLoadFailed()
return
fun loadAd(
context: Context,
adEvent: AdEvent,
isUnLimit: Boolean=false,
) {
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
this.showCallBack?.close(4)
this.showCallBack = null
adState.onAdLoadFailed()
return
}
}
if (!adState.loadingAd) {
adState.loadingAd = true
adEvent.adPulStart()
adEvent.adPulStart()
InterstitialAd.load(context, GlobalConfig.ID_ADMOB_INTER, AdRequest.Builder().build(),
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(ad: InterstitialAd) {
adState.onAdLoaded(ad)
loadCallBack?.invoke()
(adEvent as AdmobEvent).pullAd(ad.responseInfo)
LimitUtils.addRequestNum()
ad.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(ad)
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) {
showReadyAd(adEvent)
}
(adEvent as AdmobEvent).pullAd(ad.responseInfo)
LimitUtils.addRequestNum()
ad.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(ad)
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
adState.onAdLoadFailed()
(adEvent as AdmobEvent).pullAd(loadAdError.responseInfo, loadAdError)
loadCallBack?.invoke()
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
adState.onAdLoadFailed()
(adEvent as AdmobEvent).pullAd(loadAdError.responseInfo, loadAdError)
showCallBack?.adFailed()
showCallBack = null
}
)
}
}
)
}
......
package com.base.appzxhy.ads.admob
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.widget.Button
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import com.base.appzxhy.GlobalConfig
import com.base.appzxhy.R
import com.base.appzxhy.ads.AdsType
import com.base.appzxhy.ads.LimitUtils
import com.google.android.gms.ads.AdListener
import com.google.android.gms.ads.AdLoader
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.nativead.MediaView
import com.google.android.gms.ads.nativead.NativeAd
import com.google.android.gms.ads.nativead.NativeAdOptions
import com.google.android.gms.ads.nativead.NativeAdView
import java.util.concurrent.ConcurrentLinkedDeque
/**
*原生广告加载显示管理类
*/
class AdNativeMgr {
private val TAG = this::class.java.simpleName
/**
* 上一次的缓存成功时间
*/
protected var lastTime: Long = 0
private var currentAd: NativeAd? = null
/**
* 原生广告缓存队列
*/
private val cacheItems = ConcurrentLinkedDeque<NativeAd>()
private fun loadAd(
admobEvent: AdmobEvent,
context: Context,
callback: ((nativeAd: NativeAd) -> Unit)? = null
parent: NativeParentView,
layout: Int
) {
admobEvent.adPulStart()
if (!LimitUtils.isAdShow(AdsType.NATIVE, admobEvent)) return
admobEvent.adPulStart()
var currentNativeAd: NativeAd? = null
val adLoader = AdLoader.Builder(
context,
parent.context,
GlobalConfig.ID_ADMOB_NATIVE
).forNativeAd { nativeAd ->
currentNativeAd = nativeAd
cacheItems.offer(nativeAd)
lastTime = System.currentTimeMillis()
nativeAd.setOnPaidEventListener(AdmobEvent.EventOnPaidEventListener(nativeAd))
admobEvent.pullAd(nativeAd.responseInfo)
callback?.invoke(nativeAd)
show(admobEvent, parent, layout)
}.withAdListener(object : AdListener() {
override fun onAdFailedToLoad(error: LoadAdError) {
......@@ -72,72 +71,32 @@ class AdNativeMgr {
fun show(
admobEvent: AdmobEvent,
parent: FrameLayout,
parent: NativeParentView,
layout: Int,
nativeCallBack: ((Any?) -> Unit)? = null
) {
if (!LimitUtils.isAdShow(AdsType.NATIVE, admobEvent)) {
return
}
admobEvent.adPrepareShow()
if (currentAd == null || !adAvailable()) {
loadAd(admobEvent, parent.context) { nativeAd: NativeAd ->
setNative(parent, layout, nativeAd)
admobEvent.showAd(nativeAd.responseInfo)
nativeCallBack?.invoke(nativeAd)
}
} else {
currentAd?.let {
setNative(parent, layout, it)
admobEvent.showAd(it.responseInfo)
nativeCallBack?.invoke(it)
}
}
}
private fun setNative(parent: FrameLayout, layout: Int, nativeAd: NativeAd) = runCatching {
currentAd = null
val nativeView = LayoutInflater.from(parent.context).inflate(layout, parent, false) as NativeAdView
val mediaView = nativeView.findViewById<MediaView?>(R.id.ad_media)
mediaView?.mediaContent = nativeAd.mediaContent
val headlineView = nativeView.findViewById<TextView?>(R.id.ad_headline)
headlineView?.text = nativeAd.headline
val bodyView = nativeView.findViewById<TextView?>(R.id.ad_body)
if (nativeAd.body == null) {
bodyView?.visibility = View.INVISIBLE
} else {
bodyView?.visibility = View.VISIBLE
bodyView?.text = nativeAd.body
if (!LimitUtils.isAdShow(AdsType.NATIVE, admobEvent)) {
cacheItems.clear()
return
}
val callToActionView = nativeView.findViewById<Button?>(R.id.ad_call_to_action)
if (nativeAd.callToAction == null) {
callToActionView?.visibility = View.INVISIBLE
} else {
callToActionView?.visibility = View.VISIBLE
callToActionView?.text = nativeAd.callToAction
val nativeAd = cacheItems.peek()
if (nativeAd == null || !adAvailable()) {
//缓存过期了就清空
cacheItems.clear()
loadAd(admobEvent, parent, layout)
return
}
val iconView = nativeView.findViewById<ImageView?>(R.id.ad_app_icon)
if (nativeAd.icon == null) {
iconView?.visibility = View.GONE
} else {
iconView?.setImageDrawable(nativeAd.icon?.drawable)
iconView?.visibility = View.VISIBLE
}
parent.removeAllViews()
parent.addView(nativeView)
nativeCallBack?.invoke(nativeAd)
parent.setNativeAd(nativeAd, layout)
admobEvent.showAd(nativeAd.responseInfo)
}
private fun adAvailable(): Boolean {
return ((System.currentTimeMillis() - lastTime) / 1000 / 60).toInt() < 30
}
}
\ No newline at end of file
......@@ -3,9 +3,11 @@ package com.base.appzxhy.ads.admob
import android.app.Activity
import android.content.Context
import com.base.appzxhy.GlobalConfig
import com.base.appzxhy.MyApplication
import com.base.appzxhy.ads.AdCountDownDialog.createUICountdownTimer
import com.base.appzxhy.ads.AdsType
import com.base.appzxhy.ads.AdEvent
import com.base.appzxhy.ads.AdState
import com.base.appzxhy.ads.AdsShowCallBack
import com.base.appzxhy.ads.LimitUtils
import com.google.android.gms.ads.AdError
......@@ -13,6 +15,7 @@ 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
/**
......@@ -20,60 +23,64 @@ import com.google.android.gms.ads.appopen.AppOpenAd
*/
class AdOpenMgr {
private val adState = AdmobAdState()
private val TAG = "AdOpenMgr"
private val adState = AdState<AppOpenAd>()
private var showCallBack: AdsShowCallBack? = null
fun show(activity: Activity, adEvent: AdEvent, showCallBack: AdsShowCallBack?) {
fun show(activity: Activity, isUnLimit: Boolean, adEvent: AdEvent, showCallBack: AdsShowCallBack?) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) {
showCallBack?.failed()
return
}
if (LimitUtils.isIntervalLimited(adState.lastShowTime, adEvent)) {
showCallBack?.failed()
return
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) {
showCallBack?.failed()
return
}
if (LimitUtils.isIntervalLimited(adState.lastShowTime, adEvent)) {
showCallBack?.failed()
return
}
}
adEvent.adPrepareShow()
if (adState.currentAd == null || !adAvailable()) {
loadAd(activity, adEvent) {
if (adState.currentAd != null) {
createUICountdownTimer(null) {
showReadyAd(activity, adEvent, showCallBack)
}
} else {
showCallBack?.failed()
}
adEvent.adPrepareShow()
adState.activityRef = WeakReference(activity)
this.showCallBack = showCallBack
// if (adState.adDialog == null) {
// adState.adDialog = activity.showAdPreparingDialog(1)
// } else {
// adState.adDialog?.dismiss()
// }
val needLoad = adState.currentAd == null || !adAvailable()
if (needLoad) {
if (!adState.loadingAd) {
loadAd(activity, isUnLimit, adEvent)
}
} else {
createUICountdownTimer(null) {
showReadyAd(activity, adEvent, showCallBack)
}
showReadyAd(adEvent)
}
}
private fun showReadyAd(activity: Activity, adEvent: AdEvent, showCallBack: AdsShowCallBack?) {
val ad = adState.currentAd as AppOpenAd?
ad?.run {
private fun showReadyAd(adEvent: AdEvent) {
adState.currentAd?.run {
fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdShowedFullScreenContent() {
val ac = adState.activityRef?.get()
(adEvent as AdmobEvent).showAd(this@run.responseInfo, ac)
showCallBack?.show()
(adEvent as AdmobEvent).showAd(this@run.responseInfo, activity)
adState.onAdDisplayed()
//计数
LimitUtils.addDisplayNum()
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
super.onAdFailedToShowFullScreenContent(adError)
showCallBack?.adFailed()
showCallBack = null
adState.onAdDisplayFailed()
(adEvent as AdmobEvent).adShowError(adError)
......@@ -82,9 +89,15 @@ class AdOpenMgr {
override fun onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent()
showCallBack?.close()
showCallBack = null
adState.onAdHidden()
loadAd(activity.applicationContext, AdmobEvent("openAd", "preload"))
//预加载,“Timeout for show call succeed.”预加载的广告大概率,
loadAd(MyApplication.appContext, false, AdmobEvent("openAd", "preload"))
}
override fun onAdClicked() {
......@@ -93,43 +106,49 @@ class AdOpenMgr {
LimitUtils.addClickNum()
}
}
show(activity)
val activity = adState.activityRef?.get()
activity?.let { show(it) }
}
}
fun loadAd(context: Context, adEvent: AdEvent, loadCallBack: (() -> Unit)? = null) {
fun loadAd(context: Context, adEvent: AdEvent, isUnLimit: Boolean = false) {
if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) {
loadCallBack?.invoke()
adState.onAdLoadFailed()
return
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) {
this.showCallBack?.close()
this.showCallBack = null
adState.onAdLoadFailed()
return
}
}
if (!adState.loadingAd) {
adState.loadingAd = true
adEvent.adPulStart()
AppOpenAd.load(
context,
GlobalConfig.ID_ADMOB_OPEN,
AdRequest.Builder().build(),
object : AppOpenAd.AppOpenAdLoadCallback() {
override fun onAdLoaded(appOpenAd: AppOpenAd) {
adState.onAdLoaded(appOpenAd)
loadCallBack?.invoke()
(adEvent as AdmobEvent).pullAd(appOpenAd.responseInfo)
appOpenAd.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(appOpenAd)
LimitUtils.addRequestNum()
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
adState.onAdLoadFailed()
loadCallBack?.invoke()
(adEvent as AdmobEvent).pullAd(loadAdError.responseInfo, loadAdError)
adEvent.adPulStart()
AppOpenAd.load(
context,
GlobalConfig.ID_ADMOB_OPEN,
AdRequest.Builder().build(),
object : AppOpenAd.AppOpenAdLoadCallback() {
override fun onAdLoaded(appOpenAd: AppOpenAd) {
adState.onAdLoaded(appOpenAd)
if (this@AdOpenMgr.showCallBack != null) {
showReadyAd(adEvent)
}
(adEvent as AdmobEvent).pullAd(appOpenAd.responseInfo)
appOpenAd.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(appOpenAd)
LimitUtils.addRequestNum()
}
)
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
showCallBack?.adFailed()
showCallBack = null
adState.onAdLoadFailed()
(adEvent as AdmobEvent).pullAd(loadAdError.responseInfo, loadAdError)
}
}
)
}
private fun adAvailable() = ((System.currentTimeMillis() - adState.lastLoadTime) / 1000 / 60).toInt() < 30
......
......@@ -7,6 +7,7 @@ import com.base.appzxhy.ads.AdEvent
import com.base.appzxhy.ads.SolarEngineEvent
import com.base.appzxhy.ads.taichiPref
import com.base.appzxhy.ads.taichiSharedPreferencesEditor
import com.base.appzxhy.bean.config.AdConfigBean
import com.base.appzxhy.helper.EventUtils
import com.base.appzxhy.utils.LogEx
import com.facebook.appevents.AppEventsConstants
......@@ -25,7 +26,9 @@ import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.ktx.Firebase
import org.json.JSONObject
import kotlin.Any
import kotlin.random.Random
import kotlin.text.toFloat
class AdmobEvent : AdEvent {
......@@ -67,7 +70,7 @@ class AdmobEvent : AdEvent {
obj.put("status", "2")
}
EventUtils.event("ad_pull", ext = obj)
LogEx.logDebug(TAG, "ad_pull_$adUnit obj=$obj")
LogEx.logDebug(TAG, "ad_pull obj=$obj")
}
......@@ -89,9 +92,9 @@ class AdmobEvent : AdEvent {
obj.put("from", from)
obj.put("networkname", responseInfo?.mediationAdapterClassName)
if (adUnit != "nativeAd") {
EventUtils.event("ad_click_$adUnit", ext = obj)
EventUtils.event("ad_click", ext = obj)
} else {
EventUtils.event("ad_click_$adUnit", ext = obj)
EventUtils.event("ad_click", ext = obj)
}
}
......@@ -115,12 +118,21 @@ class AdmobEvent : AdEvent {
} else {
EventUtils.event("ad_show", ext = obj)
}
LogEx.logDebug(TAG, "ad_show_$adUnit $obj")
LogEx.logDebug(TAG, "ad_show $obj")
}
class EventOnPaidEventListener(private val ad: Any?) : OnPaidEventListener {
override fun onPaidEvent(adValue: AdValue) {
SolarEngineEvent.eventSolar(ad, adValue.valueMicros)
val adRatio = AdConfigBean.adsConfigBean.adRatio
val random = Random.Default.nextInt(1, 100)
if (random > adRatio) {
taichiSharedPreferencesEditor.putFloat("TaichiTroasCache", 0f)
taichiSharedPreferencesEditor.commit()
EventUtils.event("ad_price_limit")
return
}
val valueMicros = adValue.valueMicros
val currencyCode = adValue.currencyCode
val precision = adValue.precisionType
......@@ -149,9 +161,12 @@ class AdmobEvent : AdEvent {
params.putString("precisionType", precisionType)
Firebase.analytics.logEvent("Ad_Impression_Revenue", params)
val previousTaichiTroasCache = taichiPref.getFloat("TaichiTroasCache", 0f)
val currentTaichiTroasCache = (previousTaichiTroasCache +
currentImpressionRevenue).toFloat()
if (currentTaichiTroasCache >= 0.01) {//如果超过0.01就触发一次tROAS taichi事件
val taichiAdValue = AdConfigBean.adsConfigBean.taichiAdValue / 100f
if (currentTaichiTroasCache >= taichiAdValue) {//如果超过0.01就触发一次tROAS taichi事件
val roasbundle = Bundle()
roasbundle.putDouble(
FirebaseAnalytics.Param.VALUE,
......@@ -303,8 +318,6 @@ class AdmobEvent : AdEvent {
obj.put("from", from)
obj.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj)
LogEx.logDebug(TAG, "ad_show_error_$adUnit $obj")
LogEx.logDebug(TAG, "ad_show_error $obj")
}
}
package com.base.appzxhy.ads.applovin
import android.app.Activity
import java.lang.ref.WeakReference
class MaxAdState {
/**
* 当前缓存的广告
*/
var currentAd: Any? = null
/**
* 是否正在缓存加载广告
*/
var loadingAd: Boolean = false
/**
* 用于保存引用现有页面,在此页面显示广告(因为要等待广告加载完毕)
*/
var activityRef: WeakReference<Activity>? = null
/**
* 上一次的缓存成功时间
*/
var lastLoadTime: Long = 0
/**
* 上次展示时间
*/
var lastShowTime: Long = 0
fun onAdDisplayed() {
lastShowTime = System.currentTimeMillis()
activityRef = null
}
fun onAdHidden() {
// 广告关闭,清空缓存数据,重新加载
}
fun onAdDisplayFailed() {
activityRef = null
}
fun onAdLoaded() {
loadingAd = false
lastLoadTime = System.currentTimeMillis()
}
fun onAdLoadFailed() {
loadingAd = false
}
}
\ No newline at end of file
package com.base.appzxhy.ads.applovin
import android.app.Activity
import android.content.Context
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxInterstitialAd
import com.base.appzxhy.GlobalConfig
import com.base.appzxhy.MyApplication
import com.base.appzxhy.ads.AdCountDownDialog.createUICountdownTimer
import com.base.appzxhy.ads.AdCountDownDialog.showAdCountDownDialog
import com.base.appzxhy.ads.AdsType
import com.base.appzxhy.ads.AdEvent
import com.base.appzxhy.ads.AdState
import com.base.appzxhy.ads.AdsShowCallBack
import com.base.appzxhy.ads.LimitUtils
import java.lang.ref.WeakReference
/**
*插屏广告加载显示管理类
*/
class MaxInsertMgr {
private var adState = MaxAdState().apply {
currentAd = MaxInterstitialAd(GlobalConfig.ID_MAX_INTER, MyApplication.appContext)
}
private var adState = AdState<MaxInterstitialAd>()
private var showCallBack: AdsShowCallBack? = null
fun show(
activity: Activity,
isUnLimit: Boolean,
adEvent: AdEvent,
showCallBack: AdsShowCallBack?
) {
if (activity.isFinishing || activity.isDestroyed) {
showCallBack?.failed(0)
return
}
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
showCallBack?.failed(1)
return
}
if (LimitUtils.isIntervalLimited(adState.lastShowTime, adEvent)) {
showCallBack?.failed(2)
return
if (showCallBack != null) {
adState.activityRef = WeakReference(activity)
this.showCallBack = showCallBack
if (adState.adDialog == null) {
adState.adDialog = activity.showAdCountDownDialog()
}
adEvent.adPrepareShow()
}
adEvent.adPrepareShow()
if (!adState.loadingAd) {
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
showCallBack?.failed(3)
return
}
if (LimitUtils.isIntervalLimited(adState.lastShowTime, adEvent)) {
showCallBack?.failed(4)
return
}
}
val loadingDialog = activity.showAdCountDownDialog()
if (!adAvailable() || adState.currentAd == null) {
loadAd(activity, isUnLimit, adEvent)
return
}
if (adState.currentAd == null || !adAvailable()) {
loadAd(adEvent) { flag: Boolean ->
if (flag) {
createUICountdownTimer(loadingDialog) {
showReadyAd(activity, adEvent, showCallBack)
}
} else {
showCallBack?.failed()
}
if (adState.currentAd?.isReady == false) {
loadAd(activity, isUnLimit, adEvent)
return
}
} else {
showReadyAd(activity, adEvent, showCallBack)
showReadyAd(adEvent)
}
}
}
private fun showReadyAd(activity: Activity, adEvent: AdEvent, showCallBack: AdsShowCallBack?) {
val ad = adState.currentAd as MaxInterstitialAd?
ad?.run {
private fun showReadyAd(adEvent: AdEvent) {
adState.currentAd?.run {
setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) = Unit
override fun onAdLoadFailed(p0: String, p1: MaxError) = Unit
......@@ -84,6 +90,7 @@ class MaxInsertMgr {
override fun onAdDisplayFailed(ad: MaxAd, error: MaxError) {
adState.onAdDisplayFailed()
showCallBack?.adFailed()
showCallBack = null
(adEvent as AdMaxEvent).adShowError(error)
}
......@@ -93,7 +100,7 @@ class MaxInsertMgr {
adState.onAdHidden()
showCallBack?.close()
loadAd(AdMaxEvent("interAd", "preload"))
loadAd(activity.applicationContext, false, AdMaxEvent("interAd", "preload"))
}
override fun onAdClicked(ad: MaxAd) {
......@@ -112,43 +119,53 @@ class MaxInsertMgr {
fun loadAd(
context: Context,
adEvent: AdEvent,
loadCallBack: ((flag: Boolean) -> Unit)? = null
isUnLimit: Boolean=false,
) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
loadCallBack?.invoke(false)
return
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
this.showCallBack?.close(4)
this.showCallBack = null
return
}
}
val ad = adState.currentAd as MaxInterstitialAd?
if (!adState.loadingAd) {
adState.loadingAd = true
ad?.setListener(object : MaxAdListener {
adEvent.adPulStart()
override fun onAdDisplayed(p0: MaxAd) = Unit
override fun onAdHidden(p0: MaxAd) = Unit
override fun onAdClicked(p0: MaxAd) = Unit
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) = Unit
adState.currentAd = MaxInterstitialAd(GlobalConfig.ID_MAX_INTER, context)
adState.currentAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(ad: MaxAd) {
loadCallBack?.invoke(true)
adState.onAdLoaded()
(adEvent as AdMaxEvent).pullAd(ad)
LimitUtils.addRequestNum()
}
override fun onAdDisplayed(p0: MaxAd) = Unit
override fun onAdHidden(p0: MaxAd) = Unit
override fun onAdClicked(p0: MaxAd) = Unit
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) = Unit
override fun onAdLoadFailed(ad: String, error: MaxError) {
loadCallBack?.invoke(false)
adState.onAdLoadFailed()
(adEvent as AdMaxEvent).pullAd(null, error)
override fun onAdLoaded(ad: MaxAd) {
adState.onAdLoaded(null)
val ac = adState.activityRef?.get()
if (ac != null) {
show(ac, isUnLimit, adEvent, null)
}
}
(adEvent as AdMaxEvent).pullAd(ad)
LimitUtils.addRequestNum()
}
})
override fun onAdLoadFailed(ad: String, error: MaxError) {
adState.onAdLoadFailed()
if (!adState.loadingAd) {
adState.loadingAd = true
adEvent.adPulStart()
ad?.loadAd()
(adEvent as AdMaxEvent).pullAd(null, error)
showCallBack?.adFailed(5)
showCallBack = null
}
})
adState.currentAd?.loadAd()
}
}
......
package com.base.appzxhy.ads.applovin
import android.widget.FrameLayout
import androidx.annotation.LayoutRes
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.appzxhy.GlobalConfig
import com.base.appzxhy.R
import com.base.appzxhy.ads.AdsType
import com.base.appzxhy.ads.LimitUtils
import com.base.appzxhy.ads.NativeParentView
import com.base.appzxhy.helper.EventUtils
import org.json.JSONObject
import java.util.UUID
......@@ -32,9 +30,10 @@ class MaxNativeMgr {
private var currentAd: MaxAd? = null
private var currentLoader: MaxNativeAdLoader? = null
private fun loadAd(
adMaxEvent: AdMaxEvent,
parent: FrameLayout,
parent: NativeParentView,
@LayoutRes layout: Int
) {
......@@ -72,7 +71,7 @@ class MaxNativeMgr {
fun show(
adMaxEvent: AdMaxEvent,
parent: FrameLayout,
parent: NativeParentView,
@LayoutRes layout: Int,
nativeCallBack: ((Any?) -> Unit)? = null
) {
......@@ -106,41 +105,11 @@ class MaxNativeMgr {
val obj = JSONObject()
obj.put("ad_unit", "nativeAd")
EventUtils.event("ad_prepare_show", ext = obj)
setMaxNativeAd(parent, layout)
parent.setNativeAd(nativeLoader!!, nativeAd!!, layout)
nativeCallBack?.invoke(nativeAd)
}
private fun adAvailable(): Boolean {
return ((System.currentTimeMillis() - lastTime) / 1000 / 60).toInt() < 30
}
private fun setMaxNativeAd(parent: FrameLayout, layout: Int) {
// 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)
.build()
val maxNativeAdView = MaxNativeAdView(binder, parent.context)
parent.removeAllViews()
parent.addView(maxNativeAdView)
}
}
\ No newline at end of file
package com.base.appzxhy.ads.applovin
import android.app.Activity
import android.content.Context
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAppOpenAd
import com.base.appzxhy.GlobalConfig
import com.base.appzxhy.MyApplication
import com.base.appzxhy.ads.AdCountDownDialog.createUICountdownTimer
import com.base.appzxhy.ads.AdCountDownDialog.showAdCountDownDialog
import com.base.appzxhy.ads.AdsType
import com.base.appzxhy.ads.AdEvent
import com.base.appzxhy.ads.AdState
import com.base.appzxhy.ads.AdsShowCallBack
import com.base.appzxhy.ads.LimitUtils
import java.lang.ref.WeakReference
/**
* 开屏广告加载显示管理类
*/
class MaxOpenMgr {
private val adState = MaxAdState().apply {
currentAd = MaxAppOpenAd(GlobalConfig.ID_MAX_OPEN, MyApplication.appContext)
}
private val adState = AdState<MaxAppOpenAd>()
private var showCallBack: AdsShowCallBack? = null
fun show(activity: Activity, adEvent: AdEvent, showCallBack: AdsShowCallBack?) {
fun show(activity: Activity, isUnLimit: Boolean, adEvent: AdEvent, showCallBack: AdsShowCallBack?) {
if (activity.isFinishing || activity.isDestroyed) {
showCallBack?.failed(0)
return
}
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
showCallBack?.failed(1)
return
}
if (LimitUtils.isIntervalLimited(adState.lastShowTime, adEvent)) {
showCallBack?.failed(2)
return
if (showCallBack != null) {
this.showCallBack = showCallBack
adState.activityRef = WeakReference(activity)
adEvent.adPrepareShow()
}
adEvent.adPrepareShow()
val loadingDialog = activity.showAdCountDownDialog()
if (!adState.loadingAd) {
if (!adAvailable()) {
loadAd(adEvent) { flag: Boolean ->
if (flag) {
createUICountdownTimer(loadingDialog) {
showReadyAd(activity, adEvent, showCallBack)
}
} else {
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) {
showCallBack?.failed()
return
}
if (LimitUtils.isIntervalLimited(adState.lastShowTime, adEvent)) {
showCallBack?.failed()
return
}
}
} else {
showReadyAd(activity, adEvent, showCallBack)
if (!adAvailable() || adState.currentAd == null) {
loadAd(activity, isUnLimit, adEvent)
return
}
if (adState.currentAd?.isReady != true) {
loadAd(activity, isUnLimit, adEvent)
return
}
showReadyAd(activity, adEvent)
}
}
private fun showReadyAd(activity: Activity, adEvent: AdEvent, showCallBack: AdsShowCallBack?) {
val ad = adState.currentAd as MaxAppOpenAd?
}
ad?.run {
private fun showReadyAd(activity: Activity, adEvent: AdEvent) {
adState.currentAd?.run {
setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) {
override fun onAdLoaded(p0: MaxAd) = Unit
override fun onAdLoadFailed(p0: String, p1: MaxError) = Unit
}
override fun onAdDisplayed(ad: MaxAd) {
adState.onAdDisplayed()
showCallBack?.show()
LimitUtils.addDisplayNum()
(adEvent as AdMaxEvent).showAd(ad, activity::class.simpleName)
}
......@@ -78,7 +80,9 @@ class MaxOpenMgr {
override fun onAdHidden(p0: MaxAd) {
adState.onAdHidden()
showCallBack?.close()
loadAd(AdMaxEvent("openAd", "preload"))
showCallBack = null
loadAd(activity.applicationContext, false, AdMaxEvent("openAd", "preload"))
}
override fun onAdClicked(ad: MaxAd) {
......@@ -87,10 +91,14 @@ class MaxOpenMgr {
LimitUtils.addClickNum()
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
}
override fun onAdDisplayFailed(p0: MaxAd, error: MaxError) {
adState.onAdDisplayFailed()
showCallBack?.adFailed()
showCallBack = null
adEvent.adShowError(error)
}
......@@ -100,43 +108,60 @@ class MaxOpenMgr {
}
}
fun loadAd(
adEvent: AdEvent,
loadCallBack: ((flag: Boolean) -> Unit)? = null
) {
fun loadAd(context: Context, isUnLimit: Boolean, adEvent: AdEvent) {
if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) {
loadCallBack?.invoke(false)
return
}
val ad = adState.currentAd as MaxAppOpenAd?
ad?.setListener(object : MaxAdListener {
override fun onAdLoaded(ad: MaxAd) {
adState.onAdLoaded()
loadCallBack?.invoke(true)
(adEvent as AdMaxEvent).pullAd(ad)
LimitUtils.addRequestNum()
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) {
this.showCallBack?.close()
this.showCallBack = null
return
}
override fun onAdLoadFailed(p0: String, error: MaxError) {
adState.onAdLoadFailed()
(adEvent as AdMaxEvent).pullAd(null, error)
loadCallBack?.invoke(false)
}
override fun onAdDisplayed(p0: MaxAd) = Unit
override fun onAdHidden(p0: MaxAd) = Unit
override fun onAdClicked(p0: MaxAd) = Unit
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) = Unit
})
}
if (!adState.loadingAd) {
adState.loadingAd = true
adEvent.adPulStart()
ad?.loadAd()
adState.currentAd = MaxAppOpenAd(GlobalConfig.ID_MAX_OPEN, context)
adState.currentAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(ad: MaxAd) {
adState.onAdLoaded(null)
val ac = adState.activityRef?.get()
if (ac != null) {
show(ac, isUnLimit, adEvent, null)
}
(adEvent as AdMaxEvent).pullAd(ad)
LimitUtils.addRequestNum()
}
override fun onAdDisplayed(p0: MaxAd) {
}
override fun onAdHidden(p0: MaxAd) {
}
override fun onAdClicked(p0: MaxAd) {
}
override fun onAdLoadFailed(p0: String, error: MaxError) {
adState.onAdLoadFailed()
showCallBack?.adFailed()
showCallBack = null
(adEvent as AdMaxEvent).pullAd(null, error)
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
}
})
adState.currentAd?.loadAd()
}
}
private fun adAvailable() = ((System.currentTimeMillis() - adState.lastLoadTime) / 1000 / 60).toInt() < 30
fun adAvailable() = ((System.currentTimeMillis() - adState.lastLoadTime) / 1000 / 60).toInt() < 30
}
\ No newline at end of file
package com.base.appzxhy.bean.config
class AdConfigBean(
var isAdShow: Boolean = false,//广告开关
var isAdShow: Boolean = true,//广告开关
var adSwitch: Boolean = true,//true 走admob,false走max
var numDisplayLimit: Int = -1,
var numRequestLimit: Int = -1,
var numClickLimit: Int = -1,
var timeInterval: Int = 1,
var openAdLoading: Int = 15,
var functionBackShowAd: Boolean = true,
var functionInShowAd: Boolean = true,
var taichiAdValue: Int = 1,//价值上报阀值
var adRatio: Int = 100,//价值上报随机控制
var numDisplayLimit: Int = -1,//展示次数限制
var numRequestLimit: Int = -1,//请求次数限制
var numClickLimit: Int = -1,//点击次数限制
var timeInterval: Int = 1,//广告间隔
var openAdLoading: Int = 15,//开屏广告拉取时间
var functionBackShowAd: Boolean = true,//功能退出显示广告
var functionInShowAd: Boolean = true,//功能进入显示广告
) {
companion object {
......
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