Commit eb1ce437 authored by wanglei's avatar wanglei

max广告

parent fecada1c
...@@ -6,7 +6,6 @@ import android.content.Intent ...@@ -6,7 +6,6 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import com.base.filerecoveryrecyclebin.activity.SplashActivity import com.base.filerecoveryrecyclebin.activity.SplashActivity
import com.base.filerecoveryrecyclebin.ads.admob.AdmobOpenUtils import com.base.filerecoveryrecyclebin.ads.admob.AdmobOpenUtils
import com.base.filerecoveryrecyclebin.ads.max.AdMaxInit.initAdMax
import com.base.filerecoveryrecyclebin.bean.ConstObject.ifAgreePrivacy import com.base.filerecoveryrecyclebin.bean.ConstObject.ifAgreePrivacy
import com.base.filerecoveryrecyclebin.fcm.FCMManager import com.base.filerecoveryrecyclebin.fcm.FCMManager
import com.base.filerecoveryrecyclebin.fcm.RecoveryTimerManager import com.base.filerecoveryrecyclebin.fcm.RecoveryTimerManager
......
package com.base.filerecoveryrecyclebin.ads
import android.app.Activity
import android.view.ViewGroup
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import com.base.filerecoveryrecyclebin.ads.admob.AdmobOpenUtils
import com.base.filerecoveryrecyclebin.ads.max.AdMaxInterstitialUtils
import com.base.filerecoveryrecyclebin.ads.max.AdMaxNativeUtils
import com.base.filerecoveryrecyclebin.ads.max.AdMaxOpenUtils
import com.base.filerecoveryrecyclebin.help.ConfigHelper
object AdmobMaxHelper {
private val TAG = ""
fun admobMaxShowInterstitialAd(activity: Activity, onHidden: (() -> Unit)? = null) {
if (ConfigHelper.admobTrueMaxFlase) {
AdmobInterstitialUtils.showInterstitialAd(activity) {
onHidden?.invoke()
}
} else {
AdMaxInterstitialUtils.showInterstitialAd(activity) {
onHidden?.invoke()
}
}
}
fun admobMaxShowOpenAd(activity: Activity, showBeforeAction: () -> Unit, onHidden: (() -> Unit)? = null) {
if (ConfigHelper.admobTrueMaxFlase) {
AdmobOpenUtils.showAppOpenAd(activity, showBefore = showBeforeAction) {
onHidden?.invoke()
}
} else {
AdMaxOpenUtils.showAppOpenAd(activity, loaded = showBeforeAction) {
onHidden?.invoke()
}
}
}
fun admobMaxShowNativeAd(activity: Activity, parent: ViewGroup, where: Int = 0) {
if (ConfigHelper.admobTrueMaxFlase) {
AdmobNativeUtils.showNativeAd(activity, parent)
} else {
var layout = R.layout.layout_max_native_small
if (where == 0) {
layout = R.layout.layout_max_native_small_f8f8f8
}
if (where == 1) {
layout = R.layout.layout_max_native_big
}
AdMaxNativeUtils.showNativeAd(activity, parent, layout)
}
}
}
\ No newline at end of file
...@@ -64,7 +64,7 @@ object AdmobOpenUtils { ...@@ -64,7 +64,7 @@ object AdmobOpenUtils {
} }
fun showAppOpenAd(activity: Activity, skip: Boolean = false, onHidden: ((where: Int) -> Unit)? = null) { fun showAppOpenAd(activity: Activity, showBefore: (() -> Unit)? = null, onHidden: ((where: Int) -> Unit)? = null) {
if (activity.isFinishing || activity.isDestroyed) { if (activity.isFinishing || activity.isDestroyed) {
return return
......
package com.base.filerecoveryrecyclebin.ads.max package com.base.datarecovery.ads.max
import android.app.Activity import android.app.Activity
import android.os.Bundle
import com.applovin.mediation.MaxAd import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdRevenueListener
import com.applovin.sdk.AppLovinSdk
import com.base.filerecoveryrecyclebin.help.BaseApplication
import com.base.filerecoveryrecyclebin.utils.EventUtils import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.facebook.FacebookSdk
import com.google.firebase.analytics.FirebaseAnalytics
import org.json.JSONObject import org.json.JSONObject
object AdMaxEvent { object AdMaxEvent {
fun clickAd(nativeAd: MaxAd, adUnit: String) { fun pullAd(ad: MaxAd?, adUnit: String, error: String? = null, reqId: String? = null) {
// val response = responseInfo?.adapterResponses?.getOrNull(0)
val obj = JSONObject() val obj = JSONObject()
// obj.put("source", response?.adSourceName) obj.put("UnitId", ad?.adUnitId)
obj.put("source", nativeAd.dspName)
obj.put("ad_unit", adUnit) obj.put("ad_unit", adUnit)
obj.put(
"creativeId",
ad?.creativeId
)
obj.put("req_id", reqId)
obj.put("status", if (ad == null) "0" else "1")
obj.put("networkname", ad?.networkName)
obj.put("placement", ad?.placement)
obj.put("networkplacement", ad?.networkPlacement)
obj.put("latency", ad?.requestLatencyMillis)
obj.put("valueMicros", ad?.revenue)
if (error == null) {
obj.put("status", "1")
} else {
obj.put("errMsg", error)
obj.put("status", "2")
}
EventUtils.event("ad_pull", ext = obj)
}
fun clickAd(ad: MaxAd?, adUnit: String) {
// val credentials = mapOf( val obj = JSONObject()
// "placementid" to response?.credentials?.get("placementid"), obj.put("UnitId", ad?.adUnitId)
// "appid" to response?.credentials?.get("appid"), obj.put("ad_unit", adUnit)
// "pubid" to response?.credentials?.get("pubid") obj.put(
// ) "creativeId",
// obj.put("credentials", credentials.toString()) ad?.creativeId
// obj.put("session_id", responseInfo?.responseId) )
// obj.put("networkname", responseInfo?.mediationAdapterClassName) obj.put("networkname", ad?.networkName)
obj.put("networkname", nativeAd.networkName) obj.put("placement", ad?.placement)
if (adUnit != "nativeAd") { obj.put("networkplacement", ad?.networkPlacement)
obj.put("latency", ad?.requestLatencyMillis)
obj.put("valueMicros", ad?.revenue)
if(!adUnit.equals("nativeAd")){
EventUtils.event("ad_click", ext = obj) EventUtils.event("ad_click", ext = obj)
} else { }else{
EventUtils.event("bigimage_ad_click", ext = obj) EventUtils.event("big_imgad_click", ext = obj)
} }
} }
fun showAd(nativeAd: MaxAd, adUnit: String, activity: Activity? = null) { fun showAd(ad: MaxAd?, adUnit: String) {
// val response = responseInfo?.adapterResponses?.getOrNull(0)
val obj = JSONObject() val obj = JSONObject()
// obj.put("source", response?.adSourceName) obj.put("UnitId", ad?.adUnitId)
obj.put("ad_unit", adUnit) obj.put("ad_unit", adUnit)
obj.put("networkname", nativeAd.networkName) obj.put(
// val credentials = mapOf( "creativeId",
// "placementid" to response?.credentials?.get("placementid"), ad?.creativeId
// "appid" to response?.credentials?.get("appid"), )
// "pubid" to response?.credentials?.get("pubid") obj.put("networkname", ad?.networkName)
// ) obj.put("placement", ad?.placement)
// obj.put("credentials", credentials.toString()) obj.put("networkplacement", ad?.networkPlacement)
// obj.put("session_id", responseInfo?.responseId) obj.put("latency", ad?.requestLatencyMillis)
obj.put("from", activity?.javaClass?.simpleName) obj.put("valueMicros", ad?.revenue)
if (adUnit != "nativeAd") { if(!adUnit.equals("nativeAd")){
EventUtils.event("ad_show", ext = obj) EventUtils.event("ad_show", ext = obj)
}else{
EventUtils.event("big_img_show", ext = obj)
}
}
private val taichiPref = FacebookSdk.getApplicationContext()
.getSharedPreferences("TaichiTroasCache", 0)
private val taichiSharedPreferencesEditor = taichiPref.edit()
class EventOnPaidEventListener : MaxAdRevenueListener {
override fun onAdRevenuePaid(ad: MaxAd) {
val params = Bundle()
val currentImpressionRevenue: Double = ad.revenue // In USD
val mFirebaseAnalytics = FirebaseAnalytics.getInstance(BaseApplication.context)
params.putString(FirebaseAnalytics.Param.AD_PLATFORM, "appLovin")
params.putString(FirebaseAnalytics.Param.AD_SOURCE, ad.networkName)
params.putString(FirebaseAnalytics.Param.AD_FORMAT, ad.format.getDisplayName())
params.putString(FirebaseAnalytics.Param.AD_UNIT_NAME, ad.adUnitId)
params.putDouble(FirebaseAnalytics.Param.VALUE, currentImpressionRevenue)
params.putString(FirebaseAnalytics.Param.CURRENCY, "USD")
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION, params)
mFirebaseAnalytics.logEvent("Ad_Impression_Revenue", params)
val previousTaichiTroasCache = taichiPref.getFloat("TaichiTroasCache", 0f)
val currentTaichiTroasCache = previousTaichiTroasCache + currentImpressionRevenue
if (currentTaichiTroasCache >= 0.01) {
val roasbundle = Bundle()
roasbundle.putDouble(FirebaseAnalytics.Param.VALUE, currentTaichiTroasCache)
roasbundle.putString(FirebaseAnalytics.Param.CURRENCY, "USD")///(Required)tROAS事件必须
mFirebaseAnalytics.logEvent("Total_Ads_Revenue_001", roasbundle) // 给Taichi用
taichiSharedPreferencesEditor.putFloat("TaichiTroasCache", 0f)//重新清零,开始计算
} else { } else {
EventUtils.event("bigimage_ad_show", ext = obj) taichiSharedPreferencesEditor.putFloat(
"TaichiTroasCache",
currentTaichiTroasCache.toFloat()
)
taichiSharedPreferencesEditor.commit()
}
val obj = JSONObject()
val revenue = ad.revenue
val countryCode =
AppLovinSdk.getInstance(BaseApplication.context).configuration.countryCode
val networkName = ad.networkName
val adUnitId = ad.adUnitId
val adFormat = ad.format
val placement = ad.placement
val networkPlacement = ad.networkPlacement
obj.put("valueMicros", revenue)
obj.put("currencyCode", countryCode)
obj.put("adUnitId", adUnitId)
obj.put("networkName", networkName)
obj.put("adFormat", adFormat)
obj.put("placement", placement)
obj.put("networkPlacement", networkPlacement)
EventUtils.event("ad_price", ext = obj)
} }
} }
} }
\ No newline at end of file
package com.base.filerecoveryrecyclebin.ads.max package com.base.filerecoveryrecyclebin.ads.max
import android.content.Context import android.content.Context
import com.applovin.sdk.AppLovinMediationProvider import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkInitializationConfiguration import com.applovin.sdk.AppLovinSdkInitializationConfiguration
import com.base.filerecoveryrecyclebin.utils.LogEx import com.base.filerecoveryrecyclebin.utils.LogEx
import com.google.android.gms.ads.identifier.AdvertisingIdClient
import java.util.Collections
import java.util.concurrent.Executors import java.util.concurrent.Executors
import java.util.concurrent.atomic.AtomicBoolean
object AdMaxInit { object AdMaxInit {
private val TAG = "AdMaxInit" private val TAG = "com.base.filerecoveryrecyclebin.ads.max.AdMaxInit"
var isAdMaxInit = false var isAdMaxInit = AtomicBoolean(false)
var maxInitAction: (() -> Unit)? = null
fun Context.initAdMax() { fun Context.initAdMax() {
// If you want to test your own AppLovin SDK key, change the value here and update the package name in the build.gradle // If you want to test your own AppLovin SDK key, change the value here and update the package name in the build.gradle
...@@ -25,16 +24,17 @@ object AdMaxInit { ...@@ -25,16 +24,17 @@ object AdMaxInit {
initConfigBuilder.mediationProvider = AppLovinMediationProvider.MAX initConfigBuilder.mediationProvider = AppLovinMediationProvider.MAX
// Enable test mode by default for the current device. Cannot be run on the main thread. // Enable test mode by default for the current device. Cannot be run on the main thread.
val currentGaid = AdvertisingIdClient.getAdvertisingIdInfo(this).id // val currentGaid = AdvertisingIdClient.getAdvertisingIdInfo(this).id
if (currentGaid != null) { // if (currentGaid != null) {
initConfigBuilder.testDeviceAdvertisingIds = Collections.singletonList(currentGaid) // initConfigBuilder.testDeviceAdvertisingIds = Collections.singletonList(currentGaid)
} // }
// Initialize the AppLovin SDK // Initialize the AppLovin SDK
val sdk = AppLovinSdk.getInstance(this) val sdk = AppLovinSdk.getInstance(this)
sdk.initialize(initConfigBuilder.build()) { sdk.initialize(initConfigBuilder.build()) {
LogEx.logDebug(TAG, "max init") LogEx.logDebug(TAG, "max init")
isAdMaxInit = true isAdMaxInit.set(true)
maxInitAction?.invoke()
} }
executor.shutdown() executor.shutdown()
......
...@@ -2,31 +2,19 @@ package com.base.filerecoveryrecyclebin.ads.max ...@@ -2,31 +2,19 @@ package com.base.filerecoveryrecyclebin.ads.max
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.app.Dialog
import android.os.CountDownTimer
import android.os.Handler
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.datarecovery.ads.max.AdMaxEvent
import com.base.filerecoveryrecyclebin.R import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.ads.AdmobCommonUtils
import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent
import com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import com.base.filerecoveryrecyclebin.help.ConfigHelper import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.utils.EventUtils import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx import com.base.filerecoveryrecyclebin.utils.LogEx
import com.base.filerecoveryrecyclebin.view.CustomDialog import com.base.filerecoveryrecyclebin.view.CustomDialog
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.FullScreenContentCallback
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.json.JSONObject import org.json.JSONObject
import java.util.concurrent.TimeUnit import java.util.UUID
import kotlin.math.min
import kotlin.math.pow
object AdMaxInterstitialUtils { object AdMaxInterstitialUtils {
...@@ -36,48 +24,47 @@ object AdMaxInterstitialUtils { ...@@ -36,48 +24,47 @@ object AdMaxInterstitialUtils {
private var onHidden: (() -> Unit)? = null private var onHidden: (() -> Unit)? = null
private var loadingListener: (() -> Unit)? = null private var loadingListener: (() -> Unit)? = null
private var retryAttempt = 0 private var retryAttempt = 0
private var maxRetryAttempt = 8
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")
private var customDialog: CustomDialog? = null private var customDialog: CustomDialog? = null
private fun setListener(activity: Activity) { private fun setListener(activity: Activity) {
if (interstitialAd == null) { if (interstitialAd == null) {
interstitialAd = MaxInterstitialAd(ConfigHelper.interAdMaxId, activity)
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "interAd")
EventUtils.event("ad_pull_start", ext = obj)
interstitialAd = MaxInterstitialAd(ConfigHelper.interAdMaxId, activity)
interstitialAd?.setListener(object : MaxAdListener { interstitialAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) { override fun onAdLoaded(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdLoaded") LogEx.logDebug(TAG, "onAdLoaded")
loadingListener?.invoke() loadingListener?.invoke()
interLoadTime = System.currentTimeMillis() interLoadTime = System.currentTimeMillis()
retryAttempt = 0 retryAttempt = 0
AdMaxEvent.pullAd(p0, "interAd", reqId = reqId)
} }
override fun onAdLoadFailed(p0: String, p1: MaxError) { override fun onAdLoadFailed(p0: String, p1: MaxError) {
LogEx.logDebug(TAG, "onAdLoadFailed") LogEx.logDebug(TAG, "onAdLoadFailed")
AdMaxEvent.pullAd(null, "interAd", reqId = reqId)
AdDisplayUtils.getInstance().incrementAdRequestFailCount() AdDisplayUtils.getInstance().incrementAdRequestFailCount()
retryAttempt++ retryAttempt++
val delayMillis = TimeUnit.SECONDS.toMillis(2.0.pow(min(6, retryAttempt)).toLong()) LogEx.logDebug(TAG, "onAdLoadFailed retryAttempt=$retryAttempt")
LogEx.logDebug(TAG, "onAdLoadFailed retryAttempt=$retryAttempt delayMillis=$delayMillis") if (retryAttempt == 1) {
if (retryAttempt == 2) {
onHidden?.invoke()
customDialog?.dismiss() customDialog?.dismiss()
} onHidden?.invoke()
if (retryAttempt <= maxRetryAttempt) {
MainScope().launch {
delay(delayMillis)
interstitialAd?.loadAd()
}
} else {
retryAttempt = 0 retryAttempt = 0
} else {
// interstitialAd?.loadAd()
} }
} }
override fun onAdDisplayed(p0: MaxAd) { override fun onAdDisplayed(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdDisplayed") LogEx.logDebug(TAG, "onAdDisplayed")
AdDisplayUtils.getInstance().incrementAdDisplayCount() AdDisplayUtils.getInstance().incrementAdDisplayCount()
AdMaxEvent.showAd(p0, "interAd")
} }
override fun onAdHidden(p0: MaxAd) { override fun onAdHidden(p0: MaxAd) {
...@@ -89,6 +76,7 @@ object AdMaxInterstitialUtils { ...@@ -89,6 +76,7 @@ object AdMaxInterstitialUtils {
override fun onAdClicked(p0: MaxAd) { override fun onAdClicked(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdClicked") LogEx.logDebug(TAG, "onAdClicked")
AdDisplayUtils.getInstance().incrementAdClickCount() AdDisplayUtils.getInstance().incrementAdClickCount()
AdMaxEvent.clickAd(p0, "interAd")
} }
...@@ -97,11 +85,10 @@ object AdMaxInterstitialUtils { ...@@ -97,11 +85,10 @@ object AdMaxInterstitialUtils {
} }
}) })
} }
}
fun showInterstitialAd( fun showInterstitialAd(
activity: Activity, activity: Activity,
isReLoadAd: Boolean = false,
isShowDialog: Boolean = true,
onHidden: (() -> Unit)? = null onHidden: (() -> Unit)? = null
) { ) {
setListener(activity) setListener(activity)
...@@ -128,14 +115,15 @@ object AdMaxInterstitialUtils { ...@@ -128,14 +115,15 @@ object AdMaxInterstitialUtils {
return return
} }
this.onHidden = onHidden AdMaxInterstitialUtils.onHidden = onHidden
interstitialAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
if (interstitialAd?.isReady == true) { if (interstitialAd?.isReady == true) {
LogEx.logDebug(TAG, "isReady=true") LogEx.logDebug(TAG, "isReady=true")
showIntervalDialogAndShowAd(activity, isShowDialog, onHidden, 2) interstitialAd?.showAd()
} else { } else {
interstitialAd?.loadAd() interstitialAd?.loadAd()
LogEx.logDebug(TAG, "isReady=false") LogEx.logDebug(TAG, "isReady=false")
showAdDialogAndLoadInterstitial(activity, isShowDialog) showAdDialogAndLoadInterstitial(activity)
} }
} }
...@@ -144,49 +132,10 @@ object AdMaxInterstitialUtils { ...@@ -144,49 +132,10 @@ object AdMaxInterstitialUtils {
return System.currentTimeMillis() - interLoadTime > 1000 * 60 * 60 return System.currentTimeMillis() - interLoadTime > 1000 * 60 * 60
} }
private fun showIntervalDialogAndShowAd(
activity: Activity,
isShowDialog: Boolean,
onHidden: (() -> Unit)?,
interval: Int
) {
// if (!isShowDialog) {
// return
// }
//
// if (customDialog != null && customDialog?.isShowing == true) {
// return // 如果对话框已经显示,则不再显示
// }
//
// customDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
// customDialog?.setCountdownText(R.id.dialog_ad_loading_text)
// val countdownTimer = object : CountDownTimer((interval * 1000).toLong(), 1000) {
// override fun onTick(millisUntilFinished: Long) {
// val seconds = (millisUntilFinished / 1000).toInt()
// customDialog?.updateCountdownText("Advertising in preparation ($seconds" + "s)...")
// }
//
// override fun onFinish() {
// if (!activity.isDestroyed && !activity.isFinishing) {
// customDialog?.dismiss()
// }
// customDialog = null
// LogEx.logDebug(TAG, "onFinish")
interstitialAd?.showAd()
// }
// }
// countdownTimer.start()
// customDialog?.show()
}
private fun showAdDialogAndLoadInterstitial( private fun showAdDialogAndLoadInterstitial(
activity: Activity, activity: Activity,
isShowDialog: Boolean,
) { ) {
if (!isShowDialog) {
return
}
if (!activity.isFinishing && !activity.isDestroyed) { if (!activity.isFinishing && !activity.isDestroyed) {
customDialog = CustomDialog(activity, R.layout.dialog_ad_loading) customDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
// 设置对话框的样式和内容 // 设置对话框的样式和内容
...@@ -201,8 +150,15 @@ object AdMaxInterstitialUtils { ...@@ -201,8 +150,15 @@ object AdMaxInterstitialUtils {
} }
fun loadInterstitialAd(activity: Activity) { fun loadInterstitialAd(activity: Activity) {
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
return
}
setListener(activity) setListener(activity)
if (AdMaxInit.isAdMaxInit) { if (!AdDisplayUtils.getInstance().shouldShowAd()) {
return
}
if (AdMaxInit.isAdMaxInit.get()) {
LogEx.logDebug(TAG, "loadInterstitialAd")
interstitialAd?.loadAd() interstitialAd?.loadAd()
} }
} }
......
...@@ -4,15 +4,13 @@ import android.app.Activity ...@@ -4,15 +4,13 @@ import android.app.Activity
import android.content.Context import android.content.Context
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.adjust.sdk.Adjust
import com.adjust.sdk.AdjustAdRevenue
import com.adjust.sdk.AdjustConfig
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.applovin.mediation.nativeAds.MaxNativeAdViewBinder
import com.base.datarecovery.ads.max.AdMaxEvent
import com.base.filerecoveryrecyclebin.R import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.ads.AdmobCommonUtils import com.base.filerecoveryrecyclebin.ads.AdmobCommonUtils
...@@ -35,8 +33,9 @@ object AdMaxNativeUtils { ...@@ -35,8 +33,9 @@ object AdMaxNativeUtils {
//加载展示监听 //加载展示监听
nativeAdLoader.setNativeAdListener(object : MaxNativeAdListener() { nativeAdLoader.setNativeAdListener(object : MaxNativeAdListener() {
override fun onNativeAdLoaded(nativeAdView: MaxNativeAdView?, ad: MaxAd) { override fun onNativeAdLoaded(nativeAdView: MaxNativeAdView?, ad: MaxAd) {
LogEx.logDebug(TAG, "onNativeAdLoaded")
// Cleanup any pre-existing native ad to prevent memory leaks. // Cleanup any pre-existing native ad to prevent memory leaks.
if (nativeAd != null) { if (nativeAd?.nativeAd?.isExpired == true) {
nativeAdLoader.destroy(nativeAd) nativeAdLoader.destroy(nativeAd)
} }
...@@ -48,6 +47,7 @@ object AdMaxNativeUtils { ...@@ -48,6 +47,7 @@ object AdMaxNativeUtils {
override fun onNativeAdLoadFailed(p0: String, p1: MaxError) { override fun onNativeAdLoadFailed(p0: String, p1: MaxError) {
super.onNativeAdLoadFailed(p0, p1) super.onNativeAdLoadFailed(p0, p1)
LogEx.logDebug(TAG, "onNativeAdLoadFailed")
AdDisplayUtils.getInstance().incrementAdRequestFailCount() AdDisplayUtils.getInstance().incrementAdRequestFailCount()
val obj2 = JSONObject() val obj2 = JSONObject()
obj2.put("reason", "no_ad") obj2.put("reason", "no_ad")
...@@ -57,6 +57,7 @@ object AdMaxNativeUtils { ...@@ -57,6 +57,7 @@ object AdMaxNativeUtils {
override fun onNativeAdClicked(p0: MaxAd) { override fun onNativeAdClicked(p0: MaxAd) {
super.onNativeAdClicked(p0) super.onNativeAdClicked(p0)
LogEx.logDebug(TAG, "onNativeAdClicked")
AdDisplayUtils.getInstance().incrementAdClickCount() AdDisplayUtils.getInstance().incrementAdClickCount()
nativeAd?.let { AdMaxEvent.clickAd(it, "nativeAd") } nativeAd?.let { AdMaxEvent.clickAd(it, "nativeAd") }
AdmobCommonUtils.isMultiClick(nativeAd) AdmobCommonUtils.isMultiClick(nativeAd)
...@@ -70,12 +71,7 @@ object AdMaxNativeUtils { ...@@ -70,12 +71,7 @@ object AdMaxNativeUtils {
//广告价格监听 //广告价格监听
nativeAdLoader.setRevenueListener { ad -> nativeAdLoader.setRevenueListener { ad ->
val adjustAdRevenue = AdjustAdRevenue(AdjustConfig.AD_REVENUE_APPLOVIN_MAX)
adjustAdRevenue.setRevenue(ad.revenue, "USD")
adjustAdRevenue.setAdRevenueNetwork(ad.networkName)
adjustAdRevenue.setAdRevenueUnit(ad.adUnitId)
adjustAdRevenue.setAdRevenuePlacement(ad.placement)
Adjust.trackAdRevenue(adjustAdRevenue)
} }
...@@ -85,22 +81,35 @@ object AdMaxNativeUtils { ...@@ -85,22 +81,35 @@ object AdMaxNativeUtils {
} }
} }
private fun createNativeAdView(context: Context): MaxNativeAdView { private fun createNativeAdView(context: Context, layout: Int): MaxNativeAdView {
val binder: MaxNativeAdViewBinder = MaxNativeAdViewBinder.Builder(R.layout.layout_max_native_custom)
.setTitleTextViewId(R.id.title_text_view) // val binder: MaxNativeAdViewBinder = MaxNativeAdViewBinder.Builder(R.layout.layout_max_native_custom)
.setBodyTextViewId(R.id.body_text_view) // .setTitleTextViewId(R.id.title_text_view)
.setAdvertiserTextViewId(R.id.advertiser_text_view) // .setBodyTextViewId(R.id.body_text_view)
.setIconImageViewId(R.id.icon_image_view) // .setAdvertiserTextViewId(R.id.advertiser_text_view)
.setMediaContentViewGroupId(R.id.media_view_container) // .setIconImageViewId(R.id.icon_image_view)
.setOptionsContentViewGroupId(R.id.options_view) // .setMediaContentViewGroupId(R.id.media_view_container)
.setStarRatingContentViewGroupId(R.id.star_rating_view) // .setOptionsContentViewGroupId(R.id.options_view)
.setCallToActionButtonId(R.id.cta_button) // .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() .build()
return MaxNativeAdView(binder, context) return MaxNativeAdView(binder, context)
} }
fun showNativeAd(activity: Activity, parent: ViewGroup) { fun showNativeAd(activity: Activity, parent: ViewGroup, layout: Int ) {
setNativeAdListener() setNativeAdListener()
...@@ -119,11 +128,12 @@ object AdMaxNativeUtils { ...@@ -119,11 +128,12 @@ object AdMaxNativeUtils {
nativeAdLoader.loadAd() nativeAdLoader.loadAd()
} else { } else {
//展示广告 //展示广告
val adView = createNativeAdView(activity) val adView = createNativeAdView(activity, layout)
parent.isVisible = true parent.isVisible = true
nativeAdLoader.render(adView, nativeAd) nativeAdLoader.render(adView, nativeAd)
parent.removeAllViews()
parent.addView(adView) parent.addView(adView)
nativeAd?.let { AdMaxEvent.showAd(it, "nativeAd", activity) } nativeAd?.let { AdMaxEvent.showAd(it, "nativeAd") }
AdDisplayUtils.getInstance().incrementAdDisplayCount() AdDisplayUtils.getInstance().incrementAdDisplayCount()
} }
} }
......
package com.base.filerecoveryrecyclebin.ads.max package com.base.filerecoveryrecyclebin.ads.max
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import com.adjust.sdk.Adjust
import com.adjust.sdk.AdjustAdRevenue
import com.adjust.sdk.AdjustConfig
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.datarecovery.ads.max.AdMaxEvent
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.ads.AdmobCommonUtils import com.base.filerecoveryrecyclebin.ads.AdmobCommonUtils
import com.base.filerecoveryrecyclebin.help.ConfigHelper import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.utils.EventUtils import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx import com.base.filerecoveryrecyclebin.utils.LogEx
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.jacoco.core.internal.analysis.filter.IFilter
import org.json.JSONObject import org.json.JSONObject
import java.util.concurrent.TimeUnit
import kotlin.math.min
import kotlin.math.pow
object AdMaxOpenUtils { object AdMaxOpenUtils {
private val TAG = "AdMaxOpenUtils" private val TAG = "com.base.filerecoveryrecyclebin.ads.max.AdMaxOpenUtils"
private var appOpenAd: MaxAppOpenAd? = null private var appOpenAd: MaxAppOpenAd? = null
private var openLoadTime = Long.MAX_VALUE private var openLoadTime = Long.MAX_VALUE
private var onHidden: (() -> Unit)? = null private var onHidden: (() -> Unit)? = null
private var loadingListener: (() -> Unit)? = null private var loadingListener: (() -> Unit)? = null
private var retryAttempt = 0
private var maxRetryAttempt = 8
private fun setListener(context: Context) { private fun setListener(context: Context) {
if (appOpenAd == null) { if (appOpenAd == null) {
...@@ -41,33 +29,20 @@ object AdMaxOpenUtils { ...@@ -41,33 +29,20 @@ object AdMaxOpenUtils {
LogEx.logDebug(TAG, "onAdLoaded") LogEx.logDebug(TAG, "onAdLoaded")
openLoadTime = System.currentTimeMillis() openLoadTime = System.currentTimeMillis()
loadingListener?.invoke() loadingListener?.invoke()
AdMaxEvent.pullAd(p0, "openAd")
} }
override fun onAdLoadFailed(p0: String, p1: MaxError) { override fun onAdLoadFailed(p0: String, p1: MaxError) {
LogEx.logDebug(TAG, "onAdLoadFailed") LogEx.logDebug(TAG, "onAdLoadFailed:" + p1.message.toString())
onHidden?.invoke() onHidden?.invoke()
AdDisplayUtils.getInstance().incrementAdRequestFailCount() AdDisplayUtils.getInstance().incrementAdRequestFailCount()
// retryAttempt++ AdMaxEvent.pullAd(null, "openAd")
// val delayMillis = TimeUnit.SECONDS.toMillis(2.0.pow(min(6, retryAttempt)).toLong())
// LogEx.logDebug(TAG, "onAdLoadFailed retryAttempt=$retryAttempt delayMillis=$delayMillis")
// if (retryAttempt == 2) {
// LogEx.logDebug(TAG, "onAdLoadFailed onHidden")
// onHidden?.invoke()
// }
//
// if (retryAttempt <= maxRetryAttempt) {
// MainScope().launch {
// delay(delayMillis)
// appOpenAd?.loadAd()
// }
// } else {
// retryAttempt = 0
// }
} }
override fun onAdDisplayed(p0: MaxAd) { override fun onAdDisplayed(p0: MaxAd) {
AdDisplayUtils.getInstance().incrementAdDisplayCount() AdDisplayUtils.getInstance().incrementAdDisplayCount()
AdMaxEvent.showAd(p0, "openAd")
} }
override fun onAdHidden(p0: MaxAd) { override fun onAdHidden(p0: MaxAd) {
...@@ -78,8 +53,9 @@ object AdMaxOpenUtils { ...@@ -78,8 +53,9 @@ object AdMaxOpenUtils {
override fun onAdClicked(p0: MaxAd) { override fun onAdClicked(p0: MaxAd) {
AdDisplayUtils.getInstance().incrementAdClickCount() AdDisplayUtils.getInstance().incrementAdClickCount()
// AdMaxEvent.clickAd(appOpenAd, "openAd") // com.base.datarecovery.ads.max.AdMaxEvent.clickAd(appOpenAd, "openAd")
AdmobCommonUtils.isMultiClick(appOpenAd) AdmobCommonUtils.isMultiClick(appOpenAd)
AdMaxEvent.clickAd(p0, "openAd")
} }
...@@ -95,12 +71,7 @@ object AdMaxOpenUtils { ...@@ -95,12 +71,7 @@ object AdMaxOpenUtils {
}) })
appOpenAd?.setRevenueListener { ad -> appOpenAd?.setRevenueListener { ad ->
val adjustAdRevenue = AdjustAdRevenue(AdjustConfig.AD_REVENUE_APPLOVIN_MAX)
adjustAdRevenue.setRevenue(ad.revenue, "USD")
adjustAdRevenue.setAdRevenueNetwork(ad.networkName)
adjustAdRevenue.setAdRevenueUnit(ad.adUnitId)
adjustAdRevenue.setAdRevenuePlacement(ad.placement)
Adjust.trackAdRevenue(adjustAdRevenue)
} }
} }
} }
...@@ -128,7 +99,7 @@ object AdMaxOpenUtils { ...@@ -128,7 +99,7 @@ object AdMaxOpenUtils {
appOpenAd?.loadAd() appOpenAd?.loadAd()
} }
if (!AdMaxInit.isAdMaxInit) { if (!AdMaxInit.isAdMaxInit.get()) {
onHidden?.invoke() onHidden?.invoke()
return return
} }
...@@ -136,10 +107,11 @@ object AdMaxOpenUtils { ...@@ -136,10 +107,11 @@ object AdMaxOpenUtils {
LogEx.logDebug(TAG, "showAppOpenAd continue") LogEx.logDebug(TAG, "showAppOpenAd continue")
this.onHidden = onHidden AdMaxOpenUtils.onHidden = onHidden
if (appOpenAd?.isReady == true) { if (appOpenAd?.isReady == true) {
LogEx.logDebug(TAG, "isReady=false") LogEx.logDebug(TAG, "isReady=false")
appOpenAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
appOpenAd?.showAd() appOpenAd?.showAd()
} else { } else {
appOpenAd?.loadAd() appOpenAd?.loadAd()
...@@ -156,9 +128,18 @@ object AdMaxOpenUtils { ...@@ -156,9 +128,18 @@ object AdMaxOpenUtils {
} }
fun loadAppOpenAd(activity: Activity) { fun loadAppOpenAd(activity: Activity) {
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
LogEx.logDebug(TAG, "!shouldShowAd")
return
}
setListener(activity) setListener(activity)
if (AdMaxInit.isAdMaxInit) {
LogEx.logDebug(TAG, "loadAppOpenAd1")
if (AdMaxInit.isAdMaxInit.get()) {
LogEx.logDebug(TAG, "loadAppOpenAd2")
appOpenAd?.loadAd() appOpenAd?.loadAd()
} else {
LogEx.logDebug(TAG, "loadAppOpenAd3")
} }
} }
......
<com.google.android.gms.ads.nativead.NativeAdView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/bg_ad_border"
android:baselineAligned="false"
android:orientation="vertical"
android:padding="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/ad_app_icon"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_gravity="center_vertical"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="#FF923E"
android:padding="2dp"
android:text="Ad"
android:textColor="@color/white"
android:textSize="12sp"
tools:ignore="HardcodedText" />
<TextView
android:layout_marginStart="8dp"
android:id="@+id/ad_headline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:id="@+id/ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<com.google.android.gms.ads.nativead.MediaView
android:id="@+id/ad_media"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center_vertical"
android:layout_marginVertical="10dp" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/ad_call_to_action"
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_gravity="center_vertical"
android:background="@drawable/bg_ad_button"
android:gravity="center"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="15sp"
tools:text="Install" />
</LinearLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
\ No newline at end of file
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#D9D9D9"
android:baselineAligned="false"
android:minHeight="40dp"
android:orientation="horizontal"
android:paddingHorizontal="5dp"
android:paddingVertical="2dp"
tools:ignore="UselessParent">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical">
<FrameLayout
android:id="@+id/ad_media"
android:layout_width="80dp"
android:layout_height="60dp"
android:layout_gravity="center" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:background="@color/black"
android:padding="2dp"
android:text="Ad"
android:textColor="@color/white"
android:textSize="8sp"
tools:ignore="HardcodedText,SmallSp" />
</FrameLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="5dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/ad_headline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/ad_body"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="14sp"
tools:ignore="SmallSp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="vertical">
<ImageView
android:id="@+id/ad_app_icon"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center_horizontal"
tools:ignore="ContentDescription" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/ad_call_to_action"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="8dp"
android:layout_marginVertical="5dp"
android:background="@drawable/bg_355bea_10"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#f8f8f8"
android:baselineAligned="false"
android:minHeight="40dp"
android:orientation="horizontal"
android:paddingHorizontal="5dp"
android:paddingVertical="2dp"
tools:ignore="UselessParent">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical">
<FrameLayout
android:id="@+id/ad_media"
android:layout_width="80dp"
android:layout_height="60dp"
android:layout_gravity="center" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:background="@color/black"
android:padding="2dp"
android:text="Ad"
android:textColor="@color/white"
android:textSize="8sp"
tools:ignore="HardcodedText,SmallSp" />
</FrameLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="5dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/ad_headline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/ad_body"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="14sp"
tools:ignore="SmallSp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="vertical">
<ImageView
android:id="@+id/ad_app_icon"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center_horizontal"
tools:ignore="ContentDescription" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/ad_call_to_action"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="8dp"
android:layout_marginVertical="5dp"
android:background="@drawable/bg_355bea_10"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
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