diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9d8544f953..1e7b8cf24b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -771,6 +771,10 @@ android:name="com.gh.gamecenter.UserAuthActivity" android:screenOrientation="portrait" /> + + diff --git a/app/src/main/java/com/gh/ad/AdDelegateHelper.kt b/app/src/main/java/com/gh/ad/AdDelegateHelper.kt index 61459247d3..101dbae7f3 100644 --- a/app/src/main/java/com/gh/ad/AdDelegateHelper.kt +++ b/app/src/main/java/com/gh/ad/AdDelegateHelper.kt @@ -17,6 +17,7 @@ import com.gh.common.exposure.ExposureManager import com.gh.common.util.DirectUtils.directToLinkPage import com.gh.common.util.LogUtils import com.gh.common.util.NewFlatLogUtils.logOpenScreenAdSkip +import com.gh.common.util.PackageUtils import com.gh.gamecenter.BuildConfig import com.gh.gamecenter.MainActivity import com.gh.gamecenter.R @@ -66,6 +67,7 @@ object AdDelegateHelper { private const val AD_SDK_CSJ = "穿山甲" private const val AD_SDK_BEIZI = "倍孜" const val AD_TYPE_SDK = "third_party_ads" // 第三方 SDK 广告 + const val AD_TYPE_OWNER = "owner_ads" // 自有广告 private const val KEY_CACHE_CONFIG = "cache_config" // 放在 SP 里的广告缓存(避免接口加载问题) @@ -73,6 +75,7 @@ object AdDelegateHelper { HaloApp.getInstance().getSharedPreferences("AdConfig", Context.MODE_PRIVATE) } + var isShowingSplashAd = false // 是否正在显示开屏广告 var gameSearchKeyword = "" fun initAdSdk(context: Context) { @@ -174,9 +177,99 @@ object AdDelegateHelper { /** * 是否需要显示开屏广告 + * @param isHotLaunch 是否为热启动 */ - fun shouldShowStartUpAd(): Boolean { + fun shouldShowStartUpAd(isHotLaunch: Boolean): Boolean { return mSplashAd != null + && !isShowingSplashAd + && (!isHotLaunch || shouldShowStartUpAdWhenHotLaunch()) + && !isMatchAdFreeRule(mSplashAd) + && isMatchStartUpAdDisplayRule() + } + + /** + * 热启动是否需要显示开屏广告 + */ + private fun shouldShowStartUpAdWhenHotLaunch() = mSplashAd?.displayRule?.hotStartSplashAd?.type != "none" + + /** + * 是否需要显示下载管理广告 + */ + fun shouldShowDownloadManagerAd(): Boolean { + return mDownloadManagerAd != null && !isMatchAdFreeRule(mDownloadManagerAd) && isMatchDownloadManagerAdDisplayRule() + } + + /** + * 是否需要显示游戏搜索广告 + */ + fun shouldShowGameSearchAd(adConfig: AdConfig): Boolean { + return !isMatchAdFreeRule(adConfig) && isMatchGameSearchAdDisplayRule(adConfig) + } + + /** + * 是否在免广告时长内 + */ + private fun isMatchAdFreeRule(adConfig: AdConfig?): Boolean { + adConfig?.displayRule?.run { + if (adFreeDuration > 0) { + val ghInstalledDurationInHours = (System.currentTimeMillis() - PackageUtils.getInstalledTime( + HaloApp.getInstance(), + BuildConfig.APPLICATION_ID + )).toFloat() / 1000 / 3600 + return ghInstalledDurationInHours < adFreeDuration + } else { + return false + } + } + return false + } + + /** + * 是否大于开屏广告展示间隔时长 + */ + 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 isMatchDownloadManagerAdDisplayRule(): Boolean { + mDownloadManagerAd?.displayRule?.run { + if (adDisplayInterval > 0) { + val lastShowTime = SPUtils.getLong(Constants.SP_LAST_DOWNLOAD_MANAGER_AD_SHOW_TIME, 0L) + val durationInMinutes = (System.currentTimeMillis() - lastShowTime).toFloat() / 1000 / 60 + return durationInMinutes > adDisplayInterval + } else { + return true + } + } + return true + } + + /** + * 是否大于游戏搜索展示间隔时长 + */ + private fun isMatchGameSearchAdDisplayRule(adConfig: AdConfig?): Boolean { + adConfig?.displayRule?.run { + if (adDisplayInterval > 0) { + val lastShowTime = SPUtils.getLong(Constants.SP_LAST_GAME_SEARCH_AD_SHOW_TIME + adConfig.position, 0L) + val durationInMinutes = (System.currentTimeMillis() - lastShowTime).toFloat() / 1000 / 60 + return durationInMinutes > adDisplayInterval + } else { + return true + } + } + return true } /** @@ -200,57 +293,125 @@ object AdDelegateHelper { sdkStartAdContainer: ViewGroup, adsViewGroup: FrameLayout, handler: BaseActivity.BaseHandler, - hideCallback: () -> Unit + isHotLaunch: Boolean, + hideAction: () -> Unit ) { + val hideCallback = { + isShowingSplashAd = false + hideAction.invoke() + } if (mSplashAd != null) { - if (mSplashAd!!.displayRule.adSource == AD_TYPE_SDK) { - // 第三方开屏广告回调,失败时根据接口配置选项决定是否显示自有开屏广告 - val sdkSplashCallback: (isSuccess: Boolean) -> Unit = { isSuccess -> - if (isSuccess) { - hideCallback.invoke() - } else { - if (mSplashAd?.displayRule?.onFailedAction == "show") { - sdkStartAdContainer.visibility = View.GONE - requestStandardSplashAd( - mSplashAd!!.ownerAd?.startAd, - startAdContainer, - handler, - hideCallback - ) - } else { - hideCallback.invoke() - } - } - } - - // 第三方广告的数据为空,按加载失败处理 - if (mSplashAd?.thirdPartyAd == null) { - sdkSplashCallback.invoke(false) - return - } - - if (mSplashAd?.thirdPartyAd?.sourceName == AD_SDK_BEIZI) { - sdkStartAdContainer.visibility = View.VISIBLE - requestBeiziSplashAd(sdkStartAdContainer, adsViewGroup, adViewWidthInPx, adViewHeightInPx, sdkSplashCallback) - } else if (mSplashAd?.thirdPartyAd?.sourceName == AD_SDK_CSJ) { - sdkStartAdContainer.visibility = View.VISIBLE - requestCsjSplashAd( + when (if (isHotLaunch) mSplashAd!!.displayRule.hotStartSplashAd?.type else mSplashAd!!.displayRule.adSource) { + AD_TYPE_SDK -> { + isShowingSplashAd = true + requestThirdPartySplashAd( activity, - mSplashAd?.thirdPartyAd?.slotId ?: "unknown", adViewWidthInPx, adViewHeightInPx, adViewWidthInDp, adViewHeightInDp, + startAdContainer, sdkStartAdContainer, - sdkSplashCallback + adsViewGroup, + handler, + isHotLaunch, + hideCallback + ) + } + + AD_TYPE_OWNER -> { + isShowingSplashAd = true + requestStandardSplashAd( + activity, + adViewWidthInPx, + adViewHeightInPx, + adViewWidthInDp, + adViewHeightInDp, + startAdContainer, + sdkStartAdContainer, + adsViewGroup, + handler, + isHotLaunch, + hideCallback ) } - } else { - requestStandardSplashAd(mSplashAd!!.ownerAd?.startAd, startAdContainer, handler, hideCallback) } } } + /** + * 获取第三方开屏广告 + */ + private fun requestThirdPartySplashAd( + activity: Activity, + adViewWidthInPx: Int, + adViewHeightInPx: Int, + adViewWidthInDp: Float, + adViewHeightInDp: Float, + startAdContainer: ViewGroup, + sdkStartAdContainer: ViewGroup, + adsViewGroup: FrameLayout, + handler: BaseActivity.BaseHandler, + isHotLaunch: Boolean, + hideCallback: () -> Unit + ) { + val timeout = if (isHotLaunch) { + ((mSplashAd!!.displayRule.hotStartSplashAd?.timeout ?: 3.5F) * 1000).toInt() + } else { + (mSplashAd!!.displayRule.timeout * 1000).toInt() + } + // 第三方开屏广告回调,失败时根据接口配置选项决定是否显示自有开屏广告 + val sdkSplashCallback: (isSuccess: Boolean) -> Unit = { isSuccess -> + if (isSuccess) { + hideCallback.invoke() + SPUtils.setLong(Constants.SP_LAST_SPLASH_AD_SHOW_TIME, System.currentTimeMillis()) + } else { + if (mSplashAd?.displayRule?.adSource == AD_TYPE_SDK && mSplashAd?.displayRule?.onFailedAction == "show" && !isHotLaunch) { + sdkStartAdContainer.visibility = View.GONE + requestStandardSplashAd( + activity, + adViewWidthInPx, + adViewHeightInPx, + adViewWidthInDp, + adViewHeightInDp, + startAdContainer, + sdkStartAdContainer, + adsViewGroup, + handler, + isHotLaunch, + hideCallback + ) + } else { + hideCallback.invoke() + } + } + } + + // 第三方广告的数据为空,按加载失败处理 + if (mSplashAd?.thirdPartyAd == null) { + sdkSplashCallback.invoke(false) + return + } + + if (mSplashAd?.thirdPartyAd?.sourceName == AD_SDK_BEIZI) { + sdkStartAdContainer.visibility = View.VISIBLE + requestBeiziSplashAd(sdkStartAdContainer, adsViewGroup, adViewWidthInPx, adViewHeightInPx, timeout.toLong(), sdkSplashCallback) + } else if (mSplashAd?.thirdPartyAd?.sourceName == AD_SDK_CSJ) { + sdkStartAdContainer.visibility = View.VISIBLE + requestCsjSplashAd( + activity, + mSplashAd?.thirdPartyAd?.slotId ?: "unknown", + adViewWidthInPx, + adViewHeightInPx, + adViewWidthInDp, + adViewHeightInDp, + sdkStartAdContainer, + timeout, + sdkSplashCallback + ) + } + } + /** * 获取穿山甲的开屏广告 */ @@ -262,6 +423,7 @@ object AdDelegateHelper { adViewWidthInDp: Float, adViewHeightInDp: Float, startAdContainer: ViewGroup, + timeout: Int, callback: (isSuccess: Boolean) -> Unit, ) { if (mCsjAdImpl == null) { @@ -275,6 +437,7 @@ object AdDelegateHelper { adViewWidthInDp, adViewHeightInDp, startAdContainer, + timeout, callback, ) } @@ -288,12 +451,13 @@ object AdDelegateHelper { adsFl: FrameLayout, adViewWidthInPx: Int, adViewHeightInPx: Int, + timeout: Long, callback: (isSuccess: Boolean) -> Unit, ) { if (mBeiziAdImpl == null) { callback.invoke(false) } else { - mBeiziAdImpl?.requestSplashAd(startAdContainer, adsFl, adViewWidthInPx, adViewHeightInPx, callback) + mBeiziAdImpl?.requestSplashAd(startAdContainer, adsFl, adViewWidthInPx, adViewHeightInPx, timeout, callback) } } @@ -301,13 +465,41 @@ object AdDelegateHelper { * 显示自有的开屏广告 */ private fun requestStandardSplashAd( - splashAd: StartupAdEntity?, + activity: Activity, + adViewWidthInPx: Int, + adViewHeightInPx: Int, + adViewWidthInDp: Float, + adViewHeightInDp: Float, startAdContainer: ViewGroup, + sdkStartAdContainer: ViewGroup, + adsViewGroup: FrameLayout, handler: BaseActivity.BaseHandler, + isHotLaunch: Boolean, hideCallback: () -> Unit ) { + val splashAd = mSplashAd?.ownerAd?.startAd + val onEmptyCallback = { + if (mSplashAd?.displayRule?.adSource == AD_TYPE_OWNER && mSplashAd?.displayRule?.onFailedAction == "show" && mSplashAd?.thirdPartyAd != null) { + // 自有广告为空时,显示第三方广告 + requestThirdPartySplashAd( + activity, + adViewWidthInPx, + adViewHeightInPx, + adViewWidthInDp, + adViewHeightInDp, + startAdContainer, + sdkStartAdContainer, + adsViewGroup, + handler, + isHotLaunch, + hideCallback + ) + } else { + hideCallback.invoke() + } + } if (splashAd == null) { - hideCallback.invoke() + onEmptyCallback.invoke() return } @@ -320,7 +512,7 @@ object AdDelegateHelper { ) { showStandardSplashAd(splashAd, startAdContainer, handler, hideCallback) } else { - hideCallback.invoke() + onEmptyCallback.invoke() } "everyday" -> { @@ -331,7 +523,7 @@ object AdDelegateHelper { ) { showStandardSplashAd(splashAd, startAdContainer, handler, hideCallback) } else { - hideCallback.invoke() + onEmptyCallback.invoke() } } @@ -394,6 +586,7 @@ object AdDelegateHelper { } else { LogUtils.logStartAd("start_ads", ad) } + SPUtils.setLong(Constants.SP_LAST_SPLASH_AD_SHOW_TIME, System.currentTimeMillis()) handler.sendEmptyMessageDelayed(MainActivity.COUNTDOWN_AD, 1000) } diff --git a/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt b/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt index 5d3d2e0752..3f388b12e3 100644 --- a/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt +++ b/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt @@ -4,20 +4,24 @@ import android.app.Activity import android.app.Application import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.gh.ad.AdDelegateHelper import com.gh.common.util.FloatingBackViewManager import com.gh.common.xapk.XapkInstaller import com.gh.download.DownloadManager import com.gh.gamecenter.SingletonWebActivity import com.gh.gamecenter.SkipActivity +import com.gh.gamecenter.SplashAdActivity import com.gh.gamecenter.SplashScreenActivity import com.gh.gamecenter.authorization.AuthorizationActivity import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.gamecenter.common.utils.PackageFlavorHelper +import com.gh.gamecenter.core.utils.CurrentActivityHolder.getCurrentActivity import com.gh.vspace.VHelper import com.halo.assistant.HaloApp // TODO:移动到对应的模块 class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks { + private var mIsFromBackgroundToForeground = false // 是否后台回到前台 override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { // do nothing @@ -25,6 +29,17 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks { override fun onActivityStarted(activity: Activity) { GlobalActivityManager.currentActivity = activity + + if (mIsFromBackgroundToForeground) { + if (AdDelegateHelper.shouldShowStartUpAd(true) + && activity !is SplashScreenActivity + && activity !is SkipActivity + && activity !is AuthorizationActivity + ) { + activity.startActivity(SplashAdActivity.getIntent(activity)) + } + mIsFromBackgroundToForeground = false + } } override fun onActivityResumed(activity: Activity) { @@ -74,7 +89,7 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks { } override fun onActivityStopped(activity: Activity) { - // do nothing + mIsFromBackgroundToForeground = getCurrentActivity() == null } override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index bc4298291b..6924090716 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -155,8 +155,8 @@ public class MainActivity extends BaseActivity { public static final String SWITCH_TO_VIDEO = "switch_to_video"; public static final String SHOW_AD = "show_ad"; public static final int COUNTDOWN_AD = 100; - private static final int COUNTDOWN_MAX_COUNT = 3; - private int countdownCount = 0; + public static final int COUNTDOWN_MAX_COUNT = 3; + private int mCountdownCount = 0; private static final String CURRENT_PAGE = "current_page"; @@ -177,7 +177,6 @@ public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { mShouldShowAd = getIntent().getBooleanExtra(SHOW_AD, false) && savedInstanceState == null; - HaloApp.getInstance().isAlreadyUpAndRunning = true; mMainWrapperViewModel = new ViewModelProvider(this, new MainWrapperViewModel.Factory(HaloApp.getInstance())) @@ -510,7 +509,7 @@ public class MainActivity extends BaseActivity { * 显示开屏广告 */ private void showSplashAd() { - if (AdDelegateHelper.INSTANCE.shouldShowStartUpAd()) { + if (AdDelegateHelper.INSTANCE.shouldShowStartUpAd(false)) { ViewGroup startAdContainer = findViewById(R.id.startAdContainer); ViewGroup sdkStartAdContainer = findViewById(R.id.sdkStartAdContainer); FrameLayout adsFl = findViewById(R.id.adsFl); @@ -532,6 +531,7 @@ public class MainActivity extends BaseActivity { sdkStartAdContainer, adsFl, (BaseHandler) mBaseHandler, + false, () -> { hideSplashAd(); return null; @@ -546,12 +546,13 @@ public class MainActivity extends BaseActivity { protected void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == COUNTDOWN_AD) { - countdownCount++; - TextView jumpBtn = findViewById(R.id.jumpBtn); - jumpBtn.setText(String.format(Locale.CHINA, "跳过 %d", COUNTDOWN_MAX_COUNT - countdownCount)); - if (COUNTDOWN_MAX_COUNT < countdownCount) { + mCountdownCount++; + if (COUNTDOWN_MAX_COUNT < mCountdownCount) { + AdDelegateHelper.INSTANCE.setShowingSplashAd(false); hideSplashAd(); } else { + TextView jumpBtn = findViewById(R.id.jumpBtn); + jumpBtn.setText(String.format(Locale.CHINA, "跳过 %d", COUNTDOWN_MAX_COUNT - mCountdownCount)); mBaseHandler.sendEmptyMessageDelayed(COUNTDOWN_AD, 1000); } } diff --git a/app/src/main/java/com/gh/gamecenter/SplashAdActivity.kt b/app/src/main/java/com/gh/gamecenter/SplashAdActivity.kt new file mode 100644 index 0000000000..d0442630e9 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/SplashAdActivity.kt @@ -0,0 +1,98 @@ +package com.gh.gamecenter + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.os.Message +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.TextView +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.utils.dip2px +import com.gh.gamecenter.core.utils.DisplayUtils +import java.util.* + +/** + * 开屏广告(热启动) + */ +class SplashAdActivity : BaseActivity() { + private var mCountdownCount = 0 + override fun getLayoutId(): Int = R.layout.activity_splash_ad + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + overridePendingTransition(0, 0) + DisplayUtils.transparentStatusBar(this) + showSplashAd() + } + + /** + * 显示开屏广告 + */ + private fun showSplashAd() { + if (shouldShowStartUpAd(true)) { + val startAdContainer = findViewById(R.id.startAdContainer) + val sdkStartAdContainer = findViewById(R.id.sdkStartAdContainer) + val adsFl = findViewById(R.id.adsFl) + + val screenWidthInPx = DisplayUtils.getScreenWidth(this) + val screenHeightInPx = (DisplayUtils.getScreenHeight(this) + + DisplayUtils.getStatusBarHeight(this.resources) + - 112F.dip2px()) + val screenWidthInDp = DisplayUtils.px2dip(this, screenWidthInPx.toFloat()).toFloat() + val screenHeightInDp = DisplayUtils.px2dip(this, screenHeightInPx.toFloat()).toFloat() + requestSplashAd( + this, + screenWidthInPx, + screenHeightInPx, + screenWidthInDp, + screenHeightInDp, + startAdContainer!!, + sdkStartAdContainer!!, + adsFl!!, + (mBaseHandler as BaseHandler), + true + ) { + finishActivity() + null + } + } else { + finishActivity() + } + } + + private fun finishActivity() { + finish() + overridePendingTransition(0, 0) + } + + override fun handleBackPressed(): Boolean { + return true + } + + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + if (msg.what == MainActivity.COUNTDOWN_AD) { + mCountdownCount++ + if (MainActivity.COUNTDOWN_MAX_COUNT < mCountdownCount) { + AdDelegateHelper.isShowingSplashAd = false + finishActivity() + } else { + val jumpBtn = findViewById(R.id.jumpBtn) + jumpBtn.text = + String.format(Locale.CHINA, "跳过 %d", MainActivity.COUNTDOWN_MAX_COUNT - mCountdownCount) + mBaseHandler.sendEmptyMessageDelayed(MainActivity.COUNTDOWN_AD, 1000) + } + } + } + + companion object { + @JvmStatic + fun getIntent(context: Context): Intent { + return Intent(context, SplashAdActivity::class.java) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/download/AdGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/AdGameViewModel.kt index 69e52f2251..a9ab52f179 100644 --- a/app/src/main/java/com/gh/gamecenter/download/AdGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/download/AdGameViewModel.kt @@ -26,7 +26,9 @@ class AdGameViewModel(application: Application, private val mAdConfig: AdConfig) @SuppressLint("CheckResult") fun getAdGameList() { - val paramsMap = mapOf("page" to "1,${mAdConfig.ownerAd?.adSource?.gamesIds?.size ?: 20}") + val pageSize = mAdConfig.ownerAd?.adSource?.gamesIds?.size ?: 20 + val codeId = mAdConfig.ownerAd?.id + val paramsMap = mapOf("page" to "1,$pageSize", "code_id" to codeId) mApi.getAdGames(mAdConfig.id, paramsMap) .compose(singleToMain()) .subscribe(object : BiResponse>() { diff --git a/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt b/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt index 281bece648..c84698befc 100644 --- a/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt @@ -26,9 +26,11 @@ import com.gh.download.DownloadManager import com.gh.gamecenter.DownloadManagerActivity import com.gh.gamecenter.R import com.gh.gamecenter.common.base.fragment.BaseFragment_TabLayout +import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.eventbus.EBMiPush import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.utils.DisplayUtils +import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.databinding.FragmentDownloadBinding import com.gh.gamecenter.databinding.TabItemDownloadNumberBinding import com.gh.gamecenter.entity.AdConfig @@ -139,26 +141,28 @@ class DownloadFragment : BaseFragment_TabLayout() { mDownloadManager.markDownloadedTaskAsRead() } - val downloadManagerAd = AdDelegateHelper.getDownloadManagerAd() - val showThirdPartyAd = downloadManagerAd?.displayRule?.adSource == AdDelegateHelper.AD_TYPE_SDK - val thirdPartyAd = downloadManagerAd?.thirdPartyAd - val ownerAd = downloadManagerAd?.ownerAd - if (showThirdPartyAd && thirdPartyAd != null) { - AdDelegateHelper.requestThirdPartyBannerAd( - this, - mBinding.adContainer, - thirdPartyAd, - DisplayUtils.getScreenWidthInDp(requireActivity()) - ) { isSuccess -> - mBinding.maskView.goneIf(!isSuccess) - if (!isSuccess && ownerAd != null && downloadManagerAd.displayRule.onFailedAction == "show") { - mSlideInterval = ownerAd.adSource?.sliderInterval ?: -1 - initOwnerAd(downloadManagerAd) + if (AdDelegateHelper.shouldShowDownloadManagerAd()) { + val downloadManagerAd = AdDelegateHelper.getDownloadManagerAd() + val showThirdPartyAd = downloadManagerAd?.displayRule?.adSource == AdDelegateHelper.AD_TYPE_SDK + val showOwnerAd = downloadManagerAd?.displayRule?.adSource == AdDelegateHelper.AD_TYPE_OWNER + val thirdPartyAd = downloadManagerAd?.thirdPartyAd + val ownerAd = downloadManagerAd?.ownerAd + val showOnFailed = downloadManagerAd?.displayRule?.onFailedAction == "show" + if ((showThirdPartyAd && thirdPartyAd != null) || (!showThirdPartyAd && thirdPartyAd != null && ownerAd == null)) { + initThirdPartyAd(thirdPartyAd) { isSuccess -> + mBinding.maskView.goneIf(!isSuccess) + if (!isSuccess && ownerAd != null && showOnFailed) { + mSlideInterval = ownerAd.adSource?.sliderInterval ?: -1 + initOwnerAd(downloadManagerAd) + } + if (isSuccess) { + SPUtils.setLong(Constants.SP_LAST_DOWNLOAD_MANAGER_AD_SHOW_TIME, System.currentTimeMillis()) + } } + } else if ((showOwnerAd && ownerAd != null) || (showThirdPartyAd && ownerAd != null && showOnFailed)) { + mSlideInterval = ownerAd.adSource?.sliderInterval ?: -1 + initOwnerAd(downloadManagerAd) } - } else if (ownerAd != null) { - mSlideInterval = ownerAd.adSource?.sliderInterval ?: -1 - initOwnerAd(downloadManagerAd) } val pathOfPackageToInstall = activity?.intent?.getStringExtra(KEY_PATH_OF_PACKAGE_TO_INSTALL) @@ -167,6 +171,16 @@ class DownloadFragment : BaseFragment_TabLayout() { } } + private fun initThirdPartyAd(thirdPartyAd: AdConfig.ThirdPartyAd, callback: (isSuccess: Boolean) -> Unit) { + AdDelegateHelper.requestThirdPartyBannerAd( + this, + mBinding.adContainer, + thirdPartyAd, + DisplayUtils.getScreenWidthInDp(requireActivity()), + callback + ) + } + private fun initOwnerAd(adConfig: AdConfig) { if (adConfig.id.isEmpty()) return mAdGameViewModel = viewModelProvider(AdGameViewModel.Factory(adConfig)) @@ -196,6 +210,17 @@ class DownloadFragment : BaseFragment_TabLayout() { } } startAdBannerAutoPlay() + SPUtils.setLong(Constants.SP_LAST_DOWNLOAD_MANAGER_AD_SHOW_TIME, System.currentTimeMillis()) + } + if (it.isNullOrEmpty() && adConfig.displayRule.adSource == AdDelegateHelper.AD_TYPE_OWNER && + adConfig.displayRule.onFailedAction == "show" && adConfig.thirdPartyAd != null) { + // 自有广告游戏为空时,显示第三方广告 + initThirdPartyAd(adConfig.thirdPartyAd) { isSuccess -> + mBinding.maskView.goneIf(!isSuccess) + if (isSuccess) { + SPUtils.setLong(Constants.SP_LAST_DOWNLOAD_MANAGER_AD_SHOW_TIME, System.currentTimeMillis()) + } + } } } } diff --git a/app/src/main/java/com/gh/gamecenter/entity/AdConfig.kt b/app/src/main/java/com/gh/gamecenter/entity/AdConfig.kt index de6d79526d..a949bc4dbe 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/AdConfig.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/AdConfig.kt @@ -27,10 +27,22 @@ class AdConfig( class DisplayRule( @SerializedName("ad_source") - val adSource: String, // 广告位获取广告源。第三方广告:third_party_ads 自有广告:owner_ads + var adSource: String, // 广告位获取广告源。第三方广告:third_party_ads 自有广告:owner_ads @SerializedName("on_failed") - val onFailedAction: String, // 第三方广告获取失败时。显示自有广告:show 隐藏广告位:hide - ) + var onFailedAction: String, // 第三方广告获取失败/自有广告为空时。显示自有广告/第三方广告:show 隐藏广告位:hide + var timeout: Float = 3.5F, // 超时时长, 默认值为3.5 + @SerializedName("ad_free_duration") + var adFreeDuration: Int = 0, // 安装后免广告时长。为空的时候传递:0 + @SerializedName("ad_display_interval") + var adDisplayInterval: Int = 0, // 广告展示间隔。为空的时候传递:0 + @SerializedName("hot_start_splash_ad") + var hotStartSplashAd: HotStartSplashAd? = null, // 热启动开屏广告 + ) { + class HotStartSplashAd( + var type: String = "", // 是否展示开屏广告。不显示广告:none 显示第三方广告:third_party_ads + var timeout: Float = 3.5F // 超时时长, 默认值为3.5 + ) + } class ThirdPartyAd( @SerializedName("source_name") diff --git a/app/src/main/java/com/gh/gamecenter/entity/SearchSubjectEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/SearchSubjectEntity.kt index c98c4c1a8c..35bbcb035f 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/SearchSubjectEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/SearchSubjectEntity.kt @@ -14,6 +14,7 @@ data class SearchSubjectEntity( @SerializedName("column_id") val columnId: String = "", val adId: String = "", // 广告ID(本地字段),不为空时为广告专题 + val codeId: String = "", // 广告CODE_ID(本地字段),不为空时为广告专题 @SerializedName("ad_icon_active") val adIconActive: Boolean = false ) : Parcelable { diff --git a/app/src/main/java/com/gh/gamecenter/entity/SubjectData.kt b/app/src/main/java/com/gh/gamecenter/entity/SubjectData.kt index 2be58ddc9d..46483f6a75 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/SubjectData.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/SubjectData.kt @@ -20,7 +20,8 @@ class SubjectData( var requireUpdateSetting: Boolean = false, // 多专题页面需要专题页面自行获取专题配置 var isAdData: Boolean = false, - var adId: String = "" // 广告ID(本地字段),不为空时为广告专题 + var adId: String = "", // 广告ID(本地字段),不为空时为广告专题 + var codeId: String = "" // 广告CODE_ID(本地字段),不为空时为广告专题 ) : Parcelable, Cloneable { fun deepCopy(): SubjectData { diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexItemViewHolder.kt index e526c953a8..851243b283 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexItemViewHolder.kt @@ -117,10 +117,11 @@ class SearchSubjectItemViewHolder(var binding: SearchSubjectItemBinding) : Recyc dao?.add(key) if (entity.columnId.isNotEmpty()) { DirectUtils.directToSubject(context, entity.columnId, entity.name, "($type-专题)") - } else if (entity.adId.isNotEmpty()) { + } else if (entity.adId.isNotEmpty() && entity.codeId.isNotEmpty()) { SubjectActivity.startAdSubjectActivity( context, entity.adId, + entity.codeId, entity.name, entity.adIconActive, null, diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt index 7c183511f2..a271c3b04a 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt @@ -10,8 +10,11 @@ import com.gh.gamecenter.SearchActivity import com.gh.gamecenter.common.baselist.ListViewModel import com.gh.gamecenter.common.baselist.LoadParams import com.gh.gamecenter.common.baselist.LoadStatus +import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.utils.safelyGetInRelease import com.gh.gamecenter.common.utils.singleToMain +import com.gh.gamecenter.common.utils.toArrayList +import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.entity.AdConfig import com.gh.gamecenter.entity.SearchSubjectEntity import com.gh.gamecenter.feature.entity.GameEntity @@ -95,7 +98,9 @@ class SearchGameResultViewModel( @SuppressLint("CheckResult") private fun updateAdConfigAndDecorateList(itemDataList: ArrayList, list: MutableList) { - mGameSearchAdList = AdDelegateHelper.getGameSearchAdList().apply { sortBy { it.position } } + mGameSearchAdList = + AdDelegateHelper.getGameSearchAdList().filter { AdDelegateHelper.shouldShowGameSearchAd(it) }.toArrayList() + .apply { sortBy { it.position } } val adPositionSet = hashSetOf() if (!mGameSearchAdList.isNullOrEmpty()) { @@ -114,9 +119,16 @@ class SearchGameResultViewModel( for ((index, position) in adPositionSet.withIndex()) { if (position < itemDataList.size + index + 1) { val adConfig = mGameSearchAdList!!.safelyGetInRelease(index) - if (adConfig?.displayRule?.adSource == AdDelegateHelper.AD_TYPE_SDK && adConfig.thirdPartyAd != null) { + val showThirdPartyAd = adConfig?.displayRule?.adSource == AdDelegateHelper.AD_TYPE_SDK + val showOwnerAd = adConfig?.displayRule?.adSource == AdDelegateHelper.AD_TYPE_OWNER + val showOnFailed = adConfig?.displayRule?.onFailedAction == "show" + if ((showThirdPartyAd && adConfig?.thirdPartyAd != null) + || (showOwnerAd && adConfig?.ownerAd == null && adConfig?.thirdPartyAd != null && showOnFailed) + ) { thirdPartyAdList.add(adConfig) - } else if (adConfig?.ownerAd != null) { + } else if ((showOwnerAd && adConfig?.ownerAd != null) + || (showThirdPartyAd && adConfig?.ownerAd != null && showOnFailed) + ) { ownerAdList.add(adConfig) } } else { @@ -159,6 +171,7 @@ class SearchGameResultViewModel( ) { thirdPartyAdList.forEach { decoratedItemDataList.add(it.position - 1, SearchItemData(ad = it.thirdPartyAd)) + SPUtils.setLong(Constants.SP_LAST_GAME_SEARCH_AD_SHOW_TIME + it.position, System.currentTimeMillis()) } postResultList(decoratedItemDataList, list) } @@ -169,13 +182,23 @@ class SearchGameResultViewModel( list: List ) { val adGameOneIdSet = HashSet() // 展示样式为单个游戏时记录游戏ID,避免重复 - for ((index, position) in mAdPositionSet!!.withIndex()) { if (position < itemDataList.size + index + 1) { val adConfig = mGameSearchAdList!!.safelyGetInRelease(index) - if (adConfig?.displayRule?.adSource == AdDelegateHelper.AD_TYPE_SDK && adConfig.thirdPartyAd != null) { + val showThirdPartyAd = adConfig?.displayRule?.adSource == AdDelegateHelper.AD_TYPE_SDK + val showOwnerAd = adConfig?.displayRule?.adSource == AdDelegateHelper.AD_TYPE_OWNER + val showOnFailed = adConfig?.displayRule?.onFailedAction == "show" + if ((showThirdPartyAd && adConfig?.thirdPartyAd != null) + || (showOwnerAd && adConfig?.ownerAd == null && adConfig?.thirdPartyAd != null && showOnFailed) + ) { decoratedItemDataList.add(position - 1, SearchItemData(ad = adConfig.thirdPartyAd)) - } else if (adConfig?.ownerAd != null) { + SPUtils.setLong( + Constants.SP_LAST_GAME_SEARCH_AD_SHOW_TIME + adConfig.position, + System.currentTimeMillis() + ) + } else if ((showOwnerAd && adConfig?.ownerAd != null) + || (showThirdPartyAd && adConfig?.ownerAd != null && showOnFailed) + ) { val gameList = mAdGameMap[adConfig.id] if (!gameList.isNullOrEmpty()) { if (adConfig.ownerAd.adSource?.displayStyle == "game_zone") { @@ -187,6 +210,7 @@ class SearchGameResultViewModel( name = adConfig.ownerAd.adSource?.title ?: "", games = gameList.take(AD_SUBJECT_GAME_MAX_COUNT), adId = adConfig.id, + codeId = adConfig.ownerAd.id, adIconActive = adConfig.ownerAd.adSource?.adIconActive ?: false ), adConfig = adConfig @@ -206,6 +230,17 @@ class SearchGameResultViewModel( SearchItemData(game = randomGameEntity, adConfig = adConfig) ) } + SPUtils.setLong( + Constants.SP_LAST_GAME_SEARCH_AD_SHOW_TIME + adConfig.position, + System.currentTimeMillis() + ) + } else if (showOnFailed && adConfig.thirdPartyAd != null) { + // 自有广告为空时,显示第三方广告 + decoratedItemDataList.add(position - 1, SearchItemData(ad = adConfig.thirdPartyAd)) + SPUtils.setLong( + Constants.SP_LAST_GAME_SEARCH_AD_SHOW_TIME + adConfig.position, + System.currentTimeMillis() + ) } } } else { @@ -217,7 +252,9 @@ class SearchGameResultViewModel( @SuppressLint("CheckResult") private fun createAdGameListSingle(adConfig: AdConfig) = Single.create { emitter -> - val paramsMap = mapOf("page" to "1,${adConfig.ownerAd?.adSource?.gamesIds?.size ?: 20}") + val pageSize = adConfig.ownerAd?.adSource?.gamesIds?.size ?: 20 + val codeId = adConfig.ownerAd?.id + val paramsMap = mapOf("page" to "1,$pageSize", "code_id" to codeId) RetrofitManager.getInstance().newApi.getAdGames(adConfig.id, paramsMap) .compose(singleToMain()) .subscribe({ data -> diff --git a/app/src/main/java/com/gh/gamecenter/subject/AdSubjectListViewModel.kt b/app/src/main/java/com/gh/gamecenter/subject/AdSubjectListViewModel.kt index b886923025..44edf5a5f7 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/AdSubjectListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/subject/AdSubjectListViewModel.kt @@ -20,7 +20,7 @@ class AdSubjectListViewModel( override fun provideDataSingle(page: Int): Single> = RetrofitManager.getInstance().newApi.getAdGames( mSubjectData.adId, - mapOf("page" to "$page,${LoadParams.DEFAULT_PAGE_SIZE}") + mapOf("page" to "$page,${LoadParams.DEFAULT_PAGE_SIZE}", "code_id" to mSubjectData.codeId) ) override fun mergeResultLiveData() { diff --git a/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt b/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt index b015d62682..a048b96327 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt @@ -84,6 +84,7 @@ open class SubjectActivity : DownloadToolbarActivity() { fun startAdSubjectActivity( context: Context, adId: String, + codeId: String, name: String, adIconActive: Boolean, exposureSourceList: ArrayList? = null, @@ -92,7 +93,14 @@ open class SubjectActivity : DownloadToolbarActivity() { val bundle = Bundle() bundle.putString(EntranceConsts.KEY_ENTRANCE, entrance) val subjectData = - SubjectData(subjectId = "", adId = adId, subjectName = name, isOrder = false, isAdData = adIconActive) + SubjectData( + subjectId = "", + adId = adId, + codeId = codeId, + subjectName = name, + isOrder = false, + isAdData = adIconActive + ) bundle.putParcelable(EntranceConsts.KEY_SUBJECT_DATA, subjectData) bundle.putString(EntranceConsts.KEY_ENTRANCE, entrance) if (exposureSourceList != null) { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 541b9b3adf..ca2430b2d1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -64,87 +64,13 @@ - - - - - - - - - - - + - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/piece_sdk_start_ad_container.xml b/app/src/main/res/layout/piece_sdk_start_ad_container.xml new file mode 100644 index 0000000000..60c3e06f48 --- /dev/null +++ b/app/src/main/res/layout/piece_sdk_start_ad_container.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/piece_start_ad_container.xml b/app/src/main/res/layout/piece_start_ad_container.xml new file mode 100644 index 0000000000..f9e5f20161 --- /dev/null +++ b/app/src/main/res/layout/piece_start_ad_container.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/beizi_startup_ad/src/main/java/com/gh/gamecenter/beiziad/BeiziAdHelper.kt b/feature/beizi_startup_ad/src/main/java/com/gh/gamecenter/beiziad/BeiziAdHelper.kt index 2d77c7ebb3..b9f3f80fc0 100644 --- a/feature/beizi_startup_ad/src/main/java/com/gh/gamecenter/beiziad/BeiziAdHelper.kt +++ b/feature/beizi_startup_ad/src/main/java/com/gh/gamecenter/beiziad/BeiziAdHelper.kt @@ -9,14 +9,12 @@ import com.beizi.fusion.BeiZiCustomController import com.beizi.fusion.BeiZis import com.beizi.fusion.SplashAd import com.gh.gamecenter.common.constant.Constants -import com.gh.gamecenter.core.utils.DisplayUtils import com.gh.gamecenter.core.utils.SPUtils internal object BeiziAdHelper { private const val BEIZI_APP_ID = "21425" private const val BEIZI_START_UP_AD_ID = "105706" - private const val START_UP_AD_TOTAL_TIME = 3000L private val mChannelList = listOf("GH_206", "GH_TEST3", "GH_LOST") @SuppressLint("StaticFieldLeak") @@ -35,6 +33,7 @@ internal object BeiziAdHelper { adsFl: FrameLayout, adViewWidth: Int, adViewHeight: Int, + timeout: Long, callback: (isSuccess: Boolean) -> Unit) { startAdContainer.visibility = View.VISIBLE mSplashAd = SplashAd(startAdContainer.context, null, BEIZI_START_UP_AD_ID, object : AdListener { @@ -68,7 +67,7 @@ internal object BeiziAdHelper { override fun onAdClicked() { // do nothing } - }, START_UP_AD_TOTAL_TIME) + }, timeout) mSplashAd?.loadAd(adViewWidth, adViewHeight) } diff --git a/feature/beizi_startup_ad/src/main/java/com/gh/gamecenter/beiziad/BeiziAdProviderImpl.kt b/feature/beizi_startup_ad/src/main/java/com/gh/gamecenter/beiziad/BeiziAdProviderImpl.kt index 8d7d849738..9d315bded4 100644 --- a/feature/beizi_startup_ad/src/main/java/com/gh/gamecenter/beiziad/BeiziAdProviderImpl.kt +++ b/feature/beizi_startup_ad/src/main/java/com/gh/gamecenter/beiziad/BeiziAdProviderImpl.kt @@ -17,8 +17,9 @@ class BeiziAdProviderImpl : IBeiziAdProvider { adsFl: FrameLayout, adViewWidthInPx: Int, adViewHeightInPx: Int, + timeout: Long, callback: (isSuccess: Boolean) -> Unit) { - BeiziAdHelper.requestSplashAd(startAdContainer, adsFl, adViewWidthInPx, adViewHeightInPx, callback) + BeiziAdHelper.requestSplashAd(startAdContainer, adsFl, adViewWidthInPx, adViewHeightInPx, timeout, callback) } override fun cancelSplashAd(context: Context) { diff --git a/feature/csj_ad/src/main/java/com/gh/gamecenter/csj/CsjAdHelper.kt b/feature/csj_ad/src/main/java/com/gh/gamecenter/csj/CsjAdHelper.kt index cd1592ff2a..a731972d63 100644 --- a/feature/csj_ad/src/main/java/com/gh/gamecenter/csj/CsjAdHelper.kt +++ b/feature/csj_ad/src/main/java/com/gh/gamecenter/csj/CsjAdHelper.kt @@ -102,6 +102,7 @@ object CsjAdHelper { adViewWidthInDp: Float, adViewHeightInDp: Float, startAdContainer: ViewGroup, + timeout: Int, callback: (isSuccess: Boolean) -> Unit, ) { val mTTVfNative = TTVfSdk.getVfManager().createVfNative(activity) @@ -173,7 +174,7 @@ object CsjAdHelper { Utils.log(TAG, "开屏广告渲染失败 $p0") callback.invoke(false) } - }, 3500) + }, timeout) } fun requestFlowAd( diff --git a/feature/csj_ad/src/main/java/com/gh/gamecenter/csj/CsjAdProviderImpl.kt b/feature/csj_ad/src/main/java/com/gh/gamecenter/csj/CsjAdProviderImpl.kt index 7b005e2789..266b7ad436 100644 --- a/feature/csj_ad/src/main/java/com/gh/gamecenter/csj/CsjAdProviderImpl.kt +++ b/feature/csj_ad/src/main/java/com/gh/gamecenter/csj/CsjAdProviderImpl.kt @@ -22,6 +22,7 @@ class CsjAdProviderImpl : ICsjAdProvider { adViewWidthInDp: Float, adViewHeightInDp: Float, startAdContainer: ViewGroup, + timeout: Int, callback: (isSuccess: Boolean) -> Unit, ) { CsjAdHelper.requestSplashAd( @@ -32,6 +33,7 @@ class CsjAdProviderImpl : ICsjAdProvider { adViewWidthInDp, adViewHeightInDp, startAdContainer, + timeout, callback, ) } diff --git a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java index 68584c7b81..a223551257 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java @@ -501,4 +501,8 @@ public class Constants { public static final String SP_SERVERS_CALENDAR_BY_WECHAT = "servers_calendar_by_wechat"; public static final String DOWNLOAD_PAUSE_EXTRA = "download_pause_extra"; + + public static final String SP_LAST_SPLASH_AD_SHOW_TIME = "last_splash_ad_show_time"; + public static final String SP_LAST_DOWNLOAD_MANAGER_AD_SHOW_TIME = "last_download_manager_ad_show_time"; + public static final String SP_LAST_GAME_SEARCH_AD_SHOW_TIME = "last_game_search_ad_show_time"; } diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/IBeiziAdProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/IBeiziAdProvider.kt index 4b4f816ef8..98cef2fc18 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/IBeiziAdProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/IBeiziAdProvider.kt @@ -14,6 +14,7 @@ interface IBeiziAdProvider : IProvider { adsFl: FrameLayout, adViewWidthInPx: Int, adViewHeightInPx: Int, + timeout: Long, callback: (isSuccess: Boolean) -> Unit, ) diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/ICsjAdProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/ICsjAdProvider.kt index 7b75a3173a..39db26edad 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/ICsjAdProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/ICsjAdProvider.kt @@ -18,6 +18,7 @@ interface ICsjAdProvider : IProvider { adViewWidthInDp: Float, adViewHeightInDp: Float, startAdContainer: ViewGroup, + timeout: Int, callback: (isSuccess: Boolean) -> Unit )