Commit 191187b2 authored by wanglei's avatar wanglei

[同步]广告的问题

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