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
)