feat: 广告位管理第三方广告相关优化—客户端 https://jira.shanqu.cc/browse/GHZSCY-5596
This commit is contained in:
@ -227,18 +227,7 @@ object AdDelegateHelper {
|
||||
/**
|
||||
* 是否大于开屏广告展示间隔时长
|
||||
*/
|
||||
private fun isMatchStartUpAdDisplayRule(): Boolean {
|
||||
mSplashAd?.displayRule?.run {
|
||||
if (adDisplayInterval > 0) {
|
||||
val lastShowTime = SPUtils.getLong(Constants.SP_LAST_SPLASH_AD_SHOW_TIME, 0L)
|
||||
val durationInMinutes = (System.currentTimeMillis() - lastShowTime).toFloat() / 1000 / 60
|
||||
return durationInMinutes > adDisplayInterval
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
private fun isMatchStartUpAdDisplayRule(): Boolean = isMatchAdDisplayRule(mSplashAd, Constants.SP_LAST_SPLASH_AD_SHOW_TIME)
|
||||
|
||||
/**
|
||||
* 是否大于广告管理展示间隔时长
|
||||
@ -292,6 +281,7 @@ object AdDelegateHelper {
|
||||
adViewHeightInDp: Float,
|
||||
startAdContainer: ViewGroup,
|
||||
sdkStartAdContainer: ViewGroup,
|
||||
sdkJumpBtn: TextView,
|
||||
adsViewGroup: FrameLayout,
|
||||
handler: BaseActivity.BaseHandler,
|
||||
isHotLaunch: Boolean,
|
||||
@ -313,6 +303,7 @@ object AdDelegateHelper {
|
||||
adViewHeightInDp,
|
||||
startAdContainer,
|
||||
sdkStartAdContainer,
|
||||
sdkJumpBtn,
|
||||
adsViewGroup,
|
||||
handler,
|
||||
isHotLaunch,
|
||||
@ -330,6 +321,7 @@ object AdDelegateHelper {
|
||||
adViewHeightInDp,
|
||||
startAdContainer,
|
||||
sdkStartAdContainer,
|
||||
sdkJumpBtn,
|
||||
adsViewGroup,
|
||||
handler,
|
||||
isHotLaunch,
|
||||
@ -353,6 +345,7 @@ object AdDelegateHelper {
|
||||
adViewHeightInDp: Float,
|
||||
startAdContainer: ViewGroup,
|
||||
sdkStartAdContainer: ViewGroup,
|
||||
sdkJumpBtn: TextView,
|
||||
adsViewGroup: FrameLayout,
|
||||
handler: BaseActivity.BaseHandler,
|
||||
isHotLaunch: Boolean,
|
||||
@ -374,6 +367,7 @@ object AdDelegateHelper {
|
||||
adViewHeightInDp,
|
||||
startAdContainer,
|
||||
sdkStartAdContainer,
|
||||
sdkJumpBtn,
|
||||
adsViewGroup,
|
||||
handler,
|
||||
isHotLaunch,
|
||||
@ -403,13 +397,14 @@ object AdDelegateHelper {
|
||||
sdkStartAdContainer.visibility = View.VISIBLE
|
||||
requestCsjSplashAd(
|
||||
activity,
|
||||
thirdPartyAd.slotId,
|
||||
adViewWidthInPx,
|
||||
adViewHeightInPx,
|
||||
adViewWidthInDp,
|
||||
adViewHeightInDp,
|
||||
sdkStartAdContainer,
|
||||
sdkJumpBtn,
|
||||
timeout,
|
||||
isHotLaunch,
|
||||
sdkSplashCallback
|
||||
)
|
||||
}
|
||||
@ -420,27 +415,65 @@ object AdDelegateHelper {
|
||||
*/
|
||||
private fun requestCsjSplashAd(
|
||||
activity: Activity,
|
||||
slotId: String,
|
||||
adViewWidthInPx: Int,
|
||||
adViewHeightInPx: Int,
|
||||
adViewWidthInDp: Float,
|
||||
adViewHeightInDp: Float,
|
||||
startAdContainer: ViewGroup,
|
||||
sdkJumpBtn: TextView,
|
||||
timeout: Int,
|
||||
isHotLaunch: Boolean,
|
||||
callback: (isSuccess: Boolean) -> Unit,
|
||||
) {
|
||||
if (mCsjAdImpl == null) {
|
||||
val thirdPartyAd = if (isHotLaunch) mSplashAd?.hotStartThirdPartyAd else mSplashAd?.thirdPartyAd
|
||||
if (mCsjAdImpl == null || thirdPartyAd == null) {
|
||||
callback.invoke(false)
|
||||
} else {
|
||||
sdkJumpBtn.setOnClickListener {
|
||||
callback.invoke(true)
|
||||
if (activity is BaseActivity) {
|
||||
activity.baseHandler.removeMessages(MainActivity.COUNTDOWN_SDK_AD)
|
||||
}
|
||||
}
|
||||
|
||||
val onAdShowAction = {
|
||||
sdkJumpBtn.visibility = View.VISIBLE
|
||||
if (activity is BaseActivity) {
|
||||
activity.baseHandler.sendEmptyMessageDelayed(MainActivity.COUNTDOWN_SDK_AD, 1000)
|
||||
}
|
||||
SensorsBridge.trackEvent("ThirdPartyAdShow",
|
||||
"ad_source", thirdPartyAd.sourceName,
|
||||
"ad_id", thirdPartyAd.slotId,
|
||||
"ad_format", mSplashAd?.typeChinese ?: "",
|
||||
"ad_placement", "光环启动",
|
||||
"launch_type", if (isHotLaunch) "热启动" else "冷启动",
|
||||
"ad_space_id", mSplashAd?.id ?: "",
|
||||
"ad_space_name", mSplashAd?.name ?: ""
|
||||
)
|
||||
}
|
||||
val onAdClickAction = {
|
||||
callback.invoke(true)
|
||||
SensorsBridge.trackEvent("ThirdPartyAdClick",
|
||||
"ad_source", thirdPartyAd.sourceName,
|
||||
"ad_id", thirdPartyAd.slotId,
|
||||
"ad_format", mSplashAd?.typeChinese ?: "",
|
||||
"ad_placement", "光环启动",
|
||||
"launch_type", if (isHotLaunch) "热启动" else "冷启动",
|
||||
"ad_space_id", mSplashAd?.id ?: "",
|
||||
"ad_space_name", mSplashAd?.name ?: ""
|
||||
)
|
||||
}
|
||||
mCsjAdImpl?.requestSplashAd(
|
||||
activity,
|
||||
slotId,
|
||||
thirdPartyAd.slotId,
|
||||
adViewWidthInPx,
|
||||
adViewHeightInPx,
|
||||
adViewWidthInDp,
|
||||
adViewHeightInDp,
|
||||
startAdContainer,
|
||||
timeout,
|
||||
onAdShowAction,
|
||||
onAdClickAction,
|
||||
callback,
|
||||
)
|
||||
}
|
||||
@ -457,6 +490,7 @@ object AdDelegateHelper {
|
||||
adViewHeightInDp: Float,
|
||||
startAdContainer: ViewGroup,
|
||||
sdkStartAdContainer: ViewGroup,
|
||||
sdkJumpBtn: TextView,
|
||||
adsViewGroup: FrameLayout,
|
||||
handler: BaseActivity.BaseHandler,
|
||||
isHotLaunch: Boolean,
|
||||
@ -474,6 +508,7 @@ object AdDelegateHelper {
|
||||
adViewHeightInDp,
|
||||
startAdContainer,
|
||||
sdkStartAdContainer,
|
||||
sdkJumpBtn,
|
||||
adsViewGroup,
|
||||
handler,
|
||||
isHotLaunch,
|
||||
@ -621,9 +656,11 @@ object AdDelegateHelper {
|
||||
slotId: String,
|
||||
adContainerView: ViewGroup,
|
||||
expressViewWidth: Float,
|
||||
onAdShowAction: () -> Unit,
|
||||
onAdClickAction: () -> Unit,
|
||||
callback: (isSuccess: Boolean) -> Unit,
|
||||
) {
|
||||
mCsjAdImpl?.requestFlowAd(fragment, adContainerView, slotId, expressViewWidth, callback)
|
||||
mCsjAdImpl?.requestFlowAd(fragment, adContainerView, slotId, expressViewWidth, onAdShowAction, onAdClickAction, callback)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -634,6 +671,8 @@ object AdDelegateHelper {
|
||||
containerView: ViewGroup,
|
||||
ad: AdConfig.ThirdPartyAd,
|
||||
expressViewWidthInDp: Float,
|
||||
onAdShowAction: () -> Unit,
|
||||
onAdClickAction: () -> Unit,
|
||||
callback: (isSuccess: Boolean) -> Unit
|
||||
) {
|
||||
|
||||
@ -656,6 +695,28 @@ object AdDelegateHelper {
|
||||
slotId,
|
||||
expressViewWidthInDp,
|
||||
expressViewHeightInDp,
|
||||
onAdShowAction,
|
||||
onAdClickAction,
|
||||
callback
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取第三方 全屏/插屏 广告
|
||||
*/
|
||||
fun requestFullScreenAd(
|
||||
fragment: Fragment,
|
||||
ad: AdConfig.ThirdPartyAd,
|
||||
onAdShowAction: () -> Unit,
|
||||
onAdClickAction: () -> Unit,
|
||||
callback: (isSuccess: Boolean) -> Unit
|
||||
) {
|
||||
val slotId = ad.slotId
|
||||
mCsjAdImpl?.requestFullScreenAd(
|
||||
fragment,
|
||||
slotId,
|
||||
onAdShowAction,
|
||||
onAdClickAction,
|
||||
callback
|
||||
)
|
||||
}
|
||||
|
||||
@ -3,42 +3,105 @@ package com.gh.ad
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
|
||||
import android.view.ViewStub
|
||||
import androidx.fragment.app.Fragment
|
||||
|
||||
import com.alibaba.android.arouter.facade.annotation.Route
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
import com.gh.gamecenter.common.constant.RouteConsts
|
||||
import com.gh.gamecenter.common.provider.ILaunchAd
|
||||
import com.gh.gamecenter.common.utils.SensorsBridge
|
||||
import com.gh.gamecenter.common.utils.goneIf
|
||||
import com.gh.gamecenter.core.utils.DisplayUtils
|
||||
import com.gh.gamecenter.core.utils.SPUtils
|
||||
import com.gh.gamecenter.entity.AdConfig
|
||||
|
||||
@Route(path = RouteConsts.provider.vaAd, name = "畅玩启动页广告")
|
||||
class LaunchAdImpl : ILaunchAd {
|
||||
override fun init(context: Context?) {
|
||||
}
|
||||
|
||||
override fun requestAd(fragment: Fragment, container: ViewGroup, maskView: View) {
|
||||
override fun requestAd(fragment: Fragment, container: ViewGroup, maskView: View, topViewStub: ViewStub, bottomViewStub: ViewStub, adClickAction: () -> Unit): View {
|
||||
if (AdDelegateHelper.shouldShowHelperLaunchAd()) {
|
||||
val launchAd = AdDelegateHelper.vGameLaunchAd
|
||||
val showThirdPartyAd = launchAd?.displayRule?.adSource == AdDelegateHelper.AD_TYPE_SDK
|
||||
val thirdPartyAd = launchAd?.thirdPartyAd
|
||||
if (showThirdPartyAd && thirdPartyAd != null) {
|
||||
AdDelegateHelper.requestThirdPartyBannerAd(
|
||||
fragment,
|
||||
container,
|
||||
thirdPartyAd,
|
||||
DisplayUtils.getScreenWidthInDp(fragment.requireActivity()),
|
||||
) { isSuccess ->
|
||||
maskView.goneIf(!isSuccess)
|
||||
if (isSuccess) {
|
||||
SPUtils.setLong(Constants.SP_LAST_HELPER_LAUNCH_AD_SHOW_TIME, System.currentTimeMillis())
|
||||
}
|
||||
val onAdShowAction = {
|
||||
SensorsBridge.trackEvent("ThirdPartyAdShow",
|
||||
"ad_source", thirdPartyAd.sourceName,
|
||||
"ad_id", thirdPartyAd.slotId,
|
||||
"ad_format", launchAd.typeChinese,
|
||||
"ad_placement", AD_PLACEMENT,
|
||||
"ad_space_id", launchAd.id,
|
||||
"ad_space_name", launchAd.name
|
||||
)
|
||||
}
|
||||
val onAdClickAction = {
|
||||
SensorsBridge.trackEvent("ThirdPartyAdClick",
|
||||
"ad_source", thirdPartyAd.sourceName,
|
||||
"ad_id", thirdPartyAd.slotId,
|
||||
"ad_format", launchAd.typeChinese,
|
||||
"ad_placement", AD_PLACEMENT,
|
||||
"ad_space_id", launchAd.id,
|
||||
"ad_space_name", launchAd.name
|
||||
)
|
||||
adClickAction.invoke()
|
||||
}
|
||||
|
||||
if (launchAd.type == AdConfig.TYPE_BANNER) {
|
||||
requestBannerAd(fragment, container, maskView, thirdPartyAd, onAdShowAction, onAdClickAction)
|
||||
return topViewStub.inflate()
|
||||
} else if (launchAd.type == AdConfig.TYPE_INTERSTITIAL) {
|
||||
requestFullScreenAd(fragment, thirdPartyAd, onAdShowAction, onAdClickAction)
|
||||
return bottomViewStub.inflate()
|
||||
}
|
||||
}
|
||||
}
|
||||
return bottomViewStub.inflate()
|
||||
}
|
||||
|
||||
private fun requestBannerAd(
|
||||
fragment: Fragment,
|
||||
container: ViewGroup,
|
||||
maskView: View,
|
||||
thirdPartyAd: AdConfig.ThirdPartyAd,
|
||||
onAdShowAction: () -> Unit,
|
||||
onAdClickAction: () -> Unit,
|
||||
) {
|
||||
AdDelegateHelper.requestThirdPartyBannerAd(
|
||||
fragment,
|
||||
container,
|
||||
thirdPartyAd,
|
||||
DisplayUtils.getScreenWidthInDp(fragment.requireActivity()),
|
||||
onAdShowAction,
|
||||
onAdClickAction
|
||||
) { isSuccess ->
|
||||
maskView.goneIf(!isSuccess)
|
||||
if (isSuccess) {
|
||||
SPUtils.setLong(Constants.SP_LAST_HELPER_LAUNCH_AD_SHOW_TIME, System.currentTimeMillis())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun requestFullScreenAd(
|
||||
fragment: Fragment,
|
||||
thirdPartyAd: AdConfig.ThirdPartyAd,
|
||||
onAdShowAction: () -> Unit,
|
||||
onAdClickAction: () -> Unit
|
||||
) {
|
||||
AdDelegateHelper.requestFullScreenAd(
|
||||
fragment,
|
||||
thirdPartyAd,
|
||||
onAdShowAction,
|
||||
onAdClickAction
|
||||
) { isSuccess ->
|
||||
if (isSuccess) {
|
||||
SPUtils.setLong(Constants.SP_LAST_HELPER_LAUNCH_AD_SHOW_TIME, System.currentTimeMillis())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val AD_PLACEMENT = "畅玩启动"
|
||||
}
|
||||
}
|
||||
|
||||
@ -148,6 +148,8 @@ public class MainActivity extends BaseActivity {
|
||||
public static final String SHOW_AD = "show_ad";
|
||||
public static final int COUNTDOWN_AD = 100;
|
||||
private int mCountdownMaxCount = 3;
|
||||
public static final int COUNTDOWN_SDK_AD = 101;
|
||||
public static final int COUNTDOWN_SDK_MAX_COUNT = 5;
|
||||
private int mCountdownCount = 0;
|
||||
|
||||
private static final String CURRENT_PAGE = "current_page";
|
||||
@ -489,6 +491,7 @@ public class MainActivity extends BaseActivity {
|
||||
if (AdDelegateHelper.INSTANCE.shouldShowStartUpAd(false)) {
|
||||
ViewGroup startAdContainer = findViewById(R.id.startAdContainer);
|
||||
ViewGroup sdkStartAdContainer = findViewById(R.id.sdkStartAdContainer);
|
||||
TextView sdkJumpBtn = findViewById(R.id.sdkJumpBtn);
|
||||
FrameLayout adsFl = findViewById(R.id.adsFl);
|
||||
View icpContainer = findViewById(R.id.sdkStartAdIcpContainer);
|
||||
if (icpContainer != null) {
|
||||
@ -517,6 +520,7 @@ public class MainActivity extends BaseActivity {
|
||||
screenHeightInDp,
|
||||
startAdContainer,
|
||||
sdkStartAdContainer,
|
||||
sdkJumpBtn,
|
||||
adsFl,
|
||||
(BaseHandler) mBaseHandler,
|
||||
false,
|
||||
@ -536,13 +540,19 @@ public class MainActivity extends BaseActivity {
|
||||
@Override
|
||||
protected void handleMessage(Message msg) {
|
||||
super.handleMessage(msg);
|
||||
if (msg.what == COUNTDOWN_AD) {
|
||||
if (msg.what == COUNTDOWN_AD || msg.what == COUNTDOWN_SDK_AD) {
|
||||
mCountdownCount++;
|
||||
if (mCountdownMaxCount < mCountdownCount) {
|
||||
int maxCount;
|
||||
if (msg.what == COUNTDOWN_AD) {
|
||||
maxCount = mCountdownMaxCount;
|
||||
} else {
|
||||
maxCount = COUNTDOWN_SDK_MAX_COUNT;
|
||||
}
|
||||
if (maxCount < mCountdownCount) {
|
||||
AdDelegateHelper.INSTANCE.setShowingSplashAd(false);
|
||||
hideSplashAd();
|
||||
|
||||
if (msg.obj instanceof StartupAdEntity) {
|
||||
if (msg.what == COUNTDOWN_AD && msg.obj instanceof StartupAdEntity) {
|
||||
StartupAdEntity ad = (StartupAdEntity) msg.obj;
|
||||
LinkEntity linkEntity = ad.getJump();
|
||||
SensorsBridge.trackEvent(
|
||||
@ -555,14 +565,26 @@ public class MainActivity extends BaseActivity {
|
||||
linkEntity.getLink(),
|
||||
"link_text",
|
||||
linkEntity.getText());
|
||||
} else if (msg.what == COUNTDOWN_SDK_AD) {
|
||||
SPUtils.setLong(Constants.SP_LAST_SPLASH_AD_SHOW_TIME, System.currentTimeMillis());
|
||||
}
|
||||
} else {
|
||||
TextView jumpBtn = findViewById(R.id.jumpBtn);
|
||||
jumpBtn.setText(getString(R.string.splash_jump, mCountdownMaxCount - mCountdownCount));
|
||||
Message newMsg = Message.obtain();
|
||||
newMsg.what = COUNTDOWN_AD;
|
||||
newMsg.obj = msg.obj;
|
||||
mBaseHandler.sendMessageDelayed(newMsg, 1000);
|
||||
if (msg.what == COUNTDOWN_AD) {
|
||||
TextView jumpBtn = findViewById(R.id.jumpBtn);
|
||||
if (jumpBtn != null) {
|
||||
jumpBtn.setText(getString(R.string.splash_jump, maxCount - mCountdownCount));
|
||||
}
|
||||
Message newMsg = Message.obtain();
|
||||
newMsg.what = COUNTDOWN_AD;
|
||||
newMsg.obj = msg.obj;
|
||||
mBaseHandler.sendMessageDelayed(newMsg, 1000);
|
||||
} else {
|
||||
TextView jumpBtn = findViewById(R.id.sdkJumpBtn);
|
||||
if (jumpBtn != null) {
|
||||
jumpBtn.setText(getString(R.string.splash_jump, maxCount - mCountdownCount));
|
||||
}
|
||||
mBaseHandler.sendEmptyMessageDelayed(COUNTDOWN_SDK_AD, 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -600,7 +622,11 @@ public class MainActivity extends BaseActivity {
|
||||
ExtensionsKt.removeFromParent(startSdkAdContainer, true);
|
||||
AdDelegateHelper.INSTANCE.cancelSplashAd(this);
|
||||
}
|
||||
|
||||
TextView jumpBtn = findViewById(R.id.sdkJumpBtn);
|
||||
if (jumpBtn != null) {
|
||||
jumpBtn.setVisibility(View.GONE);
|
||||
ExtensionsKt.removeFromParent(jumpBtn, true);
|
||||
}
|
||||
View startSdkAdIcpContainer = findViewById(R.id.sdkStartAdIcpContainer);
|
||||
if (startSdkAdIcpContainer != null) {
|
||||
startSdkAdIcpContainer.setVisibility(View.GONE);
|
||||
|
||||
@ -12,8 +12,10 @@ import com.gh.ad.AdDelegateHelper
|
||||
import com.gh.ad.AdDelegateHelper.requestSplashAd
|
||||
import com.gh.ad.AdDelegateHelper.shouldShowStartUpAd
|
||||
import com.gh.gamecenter.common.base.activity.BaseActivity
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
import com.gh.gamecenter.common.utils.dip2px
|
||||
import com.gh.gamecenter.core.utils.DisplayUtils
|
||||
import com.gh.gamecenter.core.utils.SPUtils
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
@ -37,6 +39,7 @@ class SplashAdActivity : BaseActivity() {
|
||||
if (shouldShowStartUpAd(true)) {
|
||||
val startAdContainer = findViewById<ViewGroup>(R.id.startAdContainer)
|
||||
val sdkStartAdContainer = findViewById<ViewGroup>(R.id.sdkStartAdContainer)
|
||||
val sdkJumpBtn = findViewById<TextView>(R.id.sdkJumpBtn)
|
||||
val adsFl = findViewById<FrameLayout>(R.id.adsFl)
|
||||
val icpContainer = findViewById<View>(R.id.sdkStartAdIcpContainer)
|
||||
|
||||
@ -58,6 +61,7 @@ class SplashAdActivity : BaseActivity() {
|
||||
screenHeightInDp,
|
||||
startAdContainer!!,
|
||||
sdkStartAdContainer!!,
|
||||
sdkJumpBtn!!,
|
||||
adsFl!!,
|
||||
(mBaseHandler as BaseHandler),
|
||||
true
|
||||
@ -81,15 +85,23 @@ class SplashAdActivity : BaseActivity() {
|
||||
|
||||
override fun handleMessage(msg: Message) {
|
||||
super.handleMessage(msg)
|
||||
if (msg.what == MainActivity.COUNTDOWN_AD) {
|
||||
if (msg.what == MainActivity.COUNTDOWN_AD || msg.what == MainActivity.COUNTDOWN_SDK_AD) {
|
||||
mCountdownCount++
|
||||
if (COUNTDOWN_MAX_COUNT < mCountdownCount) {
|
||||
val maxCount = if (msg.what == MainActivity.COUNTDOWN_AD) {
|
||||
COUNTDOWN_MAX_COUNT
|
||||
} else {
|
||||
MainActivity.COUNTDOWN_SDK_MAX_COUNT
|
||||
}
|
||||
if (maxCount < mCountdownCount) {
|
||||
AdDelegateHelper.isShowingSplashAd = false
|
||||
if (msg.what == MainActivity.COUNTDOWN_SDK_AD) {
|
||||
SPUtils.setLong(Constants.SP_LAST_SPLASH_AD_SHOW_TIME, System.currentTimeMillis())
|
||||
}
|
||||
finishActivity()
|
||||
} else {
|
||||
val jumpBtn = findViewById<TextView>(R.id.jumpBtn)
|
||||
jumpBtn.text = getString(R.string.splash_jump, COUNTDOWN_MAX_COUNT - mCountdownCount)
|
||||
mBaseHandler.sendEmptyMessageDelayed(MainActivity.COUNTDOWN_AD, 1000)
|
||||
val jumpBtn = findViewById<TextView>(if (msg.what == MainActivity.COUNTDOWN_AD) R.id.jumpBtn else R.id.sdkJumpBtn)
|
||||
jumpBtn?.text = getString(R.string.splash_jump, maxCount - mCountdownCount)
|
||||
mBaseHandler.sendEmptyMessageDelayed(msg.what, 1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -160,7 +160,7 @@ class DownloadFragment : BaseFragment_TabLayout() {
|
||||
val ownerAd = downloadManagerAd?.ownerAd
|
||||
val showOnFailed = downloadManagerAd?.displayRule?.onFailedAction == "show"
|
||||
if ((showThirdPartyAd && thirdPartyAd != null) || (!showThirdPartyAd && thirdPartyAd != null && ownerAd == null)) {
|
||||
initThirdPartyAd(thirdPartyAd) { isSuccess ->
|
||||
initThirdPartyAd(downloadManagerAd, thirdPartyAd) { isSuccess ->
|
||||
mBinding.maskView.goneIf(!isSuccess)
|
||||
if (!isSuccess && ownerAd != null && showOnFailed) {
|
||||
mSlideInterval = ownerAd.adSource?.sliderInterval ?: -1
|
||||
@ -182,12 +182,34 @@ class DownloadFragment : BaseFragment_TabLayout() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun initThirdPartyAd(thirdPartyAd: AdConfig.ThirdPartyAd, callback: (isSuccess: Boolean) -> Unit) {
|
||||
private fun initThirdPartyAd(adConfig: AdConfig?, thirdPartyAd: AdConfig.ThirdPartyAd, callback: (isSuccess: Boolean) -> Unit) {
|
||||
val onAdShowAction = {
|
||||
SensorsBridge.trackEvent("ThirdPartyAdShow",
|
||||
"ad_source", thirdPartyAd.sourceName,
|
||||
"ad_id", thirdPartyAd.slotId,
|
||||
"ad_format", adConfig?.typeChinese ?: "",
|
||||
"ad_placement", "下载管理",
|
||||
"ad_space_id", adConfig?.id ?: "",
|
||||
"ad_space_name", adConfig?.name ?: ""
|
||||
)
|
||||
}
|
||||
val onAdClickAction = {
|
||||
SensorsBridge.trackEvent("ThirdPartyAdClick",
|
||||
"ad_source", thirdPartyAd.sourceName,
|
||||
"ad_id", thirdPartyAd.slotId,
|
||||
"ad_format", adConfig?.typeChinese ?: "",
|
||||
"ad_placement", "下载管理",
|
||||
"ad_space_id", adConfig?.id ?: "",
|
||||
"ad_space_name", adConfig?.name ?: ""
|
||||
)
|
||||
}
|
||||
AdDelegateHelper.requestThirdPartyBannerAd(
|
||||
this,
|
||||
mBinding.adContainer,
|
||||
thirdPartyAd,
|
||||
DisplayUtils.getScreenWidthInDp(requireActivity()),
|
||||
onAdShowAction,
|
||||
onAdClickAction,
|
||||
callback
|
||||
)
|
||||
}
|
||||
@ -226,7 +248,7 @@ class DownloadFragment : BaseFragment_TabLayout() {
|
||||
if (it.isNullOrEmpty() && adConfig.displayRule.adSource == AdDelegateHelper.AD_TYPE_OWNER &&
|
||||
adConfig.displayRule.onFailedAction == "show" && adConfig.thirdPartyAd != null) {
|
||||
// 自有广告游戏为空时,显示第三方广告
|
||||
initThirdPartyAd(adConfig.thirdPartyAd) { isSuccess ->
|
||||
initThirdPartyAd(adConfig, adConfig.thirdPartyAd) { isSuccess ->
|
||||
mBinding.maskView.goneIf(!isSuccess)
|
||||
if (isSuccess) {
|
||||
SPUtils.setLong(Constants.SP_LAST_DOWNLOAD_MANAGER_AD_SHOW_TIME, System.currentTimeMillis())
|
||||
|
||||
@ -6,7 +6,7 @@ class AdConfig(
|
||||
@SerializedName("_id")
|
||||
val id: String = "",
|
||||
val name: String,
|
||||
val location: String, // 广告插入位置。光环启动:halo_launch 下载管理:download_manager 游戏搜索:game_search 助手启动:helper_launch
|
||||
val location: String, // 广告插入位置。光环启动:halo_launch 下载管理:download_manager 游戏搜索:game_search 畅玩启动:helper_launch
|
||||
val type: String, // 广告位类型。开屏广告:launch 信息流广告:native banner 广告:banner 插屏广告:interstitial
|
||||
val position: Int, // 定位,不存在的时候返回:-1
|
||||
@SerializedName("display_rules")
|
||||
@ -18,12 +18,19 @@ class AdConfig(
|
||||
@SerializedName("owner_ads")
|
||||
val ownerAd: OwnerAdEntity? = null,
|
||||
) {
|
||||
companion object {
|
||||
const val TYPE_LAUNCH = "launch"
|
||||
const val TYPE_NATIVE = "native"
|
||||
const val TYPE_BANNER = "banner"
|
||||
const val TYPE_INTERSTITIAL = "interstitial"
|
||||
}
|
||||
|
||||
val typeChinese
|
||||
get() = when (type) {
|
||||
"launch" -> "开屏"
|
||||
"native" -> "信息流"
|
||||
"banner" -> "banner"
|
||||
"interstitial" -> "插屏"
|
||||
TYPE_LAUNCH -> "开屏"
|
||||
TYPE_NATIVE -> "信息流"
|
||||
TYPE_BANNER -> "banner"
|
||||
TYPE_INTERSTITIAL -> "插屏"
|
||||
else -> ""
|
||||
}
|
||||
|
||||
|
||||
@ -68,6 +68,12 @@ class SearchGameResultAdapter(
|
||||
|
||||
val positionAndPackageMap = HashMap<String, Int>()
|
||||
|
||||
private val adIdSet = hashSetOf<String>() // 记录展示过的广告id
|
||||
|
||||
fun clearAdIdSet() {
|
||||
adIdSet.clear()
|
||||
}
|
||||
|
||||
override fun setListData(updateData: MutableList<SearchItemData>?) {
|
||||
exposureEventArray = SparseArray(updateData?.size ?: 0)
|
||||
// 记录游戏位置
|
||||
@ -216,6 +222,7 @@ class SearchGameResultAdapter(
|
||||
|
||||
is SearchGameAdItemViewHolder -> {
|
||||
val adEntity = mEntityList[position].ad
|
||||
val adConfig = mEntityList[position].adConfig
|
||||
val slotId = adEntity?.slotId ?: ""
|
||||
val adContainer = holder.binding.adContainer
|
||||
val screenWidthInDp = DisplayUtils.getScreenWidthInDp(fragment.activity)
|
||||
@ -224,7 +231,36 @@ class SearchGameResultAdapter(
|
||||
// 广告 slotId 没有变,不管它
|
||||
} else {
|
||||
adContainer.tag = slotId
|
||||
AdDelegateHelper.requestThirdPartyFlowAd(fragment, slotId, adContainer, screenWidthInDp) {
|
||||
val onAdShowAction: () -> Unit = {
|
||||
if (!adIdSet.contains(adConfig?.id)) {
|
||||
SensorsBridge.trackEvent("ThirdPartyAdShow",
|
||||
json {
|
||||
"ad_source" to adEntity?.sourceName
|
||||
"ad_id" to slotId
|
||||
"ad_format" to adConfig?.typeChinese
|
||||
"ad_placement" to "搜索结果"
|
||||
"ad_space_id" to adConfig?.id
|
||||
"ad_space_name" to adConfig?.name
|
||||
"position" to adConfig?.position
|
||||
}
|
||||
)
|
||||
}
|
||||
adIdSet.add(adConfig?.id ?: "")
|
||||
}
|
||||
val onAdClickAction = {
|
||||
SensorsBridge.trackEvent("ThirdPartyAdClick",
|
||||
json {
|
||||
"ad_source" to adEntity?.sourceName
|
||||
"ad_id" to slotId
|
||||
"ad_format" to adConfig?.typeChinese
|
||||
"ad_placement" to "搜索结果"
|
||||
"ad_space_id" to adConfig?.id
|
||||
"ad_space_name" to adConfig?.name
|
||||
"position" to adConfig?.position
|
||||
}
|
||||
)
|
||||
}
|
||||
AdDelegateHelper.requestThirdPartyFlowAd(fragment, slotId, adContainer, screenWidthInDp, onAdShowAction, onAdClickAction) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -354,6 +354,7 @@ open class SearchGameResultFragment : ListFragment<GameEntity, SearchGameResultV
|
||||
this.mKey = key
|
||||
this.mType = type
|
||||
mAdapter?.key = key
|
||||
mAdapter?.clearAdIdSet()
|
||||
mListViewModel?.updateSearchKeyWithType(key, type)
|
||||
mListViewModel?.clearSearchSubjects()
|
||||
mListViewModel?.load(LoadType.REFRESH)
|
||||
|
||||
@ -188,7 +188,7 @@ class SearchGameResultViewModel(
|
||||
list: List<GameEntity>
|
||||
) {
|
||||
thirdPartyAdList.forEach {
|
||||
decoratedItemDataList.add(it.position - 1, SearchItemData(ad = it.thirdPartyAd))
|
||||
decoratedItemDataList.add(it.position - 1, SearchItemData(ad = it.thirdPartyAd, adConfig = it))
|
||||
SPUtils.setLong(Constants.SP_LAST_GAME_SEARCH_AD_SHOW_TIME + it.position, System.currentTimeMillis())
|
||||
}
|
||||
postResultList(decoratedItemDataList, list)
|
||||
@ -209,7 +209,7 @@ class SearchGameResultViewModel(
|
||||
if ((showThirdPartyAd && adConfig?.thirdPartyAd != null)
|
||||
|| (showOwnerAd && adConfig?.ownerAd == null && adConfig?.thirdPartyAd != null && showOnFailed)
|
||||
) {
|
||||
decoratedItemDataList.add(position - 1, SearchItemData(ad = adConfig.thirdPartyAd))
|
||||
decoratedItemDataList.add(position - 1, SearchItemData(ad = adConfig.thirdPartyAd, adConfig = adConfig))
|
||||
SPUtils.setLong(
|
||||
Constants.SP_LAST_GAME_SEARCH_AD_SHOW_TIME + adConfig.position,
|
||||
System.currentTimeMillis()
|
||||
@ -254,7 +254,7 @@ class SearchGameResultViewModel(
|
||||
)
|
||||
} else if (showOnFailed && adConfig.thirdPartyAd != null) {
|
||||
// 自有广告为空时,显示第三方广告
|
||||
decoratedItemDataList.add(position - 1, SearchItemData(ad = adConfig.thirdPartyAd))
|
||||
decoratedItemDataList.add(position - 1, SearchItemData(ad = adConfig.thirdPartyAd, adConfig = adConfig))
|
||||
SPUtils.setLong(
|
||||
Constants.SP_LAST_GAME_SEARCH_AD_SHOW_TIME + adConfig.position,
|
||||
System.currentTimeMillis()
|
||||
|
||||
Reference in New Issue
Block a user