Commit ca7d2ae8 authored by wanglei's avatar wanglei

...ad

parent 0e02fbb7
...@@ -129,6 +129,7 @@ dependencies { ...@@ -129,6 +129,7 @@ dependencies {
//firebase //firebase
implementation(platform("com.google.firebase:firebase-bom:32.3.1")) implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
implementation("com.google.firebase:firebase-analytics") implementation("com.google.firebase:firebase-analytics")
implementation("com.google.firebase:firebase-analytics-ktx")
implementation("com.google.firebase:firebase-crashlytics") implementation("com.google.firebase:firebase-crashlytics")
//机器学习二维码扫描 //机器学习二维码扫描
......
...@@ -52,14 +52,14 @@ class MyApplication : Application() { ...@@ -52,14 +52,14 @@ class MyApplication : Application() {
// LogEx.logDebug(TAG, "flag=$flag" + " activity:" + activity.localClassName) // LogEx.logDebug(TAG, "flag=$flag" + " activity:" + activity.localClassName)
// //
// if (flag && !isInterOpenShowing) { // if (flag && !isInterOpenShowing) {
// if (AdmobMaxHelper.isOpenAdLoaded()) { // if (com.base.browserwhite.ads.AdmobMaxHelper.isOpenAdLoaded()) {
// var loaded: Boolean = true // var loaded: Boolean = true
// AdmobMaxHelper.admobMaxShowOpenAd(activity, { // com.base.browserwhite.ads.AdmobMaxHelper.admobMaxShowOpenAd(activity, {
// loaded = it // loaded = it
// }, { // }, {
// val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt() // val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt()
// if (sp == 1 && !loaded) { // if (sp == 1 && !loaded) {
// AdmobMaxHelper.admobMaxShowInterstitialAd(activity) // com.base.browserwhite.ads.AdmobMaxHelper.admobMaxShowInterstitialAd(activity)
// } // }
// }) // })
// } else { // } else {
......
package com.base.browserwhite.ads
import android.app.Activity
import android.util.Log
import android.view.ViewGroup
import com.base.browserwhite.MyApplication
import com.base.browserwhite.R
import com.base.browserwhite.ads.admob.AdmobInterstitialUtils
import com.base.browserwhite.ads.admob.AdmobNativeUtils
import com.base.browserwhite.ads.admob.AdmobOpenUtils
import com.base.browserwhite.ads.max.AdMaxInit
import com.base.browserwhite.ads.max.AdMaxInit.initAdMax
import com.base.browserwhite.ads.max.AdMaxInterstitialUtils
import com.base.browserwhite.ads.max.AdMaxNativeUtils
import com.base.browserwhite.ads.max.AdMaxOpenUtils
import com.base.browserwhite.help.EventUtils
import com.base.browserwhite.utils.AppPreferences
import com.base.browserwhite.utils.LogEx
import com.google.android.gms.ads.MobileAds
import java.util.concurrent.atomic.AtomicBoolean
object AdmobMaxHelper {
private val TAG = "AdmobMaxHelper"
var isAdInit = AtomicBoolean(false)
var isBlack: Boolean = false
var isInterOpenShowing: Boolean = false
private fun getSpAdmobTrueMaxFalse(): Boolean {
val ss = AppPreferences.getInstance().getString("admobTrueMaxFalse", "1").toInt()
return ss == 1
}
fun showBackInterAdSp(): Boolean {
val isShowBackIntAd = AppPreferences.getInstance().getString("isShowBackIntAd", "0").toInt()
//1要看插屏 0不看
return isShowBackIntAd == 1
}
fun showDeleteAdSp(): Boolean {
val isDeleteInterAd = AppPreferences.getInstance().getString("isDeleteInterAd", "0").toInt()
//1要看插屏 0不看
return isDeleteInterAd == 1
}
fun initAdmobMaxAd() {
if (isBlack) {
return
}
if (getSpAdmobTrueMaxFalse()) {
if (!isAdInit.get()) {
LogEx.logDebug(TAG, "init sp Admob")
MobileAds.initialize(MyApplication.context) { initializationStatus ->
isAdInit.set(true)
EventUtils.event("AdmobInit", "AdmobInit")
}
}
} else {
if (!isAdInit.get()) {
LogEx.logDebug(TAG, "init sp AdMax")
MyApplication.context.initAdMax()
}
}
}
//展示广告关闭时赋值
var lastShowedOnHiddenTime = 0L
fun admobMaxShowInterstitialAd(activity: Activity, isLoading: Boolean = true, onHidden: (() -> Unit)? = null) {
if (isBlack) {
EventUtils.event("ad_black", "interAd")
onHidden?.invoke()
return
}
val isShowLoadingAd = AppPreferences.getInstance().getString("isShowLoadingAd", "0").toInt()
if (isShowLoadingAd == 0 && isLoading) {
EventUtils.event("ad_switch_close")
onHidden?.invoke()
return
}
val adInterval = AppPreferences.getInstance().getString("adInterval", "0").toInt()
if ((System.currentTimeMillis() - lastShowedOnHiddenTime) < adInterval * 1000 && lastShowedOnHiddenTime != 0L) {
onHidden?.invoke()
EventUtils.event("ad_interval")
return
}
if (getSpAdmobTrueMaxFalse()) {
AdmobInterstitialUtils.showInterstitialAd(activity) {
onHidden?.invoke()
}
} else {
AdMaxInterstitialUtils.showInterstitialAd(activity) {
onHidden?.invoke()
}
}
}
fun admobMaxShowOpenAd(
activity: Activity, showBeforeAction: (flag: Boolean) -> Unit,
onHidden: (() -> Unit)? = null,
) {
if (isBlack) {
EventUtils.event("ad_black", "openAd")
onHidden?.invoke()
return
}
if (getSpAdmobTrueMaxFalse()) {
AdmobOpenUtils.showAppOpenAd(activity, showBefore = showBeforeAction) {
onHidden?.invoke()
}
} else {
AdMaxOpenUtils.showAppOpenAd(activity, loadCallBack = showBeforeAction) {
onHidden?.invoke()
}
}
}
fun admobMaxShowNativeAd(activity: Activity, parent: ViewGroup, where: Int = 0) {
if (isBlack) {
return
}
if (getSpAdmobTrueMaxFalse()) {
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
// }
// if (where == 2) {
// layout = R.layout.layout_max_native_big_2
// }
AdMaxNativeUtils.showNativeAd(activity, parent, layout)
}
}
fun preloadAd(activity: Activity) {
if (isBlack) {
return
}
if (getSpAdmobTrueMaxFalse()) {
// com.base.browserwhite.ads.admob.AdmobOpenUtils.loadAppOpenAd()
AdmobInterstitialUtils.loadInterstitialAd(activity)
} else {
if (isAdInit.get()) {
// com.base.browserwhite.ads.max.AdMaxOpenUtils.loadAppOpenAd(activity)
AdMaxInterstitialUtils.loadInterstitialAd(activity)
} else {
AdMaxInit.maxInitAction = {
Log.d(TAG, "max init suc")
// com.base.browserwhite.ads.max.AdMaxOpenUtils.loadAppOpenAd(activity)
// com.base.browserwhite.ads.max.AdMaxInterstitialUtils.loadInterstitialAd(activity)
}
}
}
}
}
\ No newline at end of file
package com.base.browserwhite.ads
import android.app.Dialog
import android.content.Context
import android.view.Gravity
import android.view.View
class CustomDialog(context: Context, layoutId: Int? = null, view: View? = null) : Dialog(context) {
init {
layoutId?.let { setContentView(it) }
view?.let { setContentView(it) }
val window = window
window?.apply {
setGravity(Gravity.CENTER)
setBackgroundDrawableResource(android.R.color.transparent)
}
setCancelable(false)
}
}
package com.base.browserwhite.ads.admob
import android.content.Context
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import androidx.core.view.children
import com.base.browserwhite.BuildConfig
import com.base.browserwhite.help.ConfigHelper
import com.base.browserwhite.utils.AppPreferences
import com.base.browserwhite.utils.LogEx
import com.google.ads.mediation.admob.AdMobAdapter
import com.google.android.gms.ads.AdListener
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.AdSize
import com.google.android.gms.ads.AdView
import java.util.UUID
object AdmobBannerUtils {
private const val TAG = "AdmobBannerUtils"
private var adView: AdView? = null
private var listener: ViewTreeObserver.OnGlobalLayoutListener? = null
fun showCollapsibleBannerAd(context: Context, parent: ViewGroup) {
val isShowBanner = AppPreferences.getInstance().getString("isShowBanner", "0").toInt()
if (isShowBanner == 0) {
return
}
if (adView != null) {
adView?.destroy()
}
adView = AdView(context)
adView?.tag = "CollapsibleBannerAd"
// parent.removeAllViews()
val list = parent.children
list.forEach {
if (it.tag != "zhanweitu") {
parent.removeView(it)
}
}
parent.addView(adView)
listener = ViewTreeObserver.OnGlobalLayoutListener {
val screenPixelDensity = context.resources.displayMetrics.density
val adWidth = (parent.width / screenPixelDensity).toInt()
val adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, adWidth)
adView?.adUnitId = if (BuildConfig.DEBUG) ConfigHelper.bannerAdmobIdTest else ConfigHelper.bannerAdmobId
adView?.setAdSize(adSize)
loadCollapsibleBanner(parent)
parent.viewTreeObserver.removeOnGlobalLayoutListener(listener)
}
parent.viewTreeObserver.addOnGlobalLayoutListener(listener)
}
private fun loadCollapsibleBanner(parent: ViewGroup) {
val extras = Bundle()
extras.putString("collapsible", "bottom")
extras.putString("collapsible_request_id", UUID.randomUUID().toString())
val adRequest =
AdRequest.Builder().addNetworkExtrasBundle(AdMobAdapter::class.java, extras).build()
adView?.adListener =
object : AdListener() {
override fun onAdLoaded() {
LogEx.logDebug(TAG, "onAdLoaded")
}
override fun onAdOpened() {
LogEx.logDebug(TAG, "onAdOpened")
}
override fun onAdClosed() {
super.onAdClosed()
LogEx.logDebug(TAG, "onAdClosed")
val removeList = arrayListOf<View>()
parent.children.forEach {
if (it.tag != "CollapsibleBannerAd") {
removeList.add(it)
}
}
removeList.forEach {
parent.removeView(it)
}
}
}
adView?.loadAd(adRequest)
}
}
\ No newline at end of file
package com.base.browserwhite.ads.admob
import android.app.Activity
import android.app.Dialog
import android.widget.Toast
import com.base.browserwhite.BuildConfig
import com.base.browserwhite.MyApplication
import com.base.browserwhite.R
import com.base.browserwhite.ads.AdDisplayUtils
import com.base.browserwhite.ads.AdmobMaxHelper.lastShowedOnHiddenTime
import com.base.browserwhite.ads.CustomDialog
import com.base.browserwhite.ads.admob.AdmobEvent.clickAd
import com.base.browserwhite.ads.admob.AdmobEvent.pullAd
import com.base.browserwhite.ads.admob.AdmobEvent.showAd
import com.base.browserwhite.help.ConfigHelper
import com.base.browserwhite.help.EventUtils
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 org.json.JSONObject
import java.util.UUID
object AdmobInterstitialUtils {
private var interAd: InterstitialAd? = null
private var interLoadTime = Long.MAX_VALUE
private var adLastDisplayTime: Long = 0
private val mRequest = AdRequest.Builder().build()
private fun isAdExpired(): Boolean {
return System.currentTimeMillis() - interLoadTime > 1000 * 60 * 60
}
fun showInterstitialAd(
activity: Activity,
isReLoadAd: Boolean = false,
isShowDialog: Boolean = true,
onHidden: (() -> Unit)? = null
) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
val obj1 = JSONObject()
obj1.put("ad_unit", "interAd")
EventUtils.event("ad_prepare_show", ext = obj1)
if (isAdExpired()) {
val obj2 = JSONObject()
obj2.put("ad_unit", "interAd")
EventUtils.event("ad_expire", ext = obj2)
interAd = null
loadInterstitialAd(activity)
onHidden?.invoke()
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
onHidden?.invoke()
return
}
if (interAd != null) {
displayInterstitialAd(activity, onHidden)
} else {
showAdDialogAndLoadInterstitial(activity, isReLoadAd, isShowDialog, onHidden)
}
}
fun loadInterstitialAd(activity: Activity, onLoad: (() -> Unit)? = null) {
if (interAd != null) {
onLoad?.invoke()
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("")) {
onLoad?.invoke()
return
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "interAd")
obj.put("from", activity.javaClass.simpleName)
EventUtils.event("ad_pull_start", ext = obj)
InterstitialAd.load(
activity,
if (BuildConfig.DEBUG) ConfigHelper.interAdmobIdTest else ConfigHelper.interAdmobId,
mRequest,
object : InterstitialAdLoadCallback() {
override fun onAdFailedToLoad(p0: LoadAdError) {
interAd = null
onLoad?.invoke()
pullAd(p0.responseInfo, "interAd", p0.message, reqId = reqId)
if (BuildConfig.DEBUG) {
Toast.makeText(
MyApplication.context, "拉取失败" + p0.message, Toast.LENGTH_SHORT
).show()
}
}
override fun onAdLoaded(ad: InterstitialAd) {
interAd = ad
onLoad?.invoke()
interLoadTime = System.currentTimeMillis()
pullAd(ad.responseInfo, "interAd", reqId = reqId)
ad.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(ad)
}
})
}
private fun showAdDialogAndLoadInterstitial(
activity: Activity,
isReLoadAd: Boolean,
isShowDialog: Boolean,
onHidden: (() -> Unit)?
) {
if (!isShowDialog) {
onHidden?.invoke()
return
}
var mDialog: Dialog? = null
if (!activity.isFinishing && !activity.isDestroyed) {
mDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
// 设置对话框的样式和内容
mDialog.show()
}
loadInterstitialAd(activity) {
mDialog?.dismiss()
if (!isReLoadAd) {
showInterstitialAd(activity, true, false) {
onHidden?.invoke()
}
}
}
if (isReLoadAd) {
mDialog?.dismiss()
onHidden?.invoke()
}
}
private fun displayInterstitialAd(activity: Activity, onHidden: (() -> Unit)? = null) {
val thisInterAd = interAd
interAd = null
thisInterAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
clickAd(thisInterAd?.responseInfo, "interAd")
AdDisplayUtils.getInstance().incrementAdClickCount()
}
override fun onAdDismissedFullScreenContent() {
interAd = null
onHidden?.invoke()
loadInterstitialAd(activity)
lastShowedOnHiddenTime = System.currentTimeMillis()
}
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
interAd = null
onHidden?.invoke()
loadInterstitialAd(activity)
}
override fun onAdShowedFullScreenContent() {
showAd(thisInterAd?.responseInfo, "interAd", activity)
AdDisplayUtils.getInstance().incrementAdDisplayCount()
adLastDisplayTime = System.currentTimeMillis() / 1000
}
}
thisInterAd?.show(activity)
}
}
\ No newline at end of file
package com.base.browserwhite.ads.admob
import android.app.Activity
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.base.browserwhite.BuildConfig
import com.base.browserwhite.MyApplication
import com.base.browserwhite.R
import com.base.browserwhite.ads.AdDisplayUtils
import com.base.browserwhite.ads.admob.AdmobEvent.clickAd
import com.base.browserwhite.ads.admob.AdmobEvent.pullAd
import com.base.browserwhite.ads.admob.AdmobEvent.showAd
import com.base.browserwhite.help.ConfigHelper
import com.base.browserwhite.help.EventUtils
import com.base.browserwhite.utils.LogEx
import com.google.android.gms.ads.AdListener
import com.google.android.gms.ads.AdLoader
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.nativead.NativeAd
import org.json.JSONObject
import java.util.UUID
object AdmobNativeUtils {
private const val TAG = "AdmobNativeUtils"
private var nativeAd: NativeAd? = null
private var isLoading = false
private var nativeLoadTime = Long.MAX_VALUE
private var loadingListener: (() -> Unit)? = null
private val mRequest = AdRequest.Builder().build()
private fun loadNativeAd() {
if (nativeAd != null) {
return
}
if (isLoading) {
return
}
isLoading = true
if (!AdDisplayUtils.getInstance().shouldShowAd("NativeAd")) {
return
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "nativeAd")
val adLoader = AdLoader.Builder(
MyApplication.context,
if (BuildConfig.DEBUG) ConfigHelper.nativeAdmobIdTest else ConfigHelper.nativeAdmobId
).forNativeAd {
nativeLoadTime = System.currentTimeMillis()
nativeAd = it
LogEx.logDebug(TAG, "nativeAd=${nativeAd.toString()}")
isLoading = false
loadingListener?.invoke()
pullAd(it.responseInfo, "nativeAd", reqId = reqId)
it.setOnPaidEventListener(AdmobEvent.EventOnPaidEventListener(it))
}.withAdListener(object : AdListener() {
override fun onAdClicked() {
clickAd(nativeAd?.responseInfo, "nativeAd")
}
override fun onAdFailedToLoad(p0: LoadAdError) {
LogEx.logDebug(TAG, "onAdFailedToLoad=${p0.message}")
nativeAd = null
isLoading = false
pullAd(p0.responseInfo, "nativeAd", p0.message, reqId = reqId)
// Log.e("MXL", "NativeAdFailedToLoad: " + p0.message)
}
}).build()
adLoader.loadAd(mRequest)
}
fun showNativeAd(activity: Activity?, parent: ViewGroup, layout: Int = R.layout.layout_admob_native_custom) {
val obj = JSONObject()
obj.put("ad_unit", "NativeAd")
EventUtils.event("ad_prepare_show_native", ext = obj)
if (!AdDisplayUtils.getInstance().shouldShowAd("NativeAd")) {
return
}
loadingListener = {
if (System.currentTimeMillis() - nativeLoadTime <= 1000 * 60 * 60) {
nativeAd?.let {
NativeView(parent.context, layout).run {
parent.removeAllViews()
setNativeAd(it)
parent.addView(this)
parent.isVisible = true
showAd(nativeAd?.responseInfo, "nativeAd", activity)
}
}
}
nativeAd = null
loadingListener = null
loadNativeAd()
}
if (nativeAd == null) {
loadNativeAd()
val obj2 = JSONObject()
obj2.put("reason", "no_ad")
obj2.put("ad_unit", "nativeAd")
EventUtils.event("ad_show_error", ext = obj2)
} else {
loadingListener?.invoke()
}
}
}
\ No newline at end of file
package com.base.browserwhite.ads.admob
import android.app.Activity
import com.base.browserwhite.BuildConfig
import com.base.browserwhite.MyApplication
import com.base.browserwhite.ads.AdDisplayUtils
import com.base.browserwhite.ads.admob.AdmobEvent.clickAd
import com.base.browserwhite.ads.admob.AdmobEvent.pullAd
import com.base.browserwhite.ads.admob.AdmobEvent.showAd
import com.base.browserwhite.help.ConfigHelper
import com.base.browserwhite.help.EventUtils
import com.base.browserwhite.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 org.json.JSONObject
import java.util.UUID
object AdmobOpenUtils {
private const val TAG = "AdmobOpenUtils"
private val mRequest = AdRequest.Builder().build()
private var openLoadTime = Long.MAX_VALUE
private var mOpenAd: AppOpenAd? = null
fun isOpenAdLoaded() = mOpenAd != null
fun loadAppOpenAd(skip: Boolean = false, onLoad: ((where: Int) -> Unit)? = null) {
if (mOpenAd != null || skip) {
onLoad?.invoke(1)
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
onLoad?.invoke(2)
return
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "openAd")
EventUtils.event("ad_pull_start", ext = obj)
AppOpenAd.load(
MyApplication.context,
if (BuildConfig.DEBUG) ConfigHelper.openAdmobIdTest else ConfigHelper.openAdmobId,
mRequest,
object : AppOpenAd.AppOpenAdLoadCallback() {
override fun onAdLoaded(ad: AppOpenAd) {
LogEx.logDebug(TAG, "onAdLoaded")
openLoadTime = System.currentTimeMillis()
mOpenAd = ad
onLoad?.invoke(3)
pullAd(ad.responseInfo, "openAd", reqId = reqId)
ad.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(ad)
}
override fun onAdFailedToLoad(p0: LoadAdError) {
LogEx.logDebug(TAG, "LoadAdError ${p0.message}")
mOpenAd = null
onLoad?.invoke(4)
pullAd(p0.responseInfo, "openAd", p0.message, reqId = reqId)
}
})
}
fun showAppOpenAd(
activity: Activity,
isRetry: Boolean = false,
showBefore: ((flag: Boolean) -> Unit)? = null,
onHidden: ((where: Int) -> Unit)? = null
) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
onHidden?.invoke(1)
return
}
if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) {
LogEx.logDebug(TAG, "openLoadTime out time")
mOpenAd = null
loadAppOpenAd()
onHidden?.invoke(2)
val obj2 = JSONObject()
obj2.put("ad_unit", "openAd")
EventUtils.event("ad_expire", ext = obj2)
return
}
if (!isRetry) {
val obj1 = JSONObject()
obj1.put("ad_unit", "openAd")
EventUtils.event("ad_prepare_show", ext = obj1)
}
if (mOpenAd != null) {
LogEx.logDebug(TAG, "mOpenAd!=null")
val thisMOpenAd = mOpenAd
mOpenAd = null
thisMOpenAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
clickAd(thisMOpenAd?.responseInfo, "openAd")
}
override fun onAdDismissedFullScreenContent() {
mOpenAd = null
onHidden?.invoke(3)
loadAppOpenAd()
}
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
mOpenAd = null
onHidden?.invoke(4)
loadAppOpenAd()
val obj = JSONObject()
obj.put("reason", p0.message)
obj.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj)
}
override fun onAdShowedFullScreenContent() {
showBefore?.invoke(true)
showAd(thisMOpenAd?.responseInfo, "openAd", activity)
}
}
thisMOpenAd?.show(activity)
} else {
LogEx.logDebug(TAG, "mOpenAd=null")
loadAppOpenAd {
if (mOpenAd != null) {
showAppOpenAd(activity, true, showBefore, onHidden)
} else {
val obj = JSONObject()
obj.put("reason", "no_ad")
obj.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj)
onHidden?.invoke(5)
}
}
}
}
}
\ No newline at end of file
package com.base.browserwhite.ads.admob
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import com.base.browserwhite.R
import com.google.android.gms.ads.nativead.NativeAd
import com.google.android.gms.ads.nativead.NativeAdView
@SuppressLint("ViewConstructor")
class NativeView(context: Context, val layout: Int, attrs: AttributeSet? = null) : FrameLayout(context, attrs) {
init {
layoutParams = LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
fun setNativeAd(nativeAd: NativeAd?) {
nativeAd ?: return
val adView = LayoutInflater.from(context)
.inflate(layout, this, false) 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 = View.INVISIBLE
} else {
adView.bodyView!!.visibility = View.VISIBLE
(adView.bodyView as TextView?)?.text = nativeAd.body
}
if (nativeAd.callToAction == null) {
adView.callToActionView!!.visibility = View.INVISIBLE
} else {
adView.callToActionView!!.visibility = View.VISIBLE
(adView.callToActionView as Button?)?.text = nativeAd.callToAction
}
if (nativeAd.icon == null) {
adView.iconView!!.visibility = View.GONE
} else {
(adView.iconView as ImageView?)?.setImageDrawable(
nativeAd.icon!!.drawable
)
adView.iconView!!.visibility = View.VISIBLE
}
adView.setNativeAd(nativeAd)
removeAllViews()
addView(adView)
}
}
\ No newline at end of file
package com.base.browserwhite.ads.max
import android.os.Bundle
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdRevenueListener
import com.applovin.sdk.AppLovinSdk
import com.base.browserwhite.MyApplication
import com.base.browserwhite.help.EventUtils
import com.base.browserwhite.utils.LogEx
import com.facebook.FacebookSdk
import com.facebook.appevents.AppEventsConstants
import com.facebook.appevents.AppEventsLogger
import com.google.firebase.analytics.FirebaseAnalytics
import org.json.JSONObject
object AdMaxEvent {
fun pullAd(ad: MaxAd?, adUnit: String, error: String? = null, reqId: String? = null, code: Int? = null) {
val obj = JSONObject()
obj.put("UnitId", ad?.adUnitId)
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 obj = JSONObject()
obj.put("UnitId", ad?.adUnitId)
obj.put("ad_unit", adUnit)
obj.put(
"creativeId",
ad?.creativeId
)
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 (!adUnit.equals("nativeAd")) {
EventUtils.event("ad_click", ext = obj)
} else {
EventUtils.event("big_imgad_click", ext = obj)
}
}
fun showAd(ad: MaxAd?, adUnit: String, activity: String?) {
val obj = JSONObject()
obj.put("UnitId", ad?.adUnitId)
obj.put("ad_unit", adUnit)
obj.put(
"creativeId",
ad?.creativeId
)
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)
obj.put("from", activity)
obj.put("mediation", "applovin")
LogEx.logDebug("glc", "from: $activity")
if (adUnit != "nativeAd") {
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(MyApplication.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)//重新清零,开始计算
val logger = AppEventsLogger.newLogger(MyApplication.context)
val parameters = Bundle()
parameters.putString(AppEventsConstants.EVENT_PARAM_CURRENCY, "USD")
logger.logEvent("ad_value", currentTaichiTroasCache, parameters)
} else {
taichiSharedPreferencesEditor.putFloat(
"TaichiTroasCache",
currentTaichiTroasCache.toFloat()
)
taichiSharedPreferencesEditor.commit()
}
val obj = JSONObject()
val revenue = ad.revenue
val countryCode =
AppLovinSdk.getInstance(MyApplication.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.browserwhite.ads.max
import android.content.Context
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkInitializationConfiguration
import com.base.browserwhite.ads.AdmobMaxHelper.isAdInit
import com.base.browserwhite.help.EventUtils
import com.base.browserwhite.utils.LogEx
import java.util.concurrent.Executors
object AdMaxInit {
private const val TAG = "AdMaxInit"
var maxInitAction: (() -> Unit)? = null
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
// val YOUR_SDK_KEY = "05TMDQ5tZabpXQ45_UTbmEGNUtVAzSTzT6KmWQc5_CuWdzccS4DCITZoL3yIWUG3bbq60QC_d4WF28tUC4gVTF"
val YOUR_SDK_KEY = "GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
val executor = Executors.newSingleThreadExecutor();
executor.execute {
val initConfigBuilder = AppLovinSdkInitializationConfiguration.builder(YOUR_SDK_KEY, this)
initConfigBuilder.mediationProvider = AppLovinMediationProvider.MAX
// Enable test mode by default for the current device. Cannot be run on the main thread.
// val currentGaid = AdvertisingIdClient.getAdvertisingIdInfo(this).id
// if (currentGaid != null) {
// initConfigBuilder.testDeviceAdvertisingIds = Collections.singletonList(currentGaid)
// }
// Initialize the AppLovin SDK
val sdk = AppLovinSdk.getInstance(this)
sdk.initialize(initConfigBuilder.build()) {
LogEx.logDebug(TAG, "max init")
isAdInit.set(true)
maxInitAction?.invoke()
maxInitAction = null
EventUtils.event("MaxInit", "MaxInit")
}
executor.shutdown()
}
}
}
\ No newline at end of file
package com.base.browserwhite.ads.max
import android.app.Activity
import android.app.Dialog
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxInterstitialAd
import com.base.browserwhite.R
import com.base.browserwhite.ads.AdDisplayUtils
import com.base.browserwhite.ads.AdmobMaxHelper.isInterOpenShowing
import com.base.browserwhite.ads.AdmobMaxHelper.lastShowedOnHiddenTime
import com.base.browserwhite.ads.CustomDialog
import com.base.browserwhite.help.ConfigHelper
import com.base.browserwhite.help.EventUtils
import com.base.browserwhite.utils.LogEx
import org.json.JSONObject
import java.util.UUID
object AdMaxInterstitialUtils {
private const val TAG = "AdMaxInterstitialUtils"
private var interstitialAd: MaxInterstitialAd? = null
private var interLoadTime = Long.MAX_VALUE
private var onHidden: (() -> Unit)? = null
private var loadingListener: (() -> Unit)? = null
private var activityString: String = ""
private fun setListener(activity: Activity) {
activityString = activity::class.java.toString().split(".").last()
if (interstitialAd == null) {
interstitialAd = MaxInterstitialAd(ConfigHelper.interAdMaxId, activity)
interstitialAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdLoaded")
loadingListener?.invoke()
loadingListener = null
interLoadTime = System.currentTimeMillis()
val reqId = UUID.randomUUID().toString()
AdMaxEvent.pullAd(p0, "interAd", reqId = reqId)
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
LogEx.logDebug(TAG, "onAdLoadFailed")
val reqId = UUID.randomUUID().toString()
AdMaxEvent.pullAd(null, "interAd", reqId = reqId, error = p1.message, code = p1.code)
AdDisplayUtils.getInstance().incrementAdRequestFailCount()
loadingListener?.invoke()
loadingListener = null
}
override fun onAdDisplayed(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdDisplayed")
AdDisplayUtils.getInstance().incrementAdDisplayCount()
AdMaxEvent.showAd(p0, "interAd", activityString)
isInterOpenShowing = true
}
override fun onAdHidden(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdHidden")
onHidden?.invoke()
onHidden = null
AdMaxOpenUtils.loadAppOpenAd(activity)
// loadInterstitialAd(activity)
isInterOpenShowing = false
lastShowedOnHiddenTime = System.currentTimeMillis()
}
override fun onAdClicked(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdClicked activity=$activityString")
AdDisplayUtils.getInstance().incrementAdClickCount()
AdMaxEvent.clickAd(p0, "interAd")
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
LogEx.logDebug(TAG, "onAdDisplayFailed")
onHidden?.invoke()
onHidden = null
val obj2 = JSONObject()
obj2.put("code", p1.code)
obj2.put("reason", p1.message)
obj2.put("ad_unit", "interAd")
EventUtils.event("ad_show_error", ext = obj2)
isInterOpenShowing = false
}
})
interstitialAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
}
}
fun showInterstitialAd(activity: Activity, onHidden: (() -> Unit)? = null) {
setListener(activity)
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (isAdExpired()) {
val obj2 = JSONObject()
obj2.put("ad_unit", "interAd")
EventUtils.event("ad_expire", ext = obj2)
onHidden?.invoke()
loadInterstitialAd(activity)
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
onHidden?.invoke()
return
}
LogEx.logDebug(TAG, "showInterstitialAd,展示插屏广告")
val obj1 = JSONObject()
obj1.put("ad_unit", "interAd")
EventUtils.event("ad_prepare_show", ext = obj1)
isInterOpenShowing = false
if (interstitialAd?.isReady == true) {
LogEx.logDebug(TAG, "有缓存直接播放。")
AdMaxInterstitialUtils.onHidden = onHidden
interstitialAd?.showAd(activity)
} else {
LogEx.logDebug(TAG, "展示广告时,没有缓存,需要拉取。")
val obj2 = JSONObject()
obj2.put("reason", "no cache ad")
obj2.put("ad_unit", "interAd")
EventUtils.event("ad_nocache_pull", ext = obj2)
val loaded = loadInterstitialAd(activity)
if (loaded) {
LogEx.logDebug(TAG, "loaded=true")
val dialog = showAdDialogAndLoadInterstitial(activity)
loadingListener = {
dialog?.dismiss()
if (interstitialAd?.isReady == true) {
AdMaxInterstitialUtils.onHidden = onHidden
interstitialAd?.showAd(activity)
} else {
onHidden?.invoke()
}
}
} else {
LogEx.logDebug(TAG, "loaded=false")
onHidden?.invoke()
}
}
}
private fun isAdExpired(): Boolean {
return System.currentTimeMillis() - interLoadTime > 1000 * 60 * 60
}
private fun showAdDialogAndLoadInterstitial(
activity: Activity,
): Dialog? {
var customDialog: Dialog? = null
if (!activity.isFinishing && !activity.isDestroyed) {
customDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
// 设置对话框的样式和内容
customDialog.show()
}
return customDialog
}
fun loadInterstitialAd(activity: Activity): Boolean {
setListener(activity)
if (!AdDisplayUtils.getInstance().shouldShowAd("interAd")) {
return false
}
LogEx.logDebug(TAG, "loadInterstitialAd")
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?.loadAd()
AdDisplayUtils.getInstance().incrementAdRequestCount()
return true
}
}
\ No newline at end of file
package com.base.browserwhite.ads.max
import android.app.Activity
import android.content.Context
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxError
import com.applovin.mediation.nativeAds.MaxNativeAdListener
import com.applovin.mediation.nativeAds.MaxNativeAdLoader
import com.applovin.mediation.nativeAds.MaxNativeAdView
import com.applovin.mediation.nativeAds.MaxNativeAdViewBinder
import com.base.browserwhite.MyApplication
import com.base.browserwhite.R
import com.base.browserwhite.ads.AdDisplayUtils
import com.base.browserwhite.help.ConfigHelper
import com.base.browserwhite.help.EventUtils
import com.base.browserwhite.utils.LogEx
import org.json.JSONObject
object AdMaxNativeUtils {
private val TAG = "AdMaxNativeUtils"
private var nativeAdLoader: MaxNativeAdLoader = MaxNativeAdLoader(ConfigHelper.nativeAdMaxId, MyApplication.context)
private var nativeAd: MaxAd? = null
private var nativeLoadTime = Long.MAX_VALUE
private var haveSetAdListener: Boolean = false
private var loadingListener: (() -> Unit)? = null
private var activityString: String = ""
private fun setNativeAdListener() {
if (!haveSetAdListener) {
//加载展示监听
nativeAdLoader.setNativeAdListener(object : MaxNativeAdListener() {
override fun onNativeAdLoaded(nativeAdView: MaxNativeAdView?, ad: MaxAd) {
LogEx.logDebug(TAG, "onNativeAdLoaded")
// Cleanup any pre-existing native ad to prevent memory leaks.
if (nativeAd?.nativeAd?.isExpired == true) {
nativeAdLoader.destroy(nativeAd)
}
// Save ad to be rendered later.
nativeAd = ad
nativeLoadTime = System.currentTimeMillis()
loadingListener?.invoke()
loadingListener = null
}
override fun onNativeAdLoadFailed(p0: String, p1: MaxError) {
super.onNativeAdLoadFailed(p0, p1)
loadingListener?.invoke()
loadingListener = null
LogEx.logDebug(TAG, "onNativeAdLoadFailed")
LogEx.logDebug(TAG, "code=${p1.code}")
LogEx.logDebug(TAG, "message=${p1.message}")
// AdDisplayUtils.getInstance().incrementAdRequestFailCount()
val obj2 = JSONObject()
obj2.put("reason", "no_ad")
obj2.put("ad_unit", "nativeAd")
EventUtils.event("ad_show_error", ext = obj2)
}
override fun onNativeAdClicked(p0: MaxAd) {
super.onNativeAdClicked(p0)
LogEx.logDebug(TAG, "onNativeAdClicked")
// AdDisplayUtils.getInstance().incrementAdClickCount()
nativeAd?.let { AdMaxEvent.clickAd(it, "nativeAd") }
}
override fun onNativeAdExpired(p0: MaxAd) {
super.onNativeAdExpired(p0)
}
})
//广告价格监听
nativeAdLoader.setRevenueListener { ad ->
}
haveSetAdListener = true
}
}
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)
// .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()
return MaxNativeAdView(binder, context)
}
fun loadNativeAd() {
setNativeAdListener()
if (!AdDisplayUtils.getInstance().shouldShowAd("nativeAd")) {
return
}
nativeAdLoader.loadAd()
}
fun showNativeAd(activity: Activity, parent: ViewGroup, layout: Int) {
activityString = activity::class.java.toString().split(".").last()
LogEx.logDebug(TAG, "activityString=$activityString")
setNativeAdListener()
if (!AdDisplayUtils.getInstance().shouldShowAd("nativeAd")) {
LogEx.logDebug(TAG, "!shouldShowAd")
return
}
if (nativeAd?.nativeAd?.isExpired == true || nativeAd == null) {
LogEx.logDebug(TAG, "nativeAd?.nativeAd?.isExpired == true")
nativeAdLoader.destroy(nativeAd)
nativeAdLoader.loadAd()
loadingListener = {
if (nativeAd != null) {
showReadyNative(activity, parent, layout)
}
}
} else {
showReadyNative(activity, parent, layout)
}
}
private fun showReadyNative(activity: Activity, parent: ViewGroup, layout: Int) {
val adView = createNativeAdView(activity, layout)
LogEx.logDebug(TAG, "showReadNative adUnitId=${nativeAd?.adUnitId}")
parent.isVisible = true
parent.removeAllViews()
nativeAdLoader.render(adView, nativeAd)
parent.addView(adView)
nativeAd?.let { AdMaxEvent.showAd(it, "nativeAd", activityString) }
LogEx.logDebug(TAG, "loadingListener finish")
}
}
\ No newline at end of file
package com.base.browserwhite.ads.max
import android.app.Activity
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAppOpenAd
import com.base.browserwhite.ads.AdDisplayUtils
import com.base.browserwhite.ads.AdmobMaxHelper.isInterOpenShowing
import com.base.browserwhite.help.ConfigHelper
import com.base.browserwhite.help.EventUtils
import com.base.browserwhite.utils.LogEx
import org.json.JSONObject
import java.util.UUID
object AdMaxOpenUtils {
private const val TAG = "AdMaxOpenUtils"
private var appOpenAd: MaxAppOpenAd? = null
private var openLoadTime = Long.MAX_VALUE
private var onHidden: (() -> Unit)? = null
private var loadingListener: ((flag: Boolean) -> Unit)? = null
private var activityString = ""
private fun setListener(activity: Activity) {
activityString = activity::class.java.toString().split(".").last()
if (appOpenAd == null) {
appOpenAd = MaxAppOpenAd(ConfigHelper.openAdMaxId, activity)
appOpenAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) {
LogEx.logDebug(TAG, "广告拉取成功")
openLoadTime = System.currentTimeMillis()
loadingListener?.invoke(true)
loadingListener = null
AdMaxEvent.pullAd(p0, "openAd")
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p0)
LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p1.message.toString())
LogEx.logDebug(TAG, "广告拉取失败了,onAdLoadFailed:" + p1.code)
loadingListener?.invoke(false)
loadingListener = null
AdDisplayUtils.getInstance().incrementAdRequestFailCount()
val reqId = UUID.randomUUID().toString()
AdMaxEvent.pullAd(null, "openAd", reqId = reqId, error = p1.message, code = p1.code)
}
override fun onAdDisplayed(p0: MaxAd) {
AdDisplayUtils.getInstance().incrementAdDisplayCount()
AdMaxEvent.showAd(p0, "openAd", activityString)
isInterOpenShowing = true
}
override fun onAdHidden(p0: MaxAd) {
LogEx.logDebug(TAG, "onAdHidden")
onHidden?.invoke()
onHidden = null
loadAppOpenAd(activity)
isInterOpenShowing = false
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
LogEx.logDebug(TAG, "onAdDisplayFailed")
onHidden?.invoke()
onHidden = null
loadAppOpenAd(activity)
val obj = JSONObject()
obj.put("code", p1.code)
obj.put("reason", p1.message)
obj.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj)
isInterOpenShowing = false
}
override fun onAdClicked(p0: MaxAd) {
AdDisplayUtils.getInstance().incrementAdClickCount()
AdMaxEvent.clickAd(p0, "openAd")
}
})
appOpenAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
}
}
fun showAppOpenAd(
activity: Activity,
loadCallBack: ((loaded: Boolean) -> Unit)? = null,
onHidden: (() -> Unit)? = null
) {
setListener(activity)
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
LogEx.logDebug(TAG, "!shouldShowAd")
onHidden?.invoke()
return
}
if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) {
LogEx.logDebug(TAG, "openLoadTime > ")
onHidden?.invoke()
val obj2 = JSONObject()
obj2.put("ad_unit", "openAd")
EventUtils.event("ad_expire", ext = obj2)
appOpenAd?.loadAd()
}
// if (!isAdInit.get()) {
// EventUtils.event("isAdInit", value = "showAppOpenAd isAdInit=${isAdInit.get()}")
// onHidden?.invoke()
// return
// }
LogEx.logDebug(TAG, "showAppOpenAd")
val obj1 = JSONObject()
obj1.put("ad_unit", "openAd")
EventUtils.event("ad_prepare_show", ext = obj1)
isInterOpenShowing = false
if (appOpenAd?.isReady == true) {
LogEx.logDebug(TAG, "广告准备好了,展示广告")
AdMaxOpenUtils.onHidden = onHidden
appOpenAd?.showAd()
} else {
val obj = JSONObject()
obj.put("reason", "no cache ad")
obj.put("ad_unit", "openAd")
EventUtils.event("ad_nocache_pull", ext = obj)
LogEx.logDebug(TAG, "展示时候,发现广告需要拉取")
val loaded = loadAppOpenAd(activity)
if (loaded) {
loadingListener = { loadResult ->
loadCallBack?.invoke(loadResult)
LogEx.logDebug(TAG, "loadingListener callback")
if (appOpenAd?.isReady == true) {
AdMaxOpenUtils.onHidden = onHidden
appOpenAd?.showAd()
} else {
onHidden?.invoke()
}
}
} else {
onHidden?.invoke()
}
}
}
fun loadAppOpenAd(activity: Activity): Boolean {
setListener(activity)
if (!AdDisplayUtils.getInstance().shouldShowAd("openAd")) {
LogEx.logDebug(TAG, "!shouldShowAd")
return false
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "openAd")
EventUtils.event("ad_pull_start", ext = obj)
appOpenAd?.loadAd()
AdDisplayUtils.getInstance().incrementAdRequestCount()
return true
}
}
package com.base.browserwhite.utils package com.base.browserwhite.help
object ConfigHelper { object ConfigHelper {
......
package com.base.browserwhite.utils package com.base.browserwhite.help
import android.os.Build import android.os.Build
import com.base.browserwhite.BuildConfig import com.base.browserwhite.BuildConfig
import com.base.browserwhite.help.AESHelper
import com.base.browserwhite.help.ReportUtils.doPost import com.base.browserwhite.help.ReportUtils.doPost
import com.base.browserwhite.utils.AppPreferences
import com.base.browserwhite.utils.LogEx
import org.json.JSONException import org.json.JSONException
import org.json.JSONObject import org.json.JSONObject
......
...@@ -3,7 +3,6 @@ package com.base.browserwhite.help ...@@ -3,7 +3,6 @@ package com.base.browserwhite.help
import com.base.browserwhite.BuildConfig import com.base.browserwhite.BuildConfig
import com.base.browserwhite.bean.NewsBean import com.base.browserwhite.bean.NewsBean
import com.base.browserwhite.utils.AppPreferences import com.base.browserwhite.utils.AppPreferences
import com.base.browserwhite.utils.ConfigHelper
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.JsonParser import com.google.gson.JsonParser
......
...@@ -19,7 +19,7 @@ import com.base.browserwhite.R ...@@ -19,7 +19,7 @@ import com.base.browserwhite.R
import com.base.browserwhite.bean.ConstObject import com.base.browserwhite.bean.ConstObject
import com.base.browserwhite.ui.activity.MainActivity import com.base.browserwhite.ui.activity.MainActivity
import com.base.browserwhite.ui.activity.SplashActivity import com.base.browserwhite.ui.activity.SplashActivity
import com.base.browserwhite.utils.EventUtils import com.base.browserwhite.help.EventUtils
import kotlin.random.Random import kotlin.random.Random
......
...@@ -20,7 +20,7 @@ import com.base.browserwhite.ui.activity.cleanjunk.ScanJunkActivity ...@@ -20,7 +20,7 @@ import com.base.browserwhite.ui.activity.cleanjunk.ScanJunkActivity
import com.base.browserwhite.ui.activity.news.NewsActivity import com.base.browserwhite.ui.activity.news.NewsActivity
import com.base.browserwhite.ui.activity.scanqrc.ScanQRCActivity import com.base.browserwhite.ui.activity.scanqrc.ScanQRCActivity
import com.base.browserwhite.utils.BarUtils import com.base.browserwhite.utils.BarUtils
import com.base.browserwhite.utils.ConfigHelper import com.base.browserwhite.help.ConfigHelper
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
...@@ -30,7 +30,6 @@ import kotlinx.coroutines.flow.SharedFlow ...@@ -30,7 +30,6 @@ import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.isActive import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlin.random.Random
@SuppressLint("CustomSplashScreen") @SuppressLint("CustomSplashScreen")
class SplashActivity : BaseActivity<ActivitySplashBinding>() { class SplashActivity : BaseActivity<ActivitySplashBinding>() {
...@@ -61,7 +60,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -61,7 +60,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
progressCollect() progressCollect()
if (ifAgreePrivacy) { if (ifAgreePrivacy) {
// AdmobMaxHelper.preloadAd(this) // AdmobMaxHelper.preloadAd(this)
job = startProgress() job = startProgress()
binding.llStart.visibility = View.GONE binding.llStart.visibility = View.GONE
binding.llProgress.visibility = View.VISIBLE binding.llProgress.visibility = View.VISIBLE
...@@ -154,7 +153,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -154,7 +153,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
oneClickStart = true oneClickStart = true
ifAgreePrivacy = true ifAgreePrivacy = true
// (application as MyApplication).initApp(true) // (application as MyApplication).initApp(true)
// AdmobMaxHelper.preloadAd(this) // com.base.browserwhite.ads.AdmobMaxHelper.preloadAd(this)
binding.llStart.visibility = View.GONE binding.llStart.visibility = View.GONE
binding.llProgress.visibility = View.VISIBLE binding.llProgress.visibility = View.VISIBLE
job = startProgress() job = startProgress()
...@@ -187,14 +186,14 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -187,14 +186,14 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
// LogEx.logDebug(TAG, "outTimeAd") // LogEx.logDebug(TAG, "outTimeAd")
// //
// var loaded: Boolean = true // var loaded: Boolean = true
// AdmobMaxHelper.admobMaxShowOpenAd(this, showBeforeAction = { flag -> // com.base.browserwhite.ads.AdmobMaxHelper.admobMaxShowOpenAd(this, showBeforeAction = { flag ->
// LogEx.logDebug(TAG, "showBeforeAction flag=$flag") // LogEx.logDebug(TAG, "showBeforeAction flag=$flag")
// loaded = flag // loaded = flag
// job?.cancel() // job?.cancel()
// }, onHidden = { // }, onHidden = {
// val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt() // val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt()
// if (sp == 1 && !loaded) { // if (sp == 1 && !loaded) {
// AdmobMaxHelper.admobMaxShowInterstitialAd(this, isLoading = false) { // com.base.browserwhite.ads.AdmobMaxHelper.admobMaxShowInterstitialAd(this, isLoading = false) {
// binding.pb.progress = 100 // binding.pb.progress = 100
// jumpNext() // jumpNext()
// } // }
......
...@@ -82,7 +82,7 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() { ...@@ -82,7 +82,7 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() {
// val isCleanEndAdSp = AppPreferences.getInstance().getString("isCleanEndAdSp", "0").toInt() // val isCleanEndAdSp = AppPreferences.getInstance().getString("isCleanEndAdSp", "0").toInt()
// if (isCleanEndAdSp == 1) { // if (isCleanEndAdSp == 1) {
// AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleaningActivity) { // com.base.browserwhite.ads.AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleaningActivity) {
// startActivity( // startActivity(
// Intent(this@CleaningActivity, ResultActivity::class.java).putExtra("from", JUNK_CLEANER) // Intent(this@CleaningActivity, ResultActivity::class.java).putExtra("from", JUNK_CLEANER)
// .putExtra("clean_size", intentSize) // .putExtra("clean_size", intentSize)
......
...@@ -9,7 +9,6 @@ import androidx.core.view.updatePadding ...@@ -9,7 +9,6 @@ import androidx.core.view.updatePadding
import com.base.browserwhite.bean.DownloadBean import com.base.browserwhite.bean.DownloadBean
import com.base.browserwhite.databinding.ActivityWebDownloadManagerBinding import com.base.browserwhite.databinding.ActivityWebDownloadManagerBinding
import com.base.browserwhite.ui.activity.BaseActivity import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.ui.activity.mediabrowser.MediaBrowserActivity
import com.base.browserwhite.ui.activity.mediabrowser.MediaVideoDetailActivity import com.base.browserwhite.ui.activity.mediabrowser.MediaVideoDetailActivity
import com.base.browserwhite.ui.views.DialogViews.showDeleteTipDialog import com.base.browserwhite.ui.views.DialogViews.showDeleteTipDialog
import com.base.browserwhite.ui.views.DialogViews.showGerPermission import com.base.browserwhite.ui.views.DialogViews.showGerPermission
...@@ -20,7 +19,6 @@ import com.base.browserwhite.utils.DownloadHelper.getDownloadJsonBean ...@@ -20,7 +19,6 @@ import com.base.browserwhite.utils.DownloadHelper.getDownloadJsonBean
import com.base.browserwhite.utils.DownloadHelper.saveDownloadRecordFile import com.base.browserwhite.utils.DownloadHelper.saveDownloadRecordFile
import com.base.browserwhite.utils.IntentEx.shareAction import com.base.browserwhite.utils.IntentEx.shareAction
import com.base.browserwhite.utils.KotlinExt.toFormatTime import com.base.browserwhite.utils.KotlinExt.toFormatTime
import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import com.base.browserwhite.utils.PermissionHelp.requestStorePermission import com.base.browserwhite.utils.PermissionHelp.requestStorePermission
import com.google.gson.Gson import com.google.gson.Gson
...@@ -73,11 +71,13 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin ...@@ -73,11 +71,13 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin
if (checkStorePermission()) { if (checkStorePermission()) {
initData() initData()
} else { } else {
showGerPermission(desc = "", deny = { finishToMain() }, allow = { showGerPermission(
requestStorePermission(launcher, result = { desc = "This feature requires access to your storage to manage your downloads. We will not transfer your data to any third-party services. Please grant permission so that we can provide you with better services.",
if (it) initData() else finishToMain() deny = { finishToMain() }, allow = {
requestStorePermission(launcher, result = {
if (it) initData() else finishToMain()
})
}) })
})
} }
} }
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#355BEA" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- <stroke-->
<!-- android:width="1dp"-->
<!-- android:color="#E5E5E5" />-->
<solid android:color="#F2F2F2" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF8A00" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="360">
<shape
android:innerRadiusRatio="3"
android:shape="ring"
android:thicknessRatio="7.0">
<size
android:height="48dp"
android:width="48dp" />
<gradient
android:centerColor="#355bea"
android:endColor="#355bea"
android:startColor="#355bea"
android:type="sweep"
android:useLevel="false" />
<stroke
android:width="3dp"
android:color="#FFFFFF" />
<corners android:radius="3dp"/>
</shape>
</rotate>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="90dp"
android:background="@drawable/bg_ffffff_10"
android:gravity="center"
android:orientation="horizontal">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:indeterminate="true"
android:indeterminateDrawable="@drawable/circle_progress_bar" />
<TextView
android:id="@+id/dialog_ad_loading_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="11dp"
android:layout_marginEnd="18dp"
android:text="Network fluctuation, ad is loading, please wait."
android:textColor="#ff000000"
android:textSize="14sp"
tools:ignore="HardcodedText" />
</LinearLayout>
\ No newline at end of file
...@@ -77,7 +77,7 @@ ...@@ -77,7 +77,7 @@
android:layout_height="175dp" android:layout_height="175dp"
android:layout_marginTop="20dp"> android:layout_marginTop="20dp">
<include layout="@layout/layout_native_admob_download" /> <include layout="@layout/layout_admob_native_download" />
</FrameLayout> </FrameLayout>
<TextView <TextView
......
<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:background="@drawable/bg_ad_border"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:baselineAligned="false">
<com.google.android.gms.ads.nativead.MediaView
android:id="@+id/ad_media"
android:layout_width="91dp"
android:layout_height="91dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="5dp" />
<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">
<TextView
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
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:id="@+id/ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="10dp"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="5dp">
<ImageView
android:id="@+id/ad_app_icon"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center_vertical"
tools:ignore="ContentDescription" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/ad_call_to_action"
android:layout_width="match_parent"
android:layout_height="26dp"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="12dp"
android:background="@drawable/bg_ff8a00_10"
android:gravity="center"
android:textColor="@color/white"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
</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
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