From e5161ae350fdbb8d383a7e2a311abe314fa55535 Mon Sep 17 00:00:00 2001 From: yangfei Date: Tue, 25 Mar 2025 17:22:58 +0800 Subject: [PATCH 01/21] =?UTF-8?q?Revert=20"fix:=20"=E7=82=B9"=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7=E8=AE=BE=E7=BD=AE=E9=A2=9C=E8=89=B2"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 2ba39188f790dd60dd472e7bc6e7485e2533826e. --- app/src/main/res/layout/fragment_real_name.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_real_name.xml b/app/src/main/res/layout/fragment_real_name.xml index 2ddb13dab6..0026f9c1d1 100644 --- a/app/src/main/res/layout/fragment_real_name.xml +++ b/app/src/main/res/layout/fragment_real_name.xml @@ -133,7 +133,6 @@ android:gravity="center" android:text="@string/realname_dot_indicator" android:textSize="14sp" - android:textColor="@color/text_secondary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/nameEt" /> From b1b231a309f53210f1599c267747efe01993256a Mon Sep 17 00:00:00 2001 From: yangfei Date: Tue, 25 Mar 2025 17:23:29 +0800 Subject: [PATCH 02/21] =?UTF-8?q?Revert=20"feat:=20=E3=80=90=E5=85=89?= =?UTF-8?q?=E7=8E=AF=E5=8A=A9=E6=89=8B=E3=80=91=E5=AE=9E=E5=90=8D=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=E7=89=B9=E6=AE=8A=E5=AD=97=E7=AC=A6=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20https://jira.shanqu.cc/browse/GHZSCY-7702"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit cc05dabb93c2e86089b0e882165553e4c43181b4. --- .../fragment/user/RealNameInfoFragment.kt | 10 ++++----- .../res/drawable/bg_stroke_fa_radius_2.xml | 6 ----- .../main/res/layout/fragment_real_name.xml | 22 ++++--------------- app/src/main/res/values-zh-rTW/strings.xml | 3 --- app/src/main/res/values/strings.xml | 5 +---- 5 files changed, 9 insertions(+), 37 deletions(-) delete mode 100644 app/src/main/res/drawable/bg_stroke_fa_radius_2.xml diff --git a/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt b/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt index b02b3075b6..349dec4453 100644 --- a/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt +++ b/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt @@ -106,7 +106,8 @@ class RealNameInfoFragment : ToolbarFragment() { } private fun initEditingView() { - val bodyString = getText(R.string.realname_body_tv) + val bodyString = + "为响应《国家新闻出版署关于防止未成年沉迷网络游戏的通知》,请认真填写您的身份信息。您提供的证件信息将受到严格保护,仅用于用户实名制认证,不会用作其他用途,请放心填写。前往了解更多信息>>" mBinding.bodyTv.text = SpanBuilder(bodyString) .click( @@ -124,13 +125,13 @@ class RealNameInfoFragment : ToolbarFragment() { .build() mBinding.bodyTv.movementMethod = CustomLinkMovementMethod.getInstance() - val hintString = getText(R.string.realname_hint_tv) + val hintString = "特别说明:由于部分用户之前的实名信息不正确或认证失败,可能需要重新认证,请提交真实的信息进行认证即可。部分游戏仅对成年用户进行开放" mBinding.hintTv.text = SpanBuilder(hintString) .bold(0, 5) .build() - val manualHintString = getText(R.string.realname_manual_hint_tv) + val manualHintString = "若您提交的真实身份信息未通过认证或者您持有的为港澳台\\国外身份证件,可转交人工审核" mBinding.manualHintTv.text = SpanBuilder(manualHintString) .click( @@ -160,9 +161,6 @@ class RealNameInfoFragment : ToolbarFragment() { mBinding.nameEt.doOnTextChanged { _, _, _, _ -> updateSubmitBtn() } - mBinding.textDotIndicator.setOnClickListener { - mBinding.nameEt.text.insert(mBinding.nameEt.selectionStart, "\u00B7") - } mBinding.idCardEt.doOnTextChanged { _, _, _, _ -> updateSubmitBtn() } diff --git a/app/src/main/res/drawable/bg_stroke_fa_radius_2.xml b/app/src/main/res/drawable/bg_stroke_fa_radius_2.xml deleted file mode 100644 index 83ec08737e..0000000000 --- a/app/src/main/res/drawable/bg_stroke_fa_radius_2.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_real_name.xml b/app/src/main/res/layout/fragment_real_name.xml index 0026f9c1d1..efe76997f6 100644 --- a/app/src/main/res/layout/fragment_real_name.xml +++ b/app/src/main/res/layout/fragment_real_name.xml @@ -34,7 +34,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - tools:text="@string/realname_body_tv" /> + tools:text="为响应《国家新闻出版署关于防止未成年沉迷网络游戏的通知》,请认真填写您的身份信息。您提供的证件信息将受到严格保护,仅用于用户实名制认证,不会用作其他用途,请放心填写。前往了解更多信息>>" /> + tools:text="特别说明:由于部分用户之前的实名信息不正确或认证失败,可能需要重新认证,请提交真实的信息进行认证即可。部分游戏仅对成年用户进行开放" /> - - + tools:text="若您提交的真实身份信息未通过认证或者您持有的为港澳台\国外身份证件,可转交人工审核" /> 當前認証狀態:未成年 實名信息認証中... 認証期間不影響您正常的遊戲體驗 - 爲響應《國家新聞出版署關於防止未成年沉迷網絡遊戲的通知》,請認真填冩您的身份信息。您提供的証件信息將受到嚴格保護,僅用於用戶實名製認証,不會用作其他用途,請放心填冩。前往了解更多信息>> - 特別説明:由於部分用戶之前的實名信息不正確或認証失敗,可能需要重新認証,請提交真實的信息進行認証即可。部分遊戲僅對成年用戶進行開放。(特殊字符“·”可通過快捷鍵進行添加) - 若您提交的真實身份信息未通過認証或者您持有的爲港澳颱\國外身份証件,可轉交人工審核 設置偏好]]> ,讓推薦更懂你的心~ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e0f2b45658..b9f6827d72 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -412,10 +412,7 @@ 当前认证状态:未成年 实名信息认证中... 部分游戏在认证期间无法进行下载 - 为响应《国家新闻出版署关于防止未成年沉迷网络游戏的通知》,请认真填写您的身份信息。您提供的证件信息将受到严格保护,仅用于用户实名制认证,不会用作其他用途,请放心填写。前往了解更多信息>> - 特别说明:由于部分用户之前的实名信息不正确或认证失败,可能需要重新认证,请提交真实的信息进行认证即可。部分游戏仅对成年用户进行开放。(特殊字符“·”可通过快捷键进行添加) - 若您提交的真实身份信息未通过认证或者您持有的为港澳台\国外身份证件,可转交人工审核 - + 设置偏好]]> ,让推荐更懂你的心~ From 06f932af1493d6807ce60cde1b6e196c03776f75 Mon Sep 17 00:00:00 2001 From: yangfei Date: Tue, 25 Mar 2025 17:29:13 +0800 Subject: [PATCH 03/21] =?UTF-8?q?Revert=20=E7=95=85=E7=8E=A9=E5=AE=9E?= =?UTF-8?q?=E5=90=8D=E8=AE=A4=E8=AF=81=E7=89=B9=E6=AE=8A=E5=AD=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vasdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vasdk b/vasdk index 932474708c..2ee1c3d532 160000 --- a/vasdk +++ b/vasdk @@ -1 +1 @@ -Subproject commit 932474708cdb6f620ea713c34ae905bf8e708dd4 +Subproject commit 2ee1c3d5328fc2e5066429cd3f2f359a6611b771 From 3ffe4f9bc6255e24a7e4492e17402865abb4551f Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Fri, 28 Mar 2025 17:05:59 +0800 Subject: [PATCH 04/21] =?UTF-8?q?fix:=20=E5=B0=9D=E8=AF=95=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=B7=AF=E7=94=B1=E5=BC=82=E6=AD=A5=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=AF=BC=E8=87=B4=E7=9A=84=E9=97=AA=E9=80=80=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/common/utils/EnvHelper.kt | 6 +++--- .../java/com/gh/gamecenter/common/utils/Extensions.kt | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/EnvHelper.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/EnvHelper.kt index 7a4c934a13..767c9368d2 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/EnvHelper.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/EnvHelper.kt @@ -44,7 +44,7 @@ object EnvHelper { fun getHost(): String { val buildConfig = TheRouter.get(IBuildConfigProvider::class.java) return if (!PackageFlavorHelper.IS_TEST_FLAVOR) { - buildConfig?.getApiHost() ?: "" + buildConfig?.getApiHost() ?: "https://and-api.ghzs6.com/v5d5d0/" } else { if (isDevEnv) { buildConfig?.getDevApiHost() ?: "" @@ -58,7 +58,7 @@ object EnvHelper { fun getVHost(): String { val buildConfig = TheRouter.get(IBuildConfigProvider::class.java) return if (!PackageFlavorHelper.IS_TEST_FLAVOR) { - buildConfig?.getVDevApiHost() ?: "" + buildConfig?.getVApiHost() ?: "https://app-api.796697.com" } else { if (isDevEnv) { buildConfig?.getVDevApiHost() ?: "" @@ -72,7 +72,7 @@ object EnvHelper { fun getNewHost(): String { val buildConfig = TheRouter.get(IBuildConfigProvider::class.java) return if (!PackageFlavorHelper.IS_TEST_FLAVOR) { - buildConfig?.getNewApiHost() ?: "" + buildConfig?.getNewApiHost() ?: "https://app-api.ghzs6.com/" } else { if (isDevEnv) { buildConfig?.getNewDevApiHost() ?: "" diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt index 94b15a5361..1356373384 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt @@ -1179,10 +1179,15 @@ fun DownloadEntity.putGameCategory(gameCategory: String) { inline fun doOnMainProcessOnly(f: () -> Unit) { val buildConfig = TheRouter.get(IBuildConfigProvider::class.java) - val packageUtilsConfig = TheRouter.get(IPackageUtilsProvider::class.java) - val processName = packageUtilsConfig?.obtainProcessName() + val processName = ProcessUtil.getCurrentProcessName() + var applicationId = buildConfig?.getApplicationId() - if (processName == null || buildConfig?.getApplicationId() == processName) { + // buildConfig 为空的兜底方案,至于你说为什么会为空,我也不知道 + if (applicationId.isNullOrEmpty()) { + applicationId = HaloApp.getInstance().packageName ?: "com.gh.gamecenter" + } + + if (processName == null || applicationId == processName) { f.invoke() } else { tryWithDefaultCatch { From ebcfd9c85d53bc145f25aa3478f123bf45eed5c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Mon, 31 Mar 2025 11:27:16 +0800 Subject: [PATCH 05/21] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E8=AF=A6=E6=83=85=E9=A1=B5=E5=81=B6=E5=8F=91=E7=A9=BA?= =?UTF-8?q?=E6=8C=87=E9=92=88=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98=20https:?= =?UTF-8?q?//sentry.shanqu.cc/organizations/lightgame/issues/443716/=3Fpro?= =?UTF-8?q?ject=3D22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/viewholder/GameDetailBriefItemViewHolder.kt | 2 +- .../viewholder/GameDetailComprehensivePanelItemViewHolder.kt | 2 ++ .../detail/viewholder/GameDetailDeveloperWordItemViewHolder.kt | 2 +- .../detail/viewholder/GameDetailUpdateItemViewHolder.kt | 2 +- .../gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailBriefItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailBriefItemViewHolder.kt index 2ebfa0b7de..df9de3ce31 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailBriefItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailBriefItemViewHolder.kt @@ -46,7 +46,7 @@ class GameDetailBriefItemViewHolder( highlightedTextClickListener = TextHelper.CopyToClipboardHighlightedTextClick() ) briefTv.post { - expandTv.isVisible = briefTv.lineCount == 3 && briefTv.layout.getEllipsisCount(2) > 0 + expandTv.isVisible = briefTv.lineCount == 3 && (briefTv.layout?.getEllipsisCount(2) ?: 0) > 0 } expandTv.setOnClickListener { SensorsBridge.trackGameDetailModuleClick( diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailComprehensivePanelItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailComprehensivePanelItemViewHolder.kt index 5de1a6c4e6..0e317a24b9 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailComprehensivePanelItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailComprehensivePanelItemViewHolder.kt @@ -194,6 +194,8 @@ class GameDetailComprehensivePanelItemViewHolder( maxLines = if (parentViewHolder.showPart && !parentViewHolder.isExpand) 1 else Int.MAX_VALUE text = data.text post { + if (layout == null) return@post + val hasEllipsize = layout.getEllipsisCount(0) > 0 if (parentViewHolder.showPart && hasEllipsize && !parentViewHolder.binding.expandTv.isVisible) { parentViewHolder.binding.expandTv.isVisible = true diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailDeveloperWordItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailDeveloperWordItemViewHolder.kt index d2e7f3d719..1359a90fce 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailDeveloperWordItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailDeveloperWordItemViewHolder.kt @@ -27,7 +27,7 @@ class GameDetailDeveloperWordItemViewHolder( .fromHtmlCompat(PicassoImageGetter(contentTv), ExtraTagHandler()) ) contentTv.post { - expandTv.isVisible = (contentTv.lineCount == 3 && contentTv.layout.getEllipsisCount(2) > 0) || contentTv.lineCount > 3 + expandTv.isVisible = (contentTv.lineCount == 3 && (contentTv.layout?.getEllipsisCount(2) ?: 0) > 0) || contentTv.lineCount > 3 } expandTv.background = R.drawable.bg_ui_surface_expand_gradient.toDrawable(context) expandTv.setTextColor(com.gh.gamecenter.common.R.color.text_theme.toColor(context)) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailUpdateItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailUpdateItemViewHolder.kt index 687e31b0d4..3296a0cbde 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailUpdateItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailUpdateItemViewHolder.kt @@ -36,7 +36,7 @@ class GameDetailUpdateItemViewHolder( } contentTv.text = entity.updateDes contentTv.post { - expandTv.isVisible = contentTv.lineCount == 3 && contentTv.layout.getEllipsisCount(2) > 0 + expandTv.isVisible = contentTv.lineCount == 3 && (contentTv.layout?.getEllipsisCount(2) ?: 0) > 0 } expandTv.background = R.drawable.bg_ui_surface_expand_gradient.toDrawable(context) expandTv.setTextColor(com.gh.gamecenter.common.R.color.text_theme.toColor(context)) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt index f67ba7d92d..32a5f3ce16 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt @@ -63,7 +63,7 @@ class HistoryApkListAdapter( holder.binding.expandTv.setTextColor(com.gh.gamecenter.common.R.color.text_theme.toColor(mContext)) holder.binding.updateDescTv.text = apkEntity.updateDesc holder.binding.updateDescTv.post { - holder.binding.expandTv.isVisible = holder.binding.updateDescTv.lineCount == 3 && holder.binding.updateDescTv.layout.getEllipsisCount(2) > 0 + holder.binding.expandTv.isVisible = holder.binding.updateDescTv.lineCount == 3 && (holder.binding.updateDescTv.layout?.getEllipsisCount(2) ?: 0) > 0 } holder.binding.versionTv.text = "版本${apkEntity.version}" holder.binding.releaseDateTv.text = TimeUtils.getFormatTime(apkEntity.updateTime) From 7844800b0e64903e97a9a836d9b6da35969c9420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Mon, 31 Mar 2025 11:34:43 +0800 Subject: [PATCH 06/21] =?UTF-8?q?fix:=20=E7=A6=81=E7=94=A8RecyclerView?= =?UTF-8?q?=E5=8A=A8=E7=94=BB=E6=95=88=E6=9E=9C=E9=81=BF=E5=85=8D=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E9=97=AA=E9=80=80=20https://sentry.shanqu.cc/organiza?= =?UTF-8?q?tions/lightgame/issues/441824/=3Fproject=3D22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt index d028fbb246..cc4b65c816 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt @@ -307,7 +307,7 @@ class GameDetailFragment : LazyFragment(), IScrollable { private fun initDetailRv() { binding.detailRv.run { - (itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false + itemAnimator = null layoutManager = detailLayoutManager adapter = detailListAdapter addOnScrollListener(object : OnScrollListener() { From 1c3dbce08d43d79599c13c6d26384963cc0143cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=99=A8?= Date: Mon, 31 Mar 2025 11:39:28 +0800 Subject: [PATCH 07/21] =?UTF-8?q?feat:=E6=9B=B4=E6=96=B0=E5=A5=87=E6=B8=B8?= =?UTF-8?q?=E5=8A=A0=E9=80=9F=E5=99=A8sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IAcceleratorDataHolderProviderImpl.kt | 5 +++ .../StartingAcceleratorViewModel.kt | 7 ++-- dependencies.gradle | 2 +- .../provider/AcceleratorProviderImpl.kt | 37 +++++++++++++------ .../IAcceleratorDataHolderProvider.kt | 2 + 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt b/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt index 5f97615f0e..0bfd24fd82 100644 --- a/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt +++ b/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt @@ -1,5 +1,6 @@ package com.gh.common.provider +import com.gh.common.util.PackageUtils import com.gh.gamecenter.core.provider.IAcceleratorDataHolderProvider import com.gh.gamecenter.feature.entity.VipEntity import com.halo.assistant.accelerator.repository.AcceleratorDataHolder @@ -20,6 +21,10 @@ class IAcceleratorDataHolderProviderImpl : IAcceleratorDataHolderProvider { return AcceleratorDataHolder.instance.initResults } + override fun getGhVersionName(): String { + return PackageUtils.getGhVersionName() + } + override fun clear() { AcceleratorDataHolder.instance.clear() } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/StartingAcceleratorViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/StartingAcceleratorViewModel.kt index df20247058..227ccd252c 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/StartingAcceleratorViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/StartingAcceleratorViewModel.kt @@ -21,13 +21,14 @@ class StartingAcceleratorViewModel : ViewModel() { val useCase = AccelerationUseCase() - private val _restartingAcceleratorAction = MutableLiveData>() - val restartingAcceleratorAction: LiveData> = _restartingAcceleratorAction + private val _restartingAcceleratorAction = MutableLiveData>() + val restartingAcceleratorAction: LiveData> = _restartingAcceleratorAction fun loadAcceleratorToken() { val userId = UserManager.getInstance().userId if (userId.isNotBlank()) { UserRepository.getInstance().setAcceleratorToken(userId) { - _restartingAcceleratorAction.value = Event(it) + // 这里就算setToken失败,也要调用启动加速,失败会走正常的日志上报 + _restartingAcceleratorAction.value = Event(Unit) } } } diff --git a/dependencies.gradle b/dependencies.gradle index 6da08de9af..bf261f30aa 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -150,7 +150,7 @@ ext { xcrashVersion = "3.1.0" aliPayVersion = "15.8.17" - acceleratorVersion = "1.0.1" + acceleratorVersion = "2.0.2" } apply from: 'dependencies_vasdk.gradle' diff --git a/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt b/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt index 09dda99664..4c7dfd6175 100644 --- a/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt +++ b/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt @@ -1,6 +1,8 @@ package com.gh.gamecenter.accelerator.provider import android.app.Application +import com.gh.gamecenter.common.utils.EnvHelper +import com.gh.gamecenter.core.HaloApp import com.gh.gamecenter.core.callback.AccelerateState import com.gh.gamecenter.core.callback.OnAccelerateListener import com.gh.gamecenter.core.provider.IAcceleratorDataHolderProvider @@ -105,16 +107,29 @@ class AcceleratorProviderImpl : IAcceleratorProvider { // 避免外部多次设置相同的token return } - QyAccelerator.getInstance().setQyUserToken(token, setResultCallback = { isSuccess, errMsg -> - Utils.log(LOG_TAG, "setQyUserToken:$token --isSuccess:$isSuccess --errMsg:$errMsg") - if (isSuccess) { - _token = token - } else { - // 将setToken错误事件上报的sentry,便于后期分析原因 - SentryHelper.onEventInAllChannel(SENTRY_EVENT_ID, KEY_SET_TOKEN_ERROR_MESSAGE, errMsg) - } - callback?.invoke(isSuccess) - }) + fun setToken() { + QyAccelerator.getInstance().setQyUserToken(token, setResultCallback = { isSuccess, errMsg -> + Utils.log(LOG_TAG, "setQyUserToken:$token --isSuccess:$isSuccess --errMsg:$errMsg") + if (isSuccess) { + _token = token + } else { + // 将setToken错误事件上报的sentry,便于后期分析原因 + SentryHelper.onEventInAllChannel(SENTRY_EVENT_ID, KEY_SET_TOKEN_ERROR_MESSAGE, errMsg) + } + callback?.invoke(isSuccess) + }) + + } + if (QyAccelerator.getInstance().checkApplicationContextIsInit()) { + setToken() + } else { + // 初始化失败,再次初始化之后在setToken + val ghVersionName = TheRouter.get(IAcceleratorDataHolderProvider::class.java)?.getGhVersionName() ?: "" + init(EnvHelper.isDevEnv, HaloApp.getInstance(), ghVersionName) + // 不管初始化成功还是失败,都需要再次setToken,如果失败,正常上报失败日志 + setToken() + } + } override fun deleteQyUserToken(): Boolean { @@ -173,8 +188,6 @@ class AcceleratorProviderImpl : IAcceleratorProvider { private const val LOG_TAG = "AcceleratorProviderImpl" private const val SENTRY_EVENT_ID = "ACCELERATOR_SET_TOKEN_ERROR" private const val KEY_SET_TOKEN_ERROR_MESSAGE = "set_token_error" - private const val KEY_ACC_FAILURE_ERROR = "key_acc_failure_error" - } } \ No newline at end of file diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt index 8af5b1b0e0..41eb2e9f65 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt @@ -8,5 +8,7 @@ interface IAcceleratorDataHolderProvider { fun getInitFunResults(): List + fun getGhVersionName(): String + fun clear() } \ No newline at end of file From b6ec74d789bf06f64bf452b3f28c74095ab9da22 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Mon, 31 Mar 2025 14:31:26 +0800 Subject: [PATCH 08/21] =?UTF-8?q?chore:=20=E7=89=88=E6=9C=AC=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=8F=AA=205.40.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index bf261f30aa..c0777f6c99 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 30 // 升级targetSdkVersion到 34 时需要根据官方文档补全前台服务的权限类型。比如 NDownloadService,KeepAliveService // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 1150 - versionName = "5.40.0" + versionCode = 1151 + versionName = "5.40.1" applicationId = "com.gh.gamecenter" applicationIdGat = "com.gh.gamecenter.intl" From ec29d94fb706e77c01e3a0d330b4dd204d144f0c Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Tue, 1 Apr 2025 14:44:46 +0800 Subject: [PATCH 09/21] =?UTF-8?q?fix:=20=E4=BA=91=E5=AD=98=E6=A1=A3?= =?UTF-8?q?=E5=BC=95=E5=AF=BC=E6=B8=B8=E6=88=8F=E4=B8=8B=E8=BD=BD=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20https://jira.shanqu.cc/browse/GHZSCY-7796?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/gamedetail/GameDetailWrapperFragment.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailWrapperFragment.kt index 011c5536b5..fbfa9f0bc9 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailWrapperFragment.kt @@ -45,6 +45,7 @@ import com.gh.gamecenter.common.base.fragment.BaseLazyFragment import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.entity.LinkEntity +import com.gh.gamecenter.common.eventbus.EBReuse import com.gh.gamecenter.common.exposure.ExposureSource import com.gh.gamecenter.common.json.json import com.gh.gamecenter.common.mvvm.Status @@ -1111,6 +1112,13 @@ class GameDetailWrapperFragment : BaseLazyFragment(), IScrollable { return true } + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(reuse: EBReuse) { + if ("download" == reuse.type) { + downloadBinding.detailProgressbar.performClick() + } + } + @Subscribe(threadMode = ThreadMode.MAIN) fun onEventMainThread(status: EBDownloadStatus) { updateDownloadCountHint(packageViewModel.filterSameUpdateLiveData.value) From 6610c4393776f3e0a21d02736464a8f888e9ef1e Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Tue, 1 Apr 2025 17:38:19 +0800 Subject: [PATCH 10/21] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=81=AB?= =?UTF-8?q?=E5=B1=B1=E4=BA=91=E4=B8=8A=E4=BC=A0=20SDK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index c0777f6c99..6b7b77abda 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -100,7 +100,7 @@ ext { skeleton = "1.1.5" mta = "6.8.0" romChecker = "1.0.3" - oss = "2.6.0" + oss = "2.8.8" desugarJdkLibs = "1.1.5" toolargetool = "0.3.0" chart = "3.1.0" From e624f34de1a89823efe26272d55cbb17d6027983 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Wed, 2 Apr 2025 10:29:56 +0800 Subject: [PATCH 11/21] =?UTF-8?q?fix:=20=E7=A6=81=E7=94=A8=E7=81=AB?= =?UTF-8?q?=E5=B1=B1=E4=BA=91=E4=B8=8A=E4=BC=A0=E5=88=86=E7=89=87=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/video/upload/UploadThread.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/UploadThread.kt b/app/src/main/java/com/gh/gamecenter/video/upload/UploadThread.kt index 54ff09e4f7..ea7e62569b 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/UploadThread.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/UploadThread.kt @@ -52,7 +52,7 @@ class UploadThread( .setCancelHook(true) .setCheckpointFile(recordDirectory) .setPartSize(10 * 1024 * 1024) - .setTaskNum(2) + .setTaskNum(1) .setDataTransferListener { Utils.log( "OssUpload", @@ -74,9 +74,9 @@ class UploadThread( mUploadInput = this } val config = TransportConfig.builder() - .readTimeoutMills(15 * 1000) - .writeTimeoutMills(15 * 1000) - .connectTimeoutMills(15 * 1000) + .readTimeoutMills(5 * 1000) + .writeTimeoutMills(5 * 1000) + .connectTimeoutMills(5 * 1000) .maxRetryCount(2) .build() From 38bab9cf4f4ff4bb9bccec675636d2db0dfc73e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=99=A8?= Date: Wed, 9 Apr 2025 11:13:30 +0800 Subject: [PATCH 12/21] =?UTF-8?q?feat:=E5=B0=86=E5=A5=87=E6=B8=B8=E5=8A=A0?= =?UTF-8?q?=E9=80=9F=E5=99=A8=20setToken=20=E9=94=99=E8=AF=AF=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E4=BB=8Esentry=E8=BD=AC=E7=A7=BB=E5=88=B0=E7=81=AB?= =?UTF-8?q?=E5=B1=B1=E4=BA=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IAcceleratorDataHolderProviderImpl.kt | 8 -------- .../repository/AcceleratorDataHolder.kt | 8 -------- .../provider/AcceleratorProviderImpl.kt | 13 +++++++------ .../src/main/java/com/lg/SentryProviderImpl.kt | 18 +----------------- .../provider/IAcceleratorDataHolderProvider.kt | 4 ---- .../feature/utils/NewFlatLogUtils.kt | 12 ++++++++++++ 6 files changed, 20 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt b/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt index 0bfd24fd82..c53aaa010a 100644 --- a/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt +++ b/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt @@ -13,14 +13,6 @@ class IAcceleratorDataHolderProviderImpl : IAcceleratorDataHolderProvider { } } - override fun addInitFunResult(result: String) { - AcceleratorDataHolder.instance.addInitFunResult(result) - } - - override fun getInitFunResults(): List { - return AcceleratorDataHolder.instance.initResults - } - override fun getGhVersionName(): String { return PackageUtils.getGhVersionName() } diff --git a/app/src/main/java/com/halo/assistant/accelerator/repository/AcceleratorDataHolder.kt b/app/src/main/java/com/halo/assistant/accelerator/repository/AcceleratorDataHolder.kt index ea774b829d..f2b2f3acda 100644 --- a/app/src/main/java/com/halo/assistant/accelerator/repository/AcceleratorDataHolder.kt +++ b/app/src/main/java/com/halo/assistant/accelerator/repository/AcceleratorDataHolder.kt @@ -20,14 +20,6 @@ class AcceleratorDataHolder { private val listeners = mutableSetOf() - private val _initResults = arrayListOf() - val initResults: List - get() = _initResults - - fun addInitFunResult(result: String) { - _initResults.add(result) - } - private var _hasAcctGameInfoInLocal = false val hasAcctGameInfoInLocal: Boolean get() = _hasAcctGameInfoInLocal diff --git a/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt b/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt index 4c7dfd6175..e790bdb42e 100644 --- a/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt +++ b/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt @@ -8,6 +8,7 @@ import com.gh.gamecenter.core.callback.OnAccelerateListener import com.gh.gamecenter.core.provider.IAcceleratorDataHolderProvider import com.gh.gamecenter.core.provider.IAcceleratorProvider import com.gh.gamecenter.feature.entity.AcctGameInfo +import com.gh.gamecenter.feature.utils.NewFlatLogUtils import com.gh.gamecenter.feature.utils.SentryHelper import com.lightgame.utils.Utils import com.qeeyou.qyvpn.QyAccelerator @@ -25,6 +26,8 @@ import java.io.File class AcceleratorProviderImpl : IAcceleratorProvider { private var _token = "" + private val initResults = arrayListOf() + // 根据包名回调 private val listeners = hashMapOf() @@ -93,8 +96,7 @@ class AcceleratorProviderImpl : IAcceleratorProvider { override fun onExecLifecycleInitFun(isEnter: Boolean) { super.onExecLifecycleInitFun(isEnter) Utils.log(LOG_TAG, "onExecLifecycleInitFun:$isEnter") - TheRouter.get(IAcceleratorDataHolderProvider::class.java) - ?.addInitFunResult("onExecLifecycleInitFun:$isEnter") + initResults.add("onExecLifecycleInitFun:$isEnter") } }) QyAccelerator.getInstance().bindQyAccRelatedListener(qyListener) @@ -113,8 +115,8 @@ class AcceleratorProviderImpl : IAcceleratorProvider { if (isSuccess) { _token = token } else { - // 将setToken错误事件上报的sentry,便于后期分析原因 - SentryHelper.onEventInAllChannel(SENTRY_EVENT_ID, KEY_SET_TOKEN_ERROR_MESSAGE, errMsg) + // 将setToken错误事件上报的火山云,便于后期分析原因 + NewFlatLogUtils.logAcceleratorSetTokenError(initResults, errMsg ?: "") } callback?.invoke(isSuccess) }) @@ -142,6 +144,7 @@ class AcceleratorProviderImpl : IAcceleratorProvider { _token = "" listeners.clear() allListener.clear() + initResults.clear() return isDeleted } @@ -186,8 +189,6 @@ class AcceleratorProviderImpl : IAcceleratorProvider { companion object { private const val LOG_TAG = "AcceleratorProviderImpl" - private const val SENTRY_EVENT_ID = "ACCELERATOR_SET_TOKEN_ERROR" - private const val KEY_SET_TOKEN_ERROR_MESSAGE = "set_token_error" } } \ No newline at end of file diff --git a/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt b/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt index 6419d473af..8960c0d7a4 100644 --- a/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt +++ b/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt @@ -131,23 +131,7 @@ class SentryProviderImpl : ISentryProvider { } Utils.log("Sentry", "$eventId + [${kv.joinToString(" , ")}]") - Sentry.captureEvent(sentryEvent) { - // 添加Breadcrumb - it.addBreadcrumb(Breadcrumb().apply { - type = "initSdk" - category = "Init" - this.message = "init qiyou sdk" - level = SentryLevel.INFO - - val iAcceleratorDataHolderProvider = TheRouter.get(IAcceleratorDataHolderProvider::class.java) - if (iAcceleratorDataHolderProvider != null) { - val initFunResults = iAcceleratorDataHolderProvider.getInitFunResults() - initFunResults.forEachIndexed { index, result -> - setData("init_sdk_fun_$index", result) - } - } - }) - } + Sentry.captureEvent(sentryEvent) } override fun captureException(e: Throwable) { diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt index 41eb2e9f65..2ba0a5b757 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt @@ -4,10 +4,6 @@ interface IAcceleratorDataHolderProvider { fun setVipEntity(vip: Any) - fun addInitFunResult(result: String) - - fun getInitFunResults(): List - fun getGhVersionName(): String fun clear() diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/NewFlatLogUtils.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/NewFlatLogUtils.kt index 1b17a6193b..f6c7e8b79b 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/NewFlatLogUtils.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/NewFlatLogUtils.kt @@ -13,6 +13,8 @@ object NewFlatLogUtils { private const val KEY_GAME_ID = "game_id" private const val KEY_GAME_NAME = "game_name" private const val KEY_TEXT = "text" + private const val KEY_ERROR = "error" + private const val KEY_INIT_SDK_FUN = "init_sdk_fun" private fun log(jsonObject: JSONObject, logStore: String = "event", uploadImmediately: Boolean = false) { Utils.log("NewFlatLogUtils", jsonObject.toString(4)) @@ -52,4 +54,14 @@ object NewFlatLogUtils { } log(json) } + + @JvmStatic + fun logAcceleratorSetTokenError(initResults: List, error: String) { + json { + KEY_EVENT to "accelerator_set_token_error" + KEY_ERROR to error + KEY_INIT_SDK_FUN to initResults.toString() + parseAndPutMeta().invoke(this) + }.let(::log) + } } \ No newline at end of file From 308e134afffa1b319d1d6ed93254886e8307abe1 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Wed, 9 Apr 2025 11:17:30 +0800 Subject: [PATCH 13/21] =?UTF-8?q?feat:=20sentry=20=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20base64=20=E8=BD=AC=E7=A0=81=E5=90=8E?= =?UTF-8?q?=E7=9A=84=20androidId=20=E6=9B=BF=E6=8D=A2=E5=8E=9F=E5=A7=8B?= =?UTF-8?q?=E9=9A=8F=E6=9C=BA=20id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sentry/src/main/java/com/lg/SentryProviderImpl.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt b/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt index 6419d473af..1a77ffa44c 100644 --- a/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt +++ b/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt @@ -3,7 +3,7 @@ package com.lg import android.content.Context import android.text.TextUtils import com.gh.gamecenter.common.base.activity.BaseActivity -import com.gh.gamecenter.common.utils.toJson +import com.gh.gamecenter.common.exposure.meta.MetaUtil import com.gh.gamecenter.core.HaloApp import com.gh.gamecenter.core.provider.IAcceleratorDataHolderProvider import com.gh.gamecenter.core.provider.IAppProvider @@ -16,6 +16,7 @@ import io.sentry.* import io.sentry.android.core.SentryAndroid import io.sentry.android.fragment.FragmentLifecycleIntegration import io.sentry.protocol.Message +import io.sentry.protocol.User @com.therouter.inject.ServiceProvider class SentryProviderImpl : ISentryProvider { @@ -31,6 +32,14 @@ class SentryProviderImpl : ISentryProvider { options.setAnrEnabled(false) } + val androidId = MetaUtil.getBase64EncodedAndroidId() + + if (androidId.isNotEmpty()) { + val user = User() + user.id = androidId + Sentry.setUser(user) + } + options.setDebug(BuildConfig.DEBUG) options.setEnableAutoSessionTracking(true) options.setEnvironment(flavor) From aa9ba5163f961d42da09cf5d7d303fe646c51d4c Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Wed, 9 Apr 2025 11:27:54 +0800 Subject: [PATCH 14/21] =?UTF-8?q?fix:=20=E6=8D=95=E6=8A=93=E9=87=8D?= =?UTF-8?q?=E5=AE=9A=E5=90=91=E5=90=8E=E7=9A=84=E4=B8=8B=E8=BD=BD=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=20url=20=E5=BC=82=E5=B8=B8=E9=80=A0=E6=88=90=E7=9A=84?= =?UTF-8?q?=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/ndownload/NDownloadBridge.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt b/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt index 801db55f85..94f26380ab 100644 --- a/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt +++ b/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt @@ -26,6 +26,7 @@ import org.json.JSONException import org.json.JSONObject import java.io.File import java.io.IOException +import java.net.MalformedURLException import java.net.URL import java.net.URLConnection import java.text.DecimalFormat @@ -341,6 +342,9 @@ object NDownloadBridge : InnerDownloadListener, IErrorRetryHandler { // 由于这里的异常不会影响正常下载,所以直接打印异常,不做处理 // 具体可见 https://sentry.shanqu.cc/organizations/lightgame/issues/371082/ e.printStackTrace() + } catch (e: MalformedURLException) { + // 由于重定向的 url 可能是一个不合法的 url,这里捕获异常 + e.printStackTrace() } NDataChanger.notifyDataChanged(downloadEntity) From 12e547d333457b5fb721e8674ce8140666af769a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=99=A8?= Date: Wed, 2 Apr 2025 14:10:52 +0800 Subject: [PATCH 15/21] =?UTF-8?q?fix:=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8B=E3=80=91=E9=80=9A=E7=9F=A5=E6=A0=8F=E7=9B=AE=20?= =?UTF-8?q?=E6=BB=9A=E5=8A=A8=E9=97=AE=E9=A2=98=20https://jira.shanqu.cc/b?= =?UTF-8?q?rowse/GHZSCY-7806?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../custom/viewholder/NotificationColumnViewHolder.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/gamecenter/home/custom/viewholder/NotificationColumnViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/custom/viewholder/NotificationColumnViewHolder.kt index a671246f6f..b86f974a69 100644 --- a/app/src/main/java/com/gh/gamecenter/home/custom/viewholder/NotificationColumnViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/custom/viewholder/NotificationColumnViewHolder.kt @@ -37,6 +37,8 @@ class NotificationColumnViewHolder( private var isScrolling = false + private var targetPosition = -1 + private val bannerController = BannerInRecyclerController { nextToPage() } @@ -190,6 +192,10 @@ class NotificationColumnViewHolder( override fun onViewAttach(parent: RecyclerView?) { viewModel.shareHiddenNotifications.observe(lifecycleOwner, hiddenNotifiesObserver) bannerController.onViewAttachedToWindow(parent) + val selectedPosition = (_item as? CustomCommonContentCollectionItem)?.selectedPosition ?: 0 + if (targetPosition != -1 && targetPosition != selectedPosition) { + binding.rvNotification.scrollToPosition(targetPosition) + } } override fun onViewDetach(parent: RecyclerView?) { @@ -203,7 +209,10 @@ class NotificationColumnViewHolder( if (layoutManager is LinearLayoutManager) { val firstPosition = layoutManager.findFirstCompletelyVisibleItemPosition() if (firstPosition != -1) { - binding.rvNotification.smoothScrollToPosition(firstPosition + 1) + // 请注意,有可能smoothScrollToPosition正在执行滚动动画时,当前ViewHolder会调用onViewDetach,导致RecyclerView无法滚动到目标位置,所以这里需要先记录目标位置 + // 当ViewHolder Detach之后,再次Attach时,检查targetPosition是否等于selectedPosition,如果不相等,说明发生了以上情况,需要再次调用scrollToPosition将RecyclerView滚动到指定位置 + targetPosition = firstPosition + 1 + binding.rvNotification.smoothScrollToPosition(targetPosition) } } } From 3c6ee0c78225ba8296d80cda1723234a3d65c705 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Wed, 9 Apr 2025 15:43:49 +0800 Subject: [PATCH 16/21] =?UTF-8?q?chore:=20=E7=89=88=E6=9C=AC=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E8=87=B3=205.40.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 6b7b77abda..d39c94b78a 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 30 // 升级targetSdkVersion到 34 时需要根据官方文档补全前台服务的权限类型。比如 NDownloadService,KeepAliveService // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 1151 - versionName = "5.40.1" + versionCode = 1152 + versionName = "5.40.2" applicationId = "com.gh.gamecenter" applicationIdGat = "com.gh.gamecenter.intl" From e23d510fb006ee7cee1835a99a4e226e7a8cc336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Mon, 7 Apr 2025 09:54:40 +0800 Subject: [PATCH 17/21] =?UTF-8?q?fix:=20=E6=B8=B8=E6=88=8F=E8=AF=A6?= =?UTF-8?q?=E6=83=85-=E8=A7=86=E9=A2=91/=E5=9B=BE=E9=9B=86tab=20=E7=A5=9E?= =?UTF-8?q?=E7=AD=96=E5=9F=8B=E7=82=B9=E8=A1=A5=E5=85=85=E2=80=94=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=20https://jira.shanqu.cc/browse/GHZSCY-7781?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/GameDetailActivity.kt | 1 - .../gamedetail/GameDetailViewModel.kt | 2 + .../gamedetail/detail/GameDetailFragment.kt | 8 +- .../detail/adapter/GameDetailCoverAdapter.kt | 1 - .../gamedetail/video/TopVideoView.kt | 91 +++-- app/src/main/res/layout/gamedetail_body.xml | 310 ------------------ .../res/layout/piece_game_detail_video.xml | 39 --- .../gamecenter/common/utils/SensorsBridge.kt | 34 ++ 8 files changed, 111 insertions(+), 375 deletions(-) delete mode 100644 app/src/main/res/layout/gamedetail_body.xml delete mode 100644 app/src/main/res/layout/piece_game_detail_video.xml diff --git a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.kt index 7f08ee4b60..03fbb625b2 100644 --- a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.kt @@ -114,7 +114,6 @@ class GameDetailActivity : DownloadToolbarActivity() { view, listOf( R.id.menu_download_iv, - R.id.gameBigEvent, R.id.cardContainer, R.id.iv_reserve, R.id.iv_concern, diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt index 78365545d1..0ccd1ddd22 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt @@ -127,6 +127,8 @@ class GameDetailViewModel( var isSkipOnPageSelected = false // 是否触发论坛/专区Tab跳转 var defaultCoverEntity: CoverEntity? = null + var coverTabSequence = 1 // 用于埋点,详情视频/图集tab 当前选中tab的序号,从1开始 + var coverTabName = "" // 用于埋点,详情视频/图集tab 详情视频/图集tab 当前选中tab的tab名称 var isGameInstalled = false private var isGameUpdatable = false diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt index cc4b65c816..91ad234f20 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt @@ -187,15 +187,19 @@ class GameDetailFragment : LazyFragment(), IScrollable { coverSfv.goneIf(!shouldShowCoverFilter) { val defaultTabPosition = tabNameList.indexOfFirst { tabName -> viewModel.defaultCoverEntity?.tabName == tabName } + viewModel.coverTabSequence = defaultTabPosition + 1 + viewModel.coverTabName = viewModel.defaultCoverEntity?.tabName ?: "" coverSfv.setItemList(tabNameList, if (defaultTabPosition != -1) defaultTabPosition else 0) coverSfv.setOnCheckedCallback { position -> val checkedText = tabNameList.getOrNull(position) val currentCoverEntity = it.getOrNull(coverPosition) + viewModel.coverTabSequence = position + 1 + viewModel.coverTabName = checkedText ?: "" SensorsBridge.trackEvent("GameDetailMediaTabClick", json { "game_id" to gameEntity?.id "game_name" to gameEntity?.name - "sequence" to position + 1 - "tab_name" to checkedText + "sequence" to viewModel.coverTabSequence + "tab_name" to viewModel.coverTabName }) if (currentCoverEntity?.tabName == checkedText) return@setOnCheckedCallback diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt index 6c59e513cd..17102cb23d 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt @@ -115,7 +115,6 @@ class GameDetailCoverAdapter( }) .build(holder.binding.player) - holder.binding.player.gameName = viewModel.game?.name ?: "" holder.binding.player.viewModel = viewModel holder.binding.player.showOrHideCoverFilter = showOrHideCoverFilter holder.binding.player.video = topVideo diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt index 08f7473e39..242b6ae965 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt @@ -14,6 +14,7 @@ import androidx.fragment.app.Fragment import com.gh.common.util.LogUtils import com.gh.download.cache.ExoCacheManager import com.gh.gamecenter.R +import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.gamecenter.common.observer.MuteCallback import com.gh.gamecenter.common.observer.VolumeObserver import com.gh.gamecenter.common.utils.* @@ -40,7 +41,6 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS private var mMuteCallback: MuteCallback private var mVolumeObserver: VolumeObserver? = null - var gameName = "" var video: CoverTabEntity.Video? = null var viewModel: GameDetailViewModel? = null var uuid = UUID.randomUUID().toString() @@ -87,11 +87,21 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS } setBackFromFullScreenListener { -// if (it.id == R.id.fullscreen) { -// MtaHelper.onEvent("游戏详情_顶部视频", "${getMtaKeyPrefix()}-退出全屏", combinedTitleAndId) -// } else if (it.id == R.id.back) { -// MtaHelper.onEvent("游戏详情_顶部视频", "${getMtaKeyPrefix()}-点击返回", combinedTitleAndId) -// } + if (it.id == R.id.fullscreen || it.id == R.id.back) { + SensorsBridge.trackGameDetailVideoClick( + gameName = viewModel?.game?.name ?: "", + gameId = viewModel?.game?.id ?: "", + gameType = viewModel?.game?.categoryChinese ?: "", + lastPageName = GlobalActivityManager.getLastPageEntity().pageName, + lastPageId = GlobalActivityManager.getLastPageEntity().pageId, + action = if (it.id == R.id.fullscreen) "退出全屏" else "点击返回", + playType = if (mIsAutoPlay) "自动播放" else "主动播放", + isFullScreen = mIfCurrentIsFullscreen, + sequence = viewModel?.coverTabSequence ?: 1, + tabName = viewModel?.coverTabName ?: "", + playLength = (currentPositionWhenPlaying / 1000).toString() + ) + } clearFullscreenLayout() } @@ -126,13 +136,22 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS fun startPlayLogic(isAutoPlay: Boolean) { mIsAutoPlay = isAutoPlay violenceUpdateMuteStatus() -// if (isAutoPlay) { -// MtaHelper.onEvent("游戏详情_顶部视频", "视频播放方式", "自动播放") -// MtaHelper.onEvent("游戏详情_顶部视频", "顶部视频-自动播放", combinedTitleAndId) -// } else { -// MtaHelper.onEvent("游戏详情_顶部视频", "视频播放方式", "手动播放") -// } + if (isAutoPlay) { + SensorsBridge.trackGameDetailVideoClick( + gameName = viewModel?.game?.name ?: "", + gameId = viewModel?.game?.id ?: "", + gameType = viewModel?.game?.categoryChinese ?: "", + lastPageName = GlobalActivityManager.getLastPageEntity().pageName, + lastPageId = GlobalActivityManager.getLastPageEntity().pageId, + action = "自动播放", + playType = if (mIsAutoPlay) "自动播放" else "主动播放", + isFullScreen = mIfCurrentIsFullscreen, + sequence = viewModel?.coverTabSequence ?: 1, + tabName = viewModel?.coverTabName ?: "", + playLength = (currentPositionWhenPlaying / 1000).toString() + ) + val seekTime = ScrollCalculatorHelper.getPlaySchedule(MD5Utils.getContentMD5(video?.url)) seekOnStart = seekTime mTouchingProgressBar = false @@ -289,7 +308,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS override fun onStopTrackingTouch(seekBar: SeekBar?) { super.onStopTrackingTouch(seekBar) - uploadVideoStreamingPlaying("拖动") + uploadVideoStreamingPlaying("拖动进度条", seekBar) } override fun isShowNetConfirm(): Boolean { @@ -533,7 +552,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS } override fun releaseVideos() { - uploadVideoStreamingPlaying("结束播放") + uploadVideoStreamingPlaying("播放完毕") CustomManager.releaseAllVideos(getKey()) } @@ -556,11 +575,21 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS override fun onClick(v: View) { when (v.id) { R.id.start -> { -// if (currentState == GSYVideoView.CURRENT_STATE_PLAYING) { -// MtaHelper.onEvent("游戏详情_顶部视频", "${getMtaKeyPrefix()}-点击暂停", combinedTitleAndId) -// } else { -// MtaHelper.onEvent("游戏详情_顶部视频", "${getMtaKeyPrefix()}-点击播放", combinedTitleAndId) -// } + SensorsBridge.trackGameDetailVideoClick( + gameName = viewModel?.game?.name ?: "", + gameId = viewModel?.game?.id ?: "", + gameType = viewModel?.game?.categoryChinese ?: "", + lastPageName = GlobalActivityManager.getLastPageEntity().pageName, + lastPageId = GlobalActivityManager.getLastPageEntity().pageId, + action = if (currentState == GSYVideoView.CURRENT_STATE_PLAYING) "点击暂停" else "点击播放", + playType = if (mIsAutoPlay) "自动播放" else "主动播放", + isFullScreen = mIfCurrentIsFullscreen, + sequence = viewModel?.coverTabSequence ?: 1, + tabName = viewModel?.coverTabName ?: "", + playLength = (currentPositionWhenPlaying / 1000).toString() + ) + // 手动触发暂停/播放,后续行为都算主动播放 + mIsAutoPlay = false super.onClick(v) } @@ -568,13 +597,11 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS } } - private fun getMtaKeyPrefix() = if (mIfCurrentIsFullscreen) "顶部视频(全屏)" else "顶部视频" - fun getCurrentPosition(): Long { return mCurrentPosition } - fun uploadVideoStreamingPlaying(action: String) { + fun uploadVideoStreamingPlaying(action: String, seekBar: SeekBar? = null) { if (video == null || video?.url.isNullOrEmpty()) return runOnIoThread(isHeavyWightTask = true) { val isLandscape = mOrientationUtils != null @@ -598,6 +625,26 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS action, video?.videoId, video?.title, viewModel?.game?.id, viewModel?.game?.name, videoPlayModel, videoPlayStatus(), mContentLength, videoTotalTime, videoPlayTs, progress.toInt() ) + if (action != "开始播放" && action != "暂停播放" && action != "退出全屏") { + val playLength = when (action) { + "播放完毕" -> (duration / 1000).toString() + "拖动进度条" -> ((seekBar?.progress ?: 0) * duration / 100000).toString() + else -> (currentPositionWhenPlaying / 1000).toString() + } + SensorsBridge.trackGameDetailVideoClick( + gameName = viewModel?.game?.name ?: "", + gameId = viewModel?.game?.id ?: "", + gameType = viewModel?.game?.categoryChinese ?: "", + lastPageName = GlobalActivityManager.getLastPageEntity().pageName, + lastPageId = GlobalActivityManager.getLastPageEntity().pageId, + action = action, + playType = if (mIsAutoPlay) "自动播放" else "主动播放", + isFullScreen = mIfCurrentIsFullscreen, + sequence = viewModel?.coverTabSequence ?: 1, + tabName = viewModel?.coverTabName ?: "", + playLength = playLength + ) + } } } } diff --git a/app/src/main/res/layout/gamedetail_body.xml b/app/src/main/res/layout/gamedetail_body.xml deleted file mode 100644 index 5e44e99cc0..0000000000 --- a/app/src/main/res/layout/gamedetail_body.xml +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/piece_game_detail_video.xml b/app/src/main/res/layout/piece_game_detail_video.xml deleted file mode 100644 index c366e43aa7..0000000000 --- a/app/src/main/res/layout/piece_game_detail_video.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt index 1d3cd9e4d5..de2d92c6bd 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt @@ -337,6 +337,7 @@ object SensorsBridge { private const val EVENT_CALENDAR_PERMISSIONS_DIALOG_SHOW = "CalendarPermissionsDialogShow" private const val EVENT_CALENDAR_PERMISSIONS_DIALOG_CLICK = "CalendarPermissionsDialogClick" private const val CALENDAR_PERMISSIONS_DIALOG_RESULT = "CalendarPermissionsDialogResult" + private const val EVENT_GAME_DETAIL_VIDEO_CLICK= "GameDetailVideoClick" private var mIsSensorsEnabled = false @@ -5340,4 +5341,37 @@ object SensorsBridge { } trackEvent(CALENDAR_PERMISSIONS_DIALOG_RESULT, json) } + + /** + * 事件ID:GameDetailVideoClick + * 事件名称:游戏详情视频点击事件 + */ + fun trackGameDetailVideoClick( + gameName: String, + gameId: String, + gameType: String, + lastPageName: String, + lastPageId: String, + action: String, + playType: String, + isFullScreen: Boolean, + sequence: Int, + tabName: String, + playLength: String + ) { + val json = json { + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName + KEY_GAME_TYPE to gameType + KEY_LAST_PAGE_ID to lastPageId + KEY_LAST_PAGE_NAME to lastPageName + KEY_ACTION to action + KEY_PLAY_TYPE to playType + "is_full_screen" to isFullScreen + KEY_SEQUENCE to sequence + "tab_name" to tabName + "play_length" to playLength + } + trackEvent(EVENT_GAME_DETAIL_VIDEO_CLICK, json) + } } \ No newline at end of file From 2a08ea681d1456632315f552475a0e704141111a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Mon, 7 Apr 2025 17:57:14 +0800 Subject: [PATCH 18/21] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E8=AF=A6=E6=83=85=E8=A7=86=E9=A2=91/=E5=9B=BE?= =?UTF-8?q?=E9=9B=86Tab=E9=97=AA=E7=83=81=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/common/view/SegmentedFilterView.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module_common/src/main/java/com/gh/gamecenter/common/view/SegmentedFilterView.kt b/module_common/src/main/java/com/gh/gamecenter/common/view/SegmentedFilterView.kt index d5923f7729..8b7bdd62f0 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/view/SegmentedFilterView.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/view/SegmentedFilterView.kt @@ -105,6 +105,7 @@ class SegmentedFilterView @JvmOverloads constructor(context: Context, attrs: Att if (mContainerBackground != null) background = mContainerBackground mContainer = FrameLayout(context) mIndicator = View(context).apply { + visibility = View.GONE background = mIndicatorBackground } mRadioGroup = RadioGroup(context).apply { @@ -127,6 +128,7 @@ class SegmentedFilterView @JvmOverloads constructor(context: Context, attrs: Att mIndicator.updateLayoutParams { width = mRadioGroup.getChildAt(defaultCheckPosition)?.width ?: mItemWidth } + mIndicator.visibility = View.VISIBLE setChecked(defaultCheckPosition) } } From ab2973c7be177799789abde49996c69870c1c3a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Tue, 8 Apr 2025 15:22:33 +0800 Subject: [PATCH 19/21] =?UTF-8?q?feat:=20=E6=B8=B8=E6=88=8F=E9=A2=84?= =?UTF-8?q?=E7=BA=A6=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-7828?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/home/custom/adapter/CustomViewExt.kt | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/home/custom/adapter/CustomViewExt.kt b/app/src/main/java/com/gh/gamecenter/home/custom/adapter/CustomViewExt.kt index 5cccb841c3..9cd4023050 100644 --- a/app/src/main/java/com/gh/gamecenter/home/custom/adapter/CustomViewExt.kt +++ b/app/src/main/java/com/gh/gamecenter/home/custom/adapter/CustomViewExt.kt @@ -72,7 +72,7 @@ object CustomViewExt { private fun getTestDescription(game: GameEntity): String { val timeText = TimeUtils.formatTestTime(game.test?.start ?: 0L) val eventName = if (game.test?.type == "删档内测") { - R.string.first_release.toResString() + R.string.delete_test.toResString() } else { R.string.go_live.toResString() } diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 679cc79395..2161a09f94 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -683,9 +683,9 @@ 選擇加速區服 新用戶免費3小時 最近在玩 - 先發 上線 %1$s人預約 請檢查是否安裝微信客戶端 + 刪測 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b9f6827d72..ceb11c6a0d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -683,8 +683,8 @@ 选择加速区服 新用户免费3小时 最近在玩 - 首发 上线 %1$s人预约 请检查是否安装微信客户端 + 删测 From ba0854ad9afd9e4736a46b14a31d83007bfa1230 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Thu, 10 Apr 2025 10:00:57 +0800 Subject: [PATCH 20/21] =?UTF-8?q?feat:=20xapk=20=E8=A7=A3=E5=8E=8B?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=A2=9E=E5=8A=A0=E5=BC=82=E5=B8=B8=E6=91=98?= =?UTF-8?q?=E8=A6=81=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/xapk/XapkInstaller.kt | 11 ++--------- .../com/gh/gamecenter/common/utils/SensorsBridge.kt | 5 ++++- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt b/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt index ac8838feff..3bcfef17df 100644 --- a/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt +++ b/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt @@ -306,21 +306,14 @@ object XapkInstaller : XApkUnZipCallback, XApkUnZipOutputFactory { DownloadNotificationHelper.addOrUpdateDownloadNotification(downloadEntity) NDataChanger.notifyDataChanged(downloadEntity) DownloadManager.getInstance().updateDownloadEntity(downloadEntity) - // 仅官网渠道上报 XAPK 异常信息 - if (HaloApp.getInstance().channel == "GH_206") { - SentryHelper.onEvent( - "XAPK_UNZIP_ERROR", - "gameName", downloadEntity.name, - "errorDigest", exception.localizedMessage - ) - } DownloadDataHelper.uploadDownloadStatusEvent(downloadEntity, "xapk解压失败") SensorsBridge.trackGameDecompressionFailed( downloadEntity.gameId, downloadEntity.name, - downloadEntity.categoryChinese + downloadEntity.categoryChinese, + exception.localizedMessage ?: "unknown error" ) } diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt index de2d92c6bd..06f6b1eed9 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt @@ -1292,18 +1292,21 @@ object SensorsBridge { * @param gameId 游戏ID * @param gameName 游戏名称 * @param gameType 游戏类型 + * @param exceptionDigest 异常摘要 * @see EVENT_GAME_DEPRESSION_FAILED */ @JvmStatic fun trackGameDecompressionFailed( gameId: String, gameName: String, - gameType: String + gameType: String, + exceptionDigest: String, ) { val json = json { KEY_GAME_ID to gameId KEY_GAME_NAME to gameName KEY_GAME_TYPE to gameType + "exception_digest" to exceptionDigest } trackEvent(EVENT_GAME_DEPRESSION_FAILED, json) From 89aa6e7abcc9d23a9b050649aeee8f763369060b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Tue, 15 Apr 2025 11:23:14 +0800 Subject: [PATCH 21/21] =?UTF-8?q?fix:=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8B=E3=80=91=E6=B8=B8=E6=88=8F=E4=B8=93=E9=A2=98=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E9=97=AE=E9=A2=98=20https://jira.shanqu.cc/browse/GHZ?= =?UTF-8?q?SCY-7860?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/common/databind/BindingAdapters.java | 28 +++++++++++++------ .../layout/layout_game_item_selling_point.xml | 10 +++++-- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index 99ba512fb0..dfd816a4c9 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -13,11 +13,14 @@ import android.text.SpannableString; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.view.View; +import android.view.ViewParent; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; import com.gh.common.chain.BrowserInstallHandler; import com.gh.common.chain.CheckDownloadHandler; @@ -531,19 +534,14 @@ public class BindingAdapters { binding.tvSellingPoints.setVisibility(View.GONE); } - Context context = layout.getContext(); - binding.gtcvTags.removeAllViews(); ArrayList tagStyle = gameEntity.getTagStyle(); + StringBuilder tagText = new StringBuilder(); for (int i = 0; i < tagStyle.size(); i++) { if (i < 3) { - TextView textView = new TextView(layout.getContext()); - textView.setTextColor(ExtensionsKt.toColor(com.gh.gamecenter.common.R.color.text_tertiary, context)); - textView.setTextSize(10); - textView.setText((i == 0 ? "" : "·") + tagStyle.get(i).getName()); - binding.gtcvTags.addView(textView); + tagText.append(i == 0 ? "" : "·").append(tagStyle.get(i).getName()); } } - + binding.gtcvTags.setText(tagText); } else { layout.setVisibility(View.VISIBLE); binding.getRoot().setVisibility(View.GONE); @@ -570,6 +568,20 @@ public class BindingAdapters { break; } } + + ViewParent parent = binding.getRoot().getParent(); + if (parent instanceof ConstraintLayout) { + ConstraintLayout constraintLayout = (ConstraintLayout) parent; + ConstraintSet constraintSet = new ConstraintSet(); + constraintSet.clone(constraintLayout); + constraintSet.clear(R.id.gameDesSpace, ConstraintSet.BOTTOM); + if (subjectTag.equals(SUBJECT_TAG_SELLING_POINT)) { + constraintSet.connect(R.id.gameDesSpace, ConstraintSet.BOTTOM, R.id.layout_selling_points, ConstraintSet.TOP); + } else { + constraintSet.connect(R.id.gameDesSpace, ConstraintSet.BOTTOM, R.id.label_list, ConstraintSet.TOP); + } + constraintSet.applyTo(constraintLayout); + } } public static void setVideoDetailGameTags(LinearLayout layout, GameEntity gameEntity) { diff --git a/module_common/src/main/res/layout/layout_game_item_selling_point.xml b/module_common/src/main/res/layout/layout_game_item_selling_point.xml index 5ed31d9c59..ebf00dcbee 100644 --- a/module_common/src/main/res/layout/layout_game_item_selling_point.xml +++ b/module_common/src/main/res/layout/layout_game_item_selling_point.xml @@ -1,6 +1,7 @@ @@ -18,9 +19,12 @@ android:textSize="10sp" tools:text="送100连抽" /> - + android:includeFontPadding="false" + android:singleLine="true" + android:textColor="@color/text_tertiary" + android:textSize="@dimen/tag_text_size" /> \ No newline at end of file