From 05b9920f6d08d6b19e48611bae1fa94f8708509d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=99=A8?= Date: Fri, 21 Jun 2024 10:29:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=90=AF=E5=8A=A8=E5=B9=BF=E5=91=8A?= =?UTF-8?q?=E5=9B=BE=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96=E2=80=94=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=20https://jira.shanqu.cc/browse/GHZSCY-5594?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/ad/AdDelegateHelper.kt | 20 ++++++- .../main/java/com/gh/ad/SplashAdVideoView.kt | 56 +++++++++++++++++++ .../java/com/gh/gamecenter/MainActivity.java | 16 ++++-- .../com/gh/gamecenter/SplashAdActivity.kt | 7 ++- .../gh/gamecenter/entity/StartupAdEntity.kt | 27 ++++++++- .../res/layout/layout_splash_ad_video.xml | 21 +++++++ .../res/layout/piece_start_ad_container.xml | 36 +++++++----- app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 9 files changed, 161 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/com/gh/ad/SplashAdVideoView.kt create mode 100644 app/src/main/res/layout/layout_splash_ad_video.xml diff --git a/app/src/main/java/com/gh/ad/AdDelegateHelper.kt b/app/src/main/java/com/gh/ad/AdDelegateHelper.kt index 474dc05755..5471cf0d8a 100644 --- a/app/src/main/java/com/gh/ad/AdDelegateHelper.kt +++ b/app/src/main/java/com/gh/ad/AdDelegateHelper.kt @@ -61,6 +61,9 @@ object AdDelegateHelper { val vGameLaunchAd: AdConfig? get() = mVGameLaunchAd + val splashAdDisplayInterval: Int + get() = mSplashAd?.ownerAd?.startAd?.displayInterval ?: 3 + private const val AD_SDK_CSJ = "穿山甲" const val AD_TYPE_SDK = "third_party_ads" // 第三方 SDK 广告 const val AD_TYPE_OWNER = "owner_ads" // 自有广告 @@ -523,12 +526,15 @@ object AdDelegateHelper { handler: BaseActivity.BaseHandler, hideCallback: () -> Unit ) { - val jumpBtn: View = startAdContainer.findViewById(R.id.jumpBtn) + val jumpBtn = startAdContainer.findViewById(R.id.jumpBtn) val jumpDetailBtn: TextView = startAdContainer.findViewById(R.id.jumpDetailBtn) val adImage: SimpleDraweeView = startAdContainer.findViewById(R.id.adImage) + val adVideo = startAdContainer.findViewById(R.id.ad_video) val icpContainer: View? = startAdContainer.findViewById(R.id.startAdIcpContainer) startAdContainer.visibility = View.VISIBLE icpContainer?.visibility = View.VISIBLE + jumpBtn.text = startAdContainer.context.getString(R.string.splash_jump, splashAdDisplayInterval) + jumpDetailBtn.text = ad.desc jumpDetailBtn.setDrawableEnd( AppCompatResources.getDrawable( @@ -536,7 +542,17 @@ object AdDelegateHelper { R.drawable.ic_startup_ad_arrow ), null, null ) - ImageUtils.display(adImage, ad.img) + + + if (ad.isImageType) { + adImage.visibleIf(true) + adVideo.visibleIf(false) + ImageUtils.display(adImage, ad.img) + } else { + adImage.visibleIf(false) + adVideo.visibleIf(true) + adVideo.startPlay(ad.img, ad.video.url) + } startAdContainer.setOnClickListener { // 拦截点击事件传递 } diff --git a/app/src/main/java/com/gh/ad/SplashAdVideoView.kt b/app/src/main/java/com/gh/ad/SplashAdVideoView.kt new file mode 100644 index 0000000000..a2aedebfcd --- /dev/null +++ b/app/src/main/java/com/gh/ad/SplashAdVideoView.kt @@ -0,0 +1,56 @@ +package com.gh.ad + +import android.content.Context +import android.util.AttributeSet +import com.facebook.drawee.view.SimpleDraweeView +import com.gh.gamecenter.R +import com.gh.gamecenter.common.utils.ImageUtils +import com.gh.gamecenter.video.detail.CustomManager +import com.shuyu.gsyvideoplayer.utils.Debuger +import com.shuyu.gsyvideoplayer.utils.GSYVideoType +import com.shuyu.gsyvideoplayer.utils.GSYVideoType.SCREEN_TYPE_FULL +import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer +import com.shuyu.gsyvideoplayer.video.base.GSYVideoViewBridge + +class SplashAdVideoView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : + StandardGSYVideoPlayer(context, attrs) { + + + fun startPlay(cover: String, url: String) { + Debuger.enable() + GSYVideoType.setShowType(SCREEN_TYPE_FULL) + CustomManager.getCustomManager(getKey()).isNeedMute = true + + setUp(url, false, "") + + val ivCover = findViewById(R.id.thumbImage) + ImageUtils.display(ivCover, cover) + setNeedAutoAdaptation(false) + startPlayLogic() + } + + override fun getGSYVideoManager(): GSYVideoViewBridge { + CustomManager.getCustomManager(getKey()).initContext(context.applicationContext) + return CustomManager.getCustomManager(getKey()) + } + + private fun getKey() = "splash_ad" + + /** + * 覆盖父类方法,防止在是视频 Preparing 阶段封面图被隐藏,导致白屏 + */ + override fun changeUiToPreparingShow() = Unit + + override fun getLayoutId(): Int { + return R.layout.layout_splash_ad_video + } + + fun clearAll() { + GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_DEFAULT) + release() + CustomManager.removeManager(getKey()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 27a86d6758..d586dbe575 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -43,6 +43,7 @@ import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProviders; import com.gh.ad.AdDelegateHelper; +import com.gh.ad.SplashAdVideoView; import com.gh.common.constant.Config; import com.gh.common.filter.RegionSettingHelper; import com.gh.common.history.HistoryDatabase; @@ -128,7 +129,6 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import io.reactivex.SingleSource; @@ -147,7 +147,7 @@ public class MainActivity extends BaseActivity { public static final String SHOW_AD = "show_ad"; public static final int COUNTDOWN_AD = 100; - public static final int COUNTDOWN_MAX_COUNT = 3; + private int mCountdownMaxCount = 3; private int mCountdownCount = 0; private static final String CURRENT_PAGE = "current_page"; @@ -507,6 +507,7 @@ public class MainActivity extends BaseActivity { float screenHeightInDp = DisplayUtils.px2dip(this, screenHeightInPx); if (startAdContainer != null && sdkStartAdContainer != null && adsFl != null) { + mCountdownMaxCount = AdDelegateHelper.INSTANCE.getSplashAdDisplayInterval(); AdDelegateHelper.requestSplashAd( this, screenWidthInPx, @@ -536,7 +537,7 @@ public class MainActivity extends BaseActivity { super.handleMessage(msg); if (msg.what == COUNTDOWN_AD) { mCountdownCount++; - if (COUNTDOWN_MAX_COUNT < mCountdownCount) { + if (mCountdownMaxCount < mCountdownCount) { AdDelegateHelper.INSTANCE.setShowingSplashAd(false); hideSplashAd(); @@ -556,7 +557,7 @@ public class MainActivity extends BaseActivity { } } else { TextView jumpBtn = findViewById(R.id.jumpBtn); - jumpBtn.setText(String.format(Locale.CHINA, "跳过 %d", COUNTDOWN_MAX_COUNT - mCountdownCount)); + jumpBtn.setText(getString(R.string.splash_jump, mCountdownMaxCount - mCountdownCount)); Message newMsg = Message.obtain(); newMsg.what = COUNTDOWN_AD; newMsg.obj = msg.obj; @@ -584,6 +585,11 @@ public class MainActivity extends BaseActivity { getIntent().putExtra(SHOW_AD, false); View startAdContainer = findViewById(R.id.startAdContainer); if (startAdContainer != null) { + // 如果有播放开屏视频广告,需要及时释放 + SplashAdVideoView adVideoView = startAdContainer.findViewById(R.id.ad_video); + if (adVideoView != null) { + adVideoView.clearAll(); + } startAdContainer.setVisibility(View.GONE); ExtensionsKt.removeFromParent(startAdContainer, true); } @@ -799,7 +805,7 @@ public class MainActivity extends BaseActivity { public void onFailure(@Nullable HttpException e) { super.onFailure(e); try { - ErrorHelper.handleErrorWithCustomizedHandler(MainActivity.this, e.response().errorBody().string(), false, "", "", "内容实名", null, null, code -> { + ErrorHelper.handleErrorWithCustomizedHandler(MainActivity.this, e.response().errorBody().string(), false, "", "", "内容实名", null, null, code -> { if (code == 404001) { if (mShouldShowAd) { AppExecutor.getUiExecutor().executeWithDelay(() -> { diff --git a/app/src/main/java/com/gh/gamecenter/SplashAdActivity.kt b/app/src/main/java/com/gh/gamecenter/SplashAdActivity.kt index d42bc2bc59..73dd151430 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashAdActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/SplashAdActivity.kt @@ -83,19 +83,20 @@ class SplashAdActivity : BaseActivity() { super.handleMessage(msg) if (msg.what == MainActivity.COUNTDOWN_AD) { mCountdownCount++ - if (MainActivity.COUNTDOWN_MAX_COUNT < mCountdownCount) { + if (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) + jumpBtn.text = getString(R.string.splash_jump, COUNTDOWN_MAX_COUNT - mCountdownCount) mBaseHandler.sendEmptyMessageDelayed(MainActivity.COUNTDOWN_AD, 1000) } } } companion object { + private const val COUNTDOWN_MAX_COUNT = 3 + @JvmStatic fun getIntent(context: Context): Intent { return Intent(context, SplashAdActivity::class.java) diff --git a/app/src/main/java/com/gh/gamecenter/entity/StartupAdEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/StartupAdEntity.kt index 56a2f38a3f..62fd62c15c 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/StartupAdEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/StartupAdEntity.kt @@ -13,7 +13,32 @@ class StartupAdEntity( val img: String = "", // 显示规则: none无, each每一次打开, everyday每一天一次, once一次 val rule: String = "", - val time: TimeEntity? = null + val time: TimeEntity? = null, + @SerializedName("type") + private val _type: String? = null, + @SerializedName("video") + private val _video: VideoEntity? = null, + @SerializedName("display_interval") + private val _displayInterval: Int? = null ) { + + // 默认为图片 + val type: String + get() = _type ?: AD_TYPE_IMG + + val isImageType: Boolean + get() = type == AD_TYPE_IMG + + val video: VideoEntity + get() = _video ?: VideoEntity() + + // 默认时长为 5s + val displayInterval: Int + get() = _displayInterval ?: 5 + class TimeEntity(val start: Long = 0, val end: Long = 0) + + companion object { + private const val AD_TYPE_IMG = "displayInterval" + } } \ No newline at end of file diff --git a/app/src/main/res/layout/layout_splash_ad_video.xml b/app/src/main/res/layout/layout_splash_ad_video.xml new file mode 100644 index 0000000000..cfc7d84ecb --- /dev/null +++ b/app/src/main/res/layout/layout_splash_ad_video.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 index f9e5f20161..0f392f847a 100644 --- a/app/src/main/res/layout/piece_start_ad_container.xml +++ b/app/src/main/res/layout/piece_start_ad_container.xml @@ -1,30 +1,38 @@ + android:visibility="gone" + tools:visibility="visible"> + + + app:layout_constraintBottom_toTopOf="@id/startAdIcpContainer" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:textSize="@dimen/secondary_size" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:visibility="gone" + app:layout_constraintBottom_toTopOf="@id/startAdIcpContainer" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + tools:visibility="visible" /> 個人主頁 來自光環助手(最強卡牌神器) 立即玩 + 跳過 %1$d diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0950b952d1..06a83777fa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -571,4 +571,5 @@ 个人主页 来自光环助手(最强卡牌神器) 立即玩 + 跳过 %1$d