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