From 10572e7b0b1ed18cf849db8ba46812ef6e229872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Tue, 5 Dec 2023 14:53:00 +0800 Subject: [PATCH 1/8] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BA=BF=E4=B8=8A?= =?UTF-8?q?=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98=20https://sentry.shanqu.cc?= =?UTF-8?q?/organizations/lightgame/issues/349079/events/06d299cb0e6549a49?= =?UTF-8?q?f80cd248a91e614/=3Fproject=3D22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/video/detail/HomeVideoFragment.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/HomeVideoFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/HomeVideoFragment.kt index 0e401a699d..1e318d370f 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/HomeVideoFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/HomeVideoFragment.kt @@ -192,11 +192,13 @@ class HomeVideoFragment : BaseLazyFragment() { fun getCurrentFragment(): VideoDetailContainerFragment? { val mIsHomeVideo = arguments?.getBoolean(EntranceConsts.KEY_IS_HOME_VIDEO, false) ?: false return if (mIsHomeVideo) { - if (mBinding.mViewPager.currentItem == 0) { - newestVideoDetailFragment - } else { - recommendVideoDetailFragment - } + if (::mBinding.isInitialized) { + if (mBinding.mViewPager.currentItem == 0) { + newestVideoDetailFragment + } else { + recommendVideoDetailFragment + } + } else null } else { recommendVideoDetailFragment } From e55d4d3332c8a2b5293a6f5cf68e41027161a7f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Tue, 5 Dec 2023 17:26:01 +0800 Subject: [PATCH 2/8] =?UTF-8?q?fix:=20=E6=8D=95=E8=8E=B7=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?Fragment=E5=85=B3=E8=81=94=E7=9A=84=E9=97=AA=E9=80=80=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20https://sentry.shanqu.cc/organizations/lightgame/is?= =?UTF-8?q?sues/348952/events/d6c0400d0edb4ee8b302faab4707960d/=3Fproject?= =?UTF-8?q?=3D22&statsPeriod=3D14d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/MainActivity.java | 1 + .../adapter/MainFragmentPagerAdapter.kt | 27 ++++++++++++++++++- .../fragment/MainWrapperFragment.kt | 18 ++----------- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index bc4298291b..288773555d 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -883,6 +883,7 @@ public class MainActivity extends BaseActivity { @Override protected void onSaveInstanceState(@NotNull Bundle outState) { super.onSaveInstanceState(outState); + outState.clear(); outState.putInt(CURRENT_PAGE, mMainWrapperFragment.getCurrentItem()); if (mMainWrapperFragment != null) { outState.putInt(BaseFragment_ViewPager.ARGS_INDEX, mMainWrapperFragment.getCurrentItem()); diff --git a/app/src/main/java/com/gh/gamecenter/adapter/MainFragmentPagerAdapter.kt b/app/src/main/java/com/gh/gamecenter/adapter/MainFragmentPagerAdapter.kt index 2250aa91ac..150df0348f 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/MainFragmentPagerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/adapter/MainFragmentPagerAdapter.kt @@ -1,17 +1,22 @@ package com.gh.gamecenter.adapter +import android.content.Context +import android.content.Intent import android.util.SparseIntArray +import android.view.ViewGroup import androidx.core.util.forEach import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter +import com.gh.gamecenter.common.BuildConfig /*** * 支持替换Fragment的FragmentPagerAdapter */ class MainFragmentPagerAdapter( + private val mContext: Context, private val mFragmentManager: FragmentManager, - private val mFragmentsList: ArrayList + private val mFragmentsList: ArrayList, ) : FragmentPagerAdapter(mFragmentManager) { private val mFragmentPositionSparseArray = SparseIntArray() // 记录Fragment的位置 private val mFragmentPositionUpdateSparseArray = SparseIntArray() // 记录更新后Fragment的位置 @@ -76,4 +81,24 @@ class MainFragmentPagerAdapter( override fun getItem(position: Int): Fragment = mFragmentsList[position] override fun getItemId(position: Int): Long = mFragmentsList[position].hashCode().toLong() + + override fun finishUpdate(container: ViewGroup) { + // 替换Fragment闪退关联问题(REPLACE_FRAGMENT_CRASH) + try { + super.finishUpdate(container) + } catch (e: Throwable) { + if (BuildConfig.DEBUG) { + throw e + } else { + e.printStackTrace() + + // 重启APP + val pm = mContext.packageManager + val intent = pm?.getLaunchIntentForPackage(mContext.packageName) + val mainIntent = Intent.makeRestartActivityTask(intent!!.component) + mContext.startActivity(mainIntent) + Runtime.getRuntime().exit(0) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.kt index 2804bafda9..813f3d97f2 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.kt @@ -105,7 +105,7 @@ class MainWrapperFragment : BaseFragment_ViewPager_Checkable(), OnBackPressedLis override fun getViewPagerId(): Int = R.id.lightgame_tab_viewpager override fun getCurrentItem() = mViewPager.currentItem override fun getChildCount(): Int = 5 - override fun provideAdapter(): PagerAdapter = MainFragmentPagerAdapter(childFragmentManager, mFragmentsList as ArrayList) + override fun provideAdapter(): PagerAdapter = MainFragmentPagerAdapter(requireContext(), childFragmentManager, mFragmentsList as ArrayList) override fun initFragmentList(fragments: MutableList) { mHomeFragment = HomeSearchToolWrapperFragment() @@ -330,21 +330,7 @@ class MainWrapperFragment : BaseFragment_ViewPager_Checkable(), OnBackPressedLis homeArgs.putBoolean(EntranceConsts.KEY_IS_HOME, true) } - override fun restoreFragments(): ArrayList { - val restoreFragments = super.restoreFragments() - for (fragment in restoreFragments) { - if (fragment is SearchToolWrapperFragment && fragment !is HomeSearchToolWrapperFragment) { - mGameWrapperFragment = fragment - } else if (fragment is HomeVideoFragment || fragment is HomeToolbarWrapperFragment || fragment is AmwayFragment || fragment is ForumDetailFragment) { - mFourthFragment = fragment as ToolbarFragment? - } else if (fragment is CommunityHomeFragment) { - mCommunityHomeFragment = fragment - } else if (fragment is HomeSearchToolWrapperFragment) { - mHomeFragment = fragment - } - } - return restoreFragments - } + override fun restoreFragments(): ArrayList = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { mViewModel = viewModelProviderFromParent(MainWrapperViewModel.Factory(HaloApp.getInstance())) From 8b863955a332a306574ac911cd61395452e53dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Mon, 11 Dec 2023 09:59:27 +0800 Subject: [PATCH 3/8] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=8F=E9=97=AA=E9=80=80=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20https://sentry.shanqu.cc/organizations/lightgame/is?= =?UTF-8?q?sues/350701/events/e5db556244ac4ecb93d37e7997103bf3/=3Fenvironm?= =?UTF-8?q?ent=3Dkuaishou&project=3D22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/fragment/SearchToolbarFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java index a304fe4a4d..eeb2a2dff7 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java @@ -199,6 +199,8 @@ public class SearchToolbarFragment extends BaseLazyFragment implements View.OnCl super.onCreate(savedInstanceState); if (getArguments() != null && getArguments().getString(EntranceConsts.KEY_LOCATION) != null) { mLocation = getArguments().getString(EntranceConsts.KEY_LOCATION); + } else { + mLocation = ""; } mHintIndex = 0; if (savedInstanceState != null) { From 6f6a734cb5cfaa0fa128f372ffabdffe85c0ab0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E7=A5=A5=E4=BF=8A?= Date: Mon, 11 Dec 2023 18:00:01 +0800 Subject: [PATCH 4/8] =?UTF-8?q?fix:=20Sentry=E5=BC=82=E5=B8=B8=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/DirectUtils.kt | 4 ++-- .../qa/article/detail/ArticleDetailWebCacheManager.kt | 9 +++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/DirectUtils.kt b/app/src/main/java/com/gh/common/util/DirectUtils.kt index 31cee86e52..ed98e0f65c 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -920,9 +920,9 @@ object DirectUtils { browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } context.startActivity(browserIntent) - } catch (e: ActivityNotFoundException) { + } catch (e: Exception) { e.printStackTrace() - Utils.toast(context, "跳转地址无效") + url.copyTextAndToast(context.getString(R.string.direct_to_external_browser_failed_toast)) } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailWebCacheManager.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailWebCacheManager.kt index e6813eaf93..35ece888a9 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailWebCacheManager.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailWebCacheManager.kt @@ -6,6 +6,7 @@ import android.content.MutableContextWrapper import android.view.ViewGroup import android.webkit.WebResourceResponse import android.webkit.WebView +import com.gh.common.util.PackageUtils import com.gh.common.view.RichEditor import com.gh.gamecenter.common.utils.EnvHelper import com.gh.gamecenter.common.utils.removeFromParent @@ -40,6 +41,10 @@ object ArticleDetailWebCacheManager { @SuppressLint("CheckResult") fun init(applicationContext: Context) { + if (!PackageUtils.checkWebViewIsAvailable(applicationContext)) { + return + } + if (isInit) return isInit = true @@ -98,6 +103,10 @@ object ArticleDetailWebCacheManager { * 预初始化 WebView */ fun preInitRichEditor(context: Context) { + if (!PackageUtils.checkWebViewIsAvailable(context)) { + return + } + // 避免未正常初始化的情况 if (!isInit) { init(context.applicationContext) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8eff71c5ff..4c3053d967 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -520,4 +520,5 @@ 至少勾选一种提醒方式 区服已开服,不能设置提醒 网络异常,请检查手机网络状态 + 打开外部浏览器失败,已复制链接到粘贴板,请自行打开链接 From ae0f4c948b754ff58bea8df7457f6b914c44b797 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 12 Dec 2023 15:04:32 +0800 Subject: [PATCH 5/8] =?UTF-8?q?chore:=20=E7=89=88=E6=9C=AC=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E8=87=B3=205.32.5?= 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 5e45ef879e..f002c417a1 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 28 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 995 - versionName = "5.32.5" + versionCode = 996 + versionName = "5.32.6" applicationId = "com.gh.gamecenter" // AndroidX From 8e255b1803b8418a3a6c2dc1cbbd8ea6ea0a2bce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Wed, 13 Dec 2023 09:34:04 +0800 Subject: [PATCH 6/8] =?UTF-8?q?fix:=E3=80=90=E7=95=85=E7=8E=A9=E5=8A=A9?= =?UTF-8?q?=E6=89=8B=E3=80=91=E7=95=85=E7=8E=A9-=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E5=9C=A8=E7=8E=A9=E6=A8=A1=E5=9D=97=E3=80=81=E5=8F=8C=E5=BC=80?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E5=BC=82=E5=B8=B8=20https://jira.shanqu.cc/b?= =?UTF-8?q?rowse/CWZS-138?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/game/GameFragment.kt | 2 ++ .../com/gh/gamecenter/game/GameFragmentAdapter.kt | 9 +++++++++ .../com/gh/vspace/HomeRecentVGameViewHolder.kt | 6 +++++- app/src/main/java/com/gh/vspace/VHelper.kt | 14 +++++++------- .../com/gh/gamecenter/feature/entity/GameEntity.kt | 2 +- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/game/GameFragment.kt b/app/src/main/java/com/gh/gamecenter/game/GameFragment.kt index e91ee0a1f7..0bd42f8e07 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/game/GameFragment.kt @@ -325,6 +325,7 @@ open class GameFragment : LazyFragment() { mListAdapter.notifyChildItem(gameAndPosition.position, busFour.packageName) } } + (mViewModel as GameViewModel).refreshRecentVGameIfNeeded() } @Subscribe(threadMode = ThreadMode.MAIN) @@ -332,6 +333,7 @@ open class GameFragment : LazyFragment() { if (::mListAdapter.isInitialized && "Refresh" == reuse.type) { mListAdapter.notifyDataSetChanged() } + (mViewModel as GameViewModel).refreshRecentVGameIfNeeded() } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt index 1012c0a803..c0c321564c 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt @@ -87,6 +87,7 @@ import com.gh.gamecenter.home.video.ScrollCalculatorHelper import com.gh.gamecenter.qgame.QGameHorizontalSlideListViewHolder import com.gh.gamecenter.servers.gametest2.GameServerTestV2Activity import com.gh.gamecenter.subject.SubjectActivity +import com.gh.vspace.HomeRecentVGameAdapter import com.gh.vspace.HomeRecentVGameViewHolder import com.gh.vspace.VHelper import com.lightgame.adapter.BaseRecyclerAdapter @@ -1754,6 +1755,7 @@ class GameFragmentAdapter( || getItemViewType(gameAndPosition.position) == ItemViewType.HORIZONTAL_SLIDE_VIDEO || getItemViewType(gameAndPosition.position) == ItemViewType.GAME_COLLECTION_BIG_SLIDE || getItemViewType(gameAndPosition.position) == ItemViewType.GAME_COLLECTION_VERTICAL_REFRESH + || getItemViewType(gameAndPosition.position) == ItemViewType.RECENT_V_GAME ) { val view = mLayoutManager?.findViewByPosition(gameAndPosition.position) val recyclerView = view?.findViewById(R.id.recycler_view) @@ -1765,6 +1767,7 @@ class GameFragmentAdapter( is HomeHorizontalSlideVideoAdapter -> adapter.notifyItemByDownload(download) is HomeGameCollectionSlideAdapter -> adapter.notifyItemByDownload(download) is HomeGameCollectionRefreshAdapter -> adapter.notifyItemByDownload(download) + is HomeRecentVGameAdapter -> adapter.notifyItemByDownload(download) } } else { notifyItemChanged(gameAndPosition.position) @@ -1907,6 +1910,12 @@ class GameFragmentAdapter( continue } + val recentVGame = mItemDataList[position].recentVGame + if (recentVGame != null) { + positionList.add(GameAndPosition(null, position)) + continue + } + val image = mItemDataList[position].image if (image != null) positionList.add(GameAndPosition(image, position)) } diff --git a/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt b/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt index 6ec3c2cbe9..8f67e4371f 100644 --- a/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt +++ b/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt @@ -91,7 +91,11 @@ class HomeRecentVGameAdapter(context: Context) : DiffUtilAdapter( notifyDataSetChanged() } else { for (position in mDataList.indices) { - if (downloadEntity.name == mDataList[position].downloadEntity.name) { + val oldDownloadEntity = mDataList[position].downloadEntity + if (downloadEntity.name == oldDownloadEntity.name) { + // 防止覆盖游戏最后打开的时间为0 + if (VHelper.getLastPlayedTime(oldDownloadEntity) != 0L && VHelper.getLastPlayedTime(downloadEntity) == 0L) + return mDataList[position].downloadEntity = downloadEntity notifyItemChanged(position) } diff --git a/app/src/main/java/com/gh/vspace/VHelper.kt b/app/src/main/java/com/gh/vspace/VHelper.kt index 62224f3664..26274e9bc3 100644 --- a/app/src/main/java/com/gh/vspace/VHelper.kt +++ b/app/src/main/java/com/gh/vspace/VHelper.kt @@ -1705,17 +1705,17 @@ object VHelper { val sortedEntityList = arrayListOf() val distinctIdSet = hashSetOf() - // 将下载任务的实体放进待排序列表里 - for (rawDownloadEntity in rawDownloadEntityList) { - distinctIdSet.add(rawDownloadEntity.gameId) - rawEntityList.add(rawDownloadEntity) - } // 将已安装任务的实体放进待排序列表里 for (rawInstalledEntity in rawInstalledEntityList) { - if (distinctIdSet.contains(rawInstalledEntity.downloadEntity.gameId)) { + distinctIdSet.add(rawInstalledEntity.downloadEntity.gameId) + rawEntityList.add(rawInstalledEntity.downloadEntity) + } + // 将下载任务的实体放进待排序列表里 + for (rawDownloadEntity in rawDownloadEntityList) { + if (distinctIdSet.contains(rawDownloadEntity.gameId)) { continue } - rawEntityList.add(rawInstalledEntity.downloadEntity) + rawEntityList.add(rawDownloadEntity) } distinctIdSet.clear() diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt index 8526a50c1c..811049a952 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt @@ -115,7 +115,7 @@ data class GameEntity( // 额外的下载方式,用于双下载类型时使用。可能的值为 "off/on/smooth/smooth_32",分别为关闭/畅玩64位/畅玩32位 @SerializedName("download_extra_status") - private var mDownloadStatusExtra: String = "", + private var mDownloadStatusExtra: String = "off", // 优先的下载方式,用于双下载类型时使用。可能的值为 "smooth/local",分别为 畅玩下载/普通下载 @SerializedName("download_default") private var mDefaultDownloadType: String = "", From cc4ef16e103b30883d243915a2c844ba7ba472ec Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 13 Dec 2023 14:20:28 +0800 Subject: [PATCH 7/8] =?UTF-8?q?chore:=20=E7=89=88=E6=9C=AC=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E8=87=B3=205.32.7?= 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 f002c417a1..2dfac57dfe 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 28 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 996 - versionName = "5.32.6" + versionCode = 997 + versionName = "5.32.7" applicationId = "com.gh.gamecenter" // AndroidX From 36e9bd20ac637fdce8ae351c08bd624288079a75 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Tue, 5 Dec 2023 17:29:51 +0800 Subject: [PATCH 8/8] =?UTF-8?q?fix:=20V5.32.5=E7=BE=A4=E6=B5=8B=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E6=B1=87=E6=80=BB1204=20https://jira.shanqu.cc/browse?= =?UTF-8?q?/GHZS-4375?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 + .../com/gh/common/util/PackageInstaller.kt | 8 ++ .../gh/gamecenter/install/InstallService.kt | 94 +++++++++++++++++++ .../gh/gamecenter/manager/UpdateManager.java | 1 + .../receiver/InstallAndUninstallReceiver.java | 13 +++ 5 files changed, 118 insertions(+) create mode 100644 app/src/main/java/com/gh/gamecenter/install/InstallService.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9d8544f953..3fc75df730 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -826,6 +826,8 @@ + + diff --git a/app/src/main/java/com/gh/common/util/PackageInstaller.kt b/app/src/main/java/com/gh/common/util/PackageInstaller.kt index 22adc4f927..d599cfc759 100644 --- a/app/src/main/java/com/gh/common/util/PackageInstaller.kt +++ b/app/src/main/java/com/gh/common/util/PackageInstaller.kt @@ -19,6 +19,7 @@ import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.utils.CurrentActivityHolder import com.gh.gamecenter.core.utils.MD5Utils import com.gh.gamecenter.core.utils.ToastUtils +import com.gh.gamecenter.install.InstallService import com.gh.gamecenter.vpn.VpnHelper import com.gh.vspace.VHelper import com.halo.assistant.HaloApp @@ -159,6 +160,13 @@ object PackageInstaller { */ private fun install(context: Context, pkgPath: String) { HaloApp.put(Constants.LAST_INSTALL_GAME, pkgPath) + + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU && Build.MANUFACTURER.lowercase().contains("xiaomi")) { + val foregroundServiceIntent = Intent(context, InstallService::class.java) + foregroundServiceIntent.putExtra(InstallService.KEY_SERVICE_ACTION, InstallService.START_FOREGROUND) + context.startForegroundService(foregroundServiceIntent) + } + val installIntent = getInstallIntent(context, pkgPath) context.startActivity(installIntent) } diff --git a/app/src/main/java/com/gh/gamecenter/install/InstallService.kt b/app/src/main/java/com/gh/gamecenter/install/InstallService.kt new file mode 100644 index 0000000000..1683319280 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/install/InstallService.kt @@ -0,0 +1,94 @@ +package com.gh.gamecenter.install + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Intent +import android.os.Build +import android.os.IBinder +import androidx.core.app.NotificationCompat +import com.gh.gamecenter.R +import com.lightgame.download.ForegroundNotificationManager +import com.lightgame.utils.Utils +import java.util.* + +class InstallService : Service() { + + private var mForegroundTimer: Timer? = null + private var mForegroundNotificationManager: ForegroundNotificationManager? = null + + override fun onCreate() { + super.onCreate() + mForegroundNotificationManager = ForegroundNotificationManager(this, this.application) + Utils.log(InstallService::class.java.simpleName, "onCreate") + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + Utils.log(InstallService::class.java.simpleName, "onStartCommand") + val notificationId = 9999 + if (intent != null && intent.extras != null) { + val serviceAction = intent.getStringExtra(KEY_SERVICE_ACTION) + if (START_FOREGROUND == serviceAction) { + startForegroundIfNeeded(notificationId) + } else if (STOP_FOREGROUND == serviceAction) { + startForegroundIfNeeded(notificationId) + stopForegroundIfNeeded(notificationId) + } + } else { + startForegroundIfNeeded(notificationId) + stopForegroundIfNeeded(notificationId) + } + + // 不需要 intent 为空的重建 + return START_NOT_STICKY + } + + override fun onBind(intent: Intent?): IBinder? { + return null + } + + private fun startForegroundIfNeeded(notificationId: Int) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channel = + NotificationChannel(SERVICE_CHANNEL_ID, SERVICE_CHANNEL_ID, NotificationManager.IMPORTANCE_LOW) + val manager = applicationContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager + manager.createNotificationChannel(channel) + val notification: Notification = NotificationCompat.Builder(this, SERVICE_CHANNEL_ID) + .setSmallIcon(R.drawable.ic_download_notification) + .setContentTitle("光环助手安装服务") + .build() + mForegroundNotificationManager?.notify(notificationId, notification) + + mForegroundTimer?.cancel() + mForegroundTimer = Timer() + + val task: TimerTask = object : TimerTask() { + override fun run() { + stopForegroundIfNeeded(notificationId) + } + } + + mForegroundTimer?.schedule(task, FOREGROUND_COUNT_DOWN_TIME) + } + } + + private fun stopForegroundIfNeeded(notificationId: Int) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mForegroundNotificationManager?.cancel(notificationId) + + mForegroundTimer?.cancel() + mForegroundTimer = null + } + } + + + companion object { + private const val SERVICE_CHANNEL_ID = "安装服务" + private const val FOREGROUND_COUNT_DOWN_TIME = 20 * 1000L + + const val START_FOREGROUND = "start_foreground" + const val STOP_FOREGROUND = "stop_foreground" + const val KEY_SERVICE_ACTION = "service_action" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/manager/UpdateManager.java b/app/src/main/java/com/gh/gamecenter/manager/UpdateManager.java index 80ee73adf9..3f13bf46d5 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/UpdateManager.java +++ b/app/src/main/java/com/gh/gamecenter/manager/UpdateManager.java @@ -541,6 +541,7 @@ public class UpdateManager { downloadEntity.setPath(path); downloadEntity.setPlatform("官方版"); downloadEntity.setGameId(Constants.GHZS_GAME_ID); + downloadEntity.setFormat("apk"); downloadEntity.setExposureTrace(GsonUtils.toJson(event)); if (isSilentUpdate) { diff --git a/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java b/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java index 739120e7b1..bb520ab188 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java +++ b/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java @@ -3,6 +3,7 @@ package com.gh.gamecenter.receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.os.Build; import com.gh.common.util.InstallUtils; import com.gh.common.util.PackageHelper; @@ -17,13 +18,17 @@ import com.gh.gamecenter.core.AppExecutor; import com.gh.gamecenter.core.utils.SPUtils; import com.gh.gamecenter.eventbus.EBPackage; import com.gh.gamecenter.feature.entity.GameInstall; +import com.gh.gamecenter.install.InstallService; import com.gh.gamecenter.manager.PackagesManager; +import com.gh.ndownload.NDownloadService; import com.halo.assistant.HaloApp; import com.lightgame.download.DownloadEntity; import com.lightgame.utils.Utils; import org.greenrobot.eventbus.EventBus; +import java.util.Locale; + /** * 监听应用安装和卸载的广播 @@ -39,6 +44,14 @@ public class InstallAndUninstallReceiver extends BroadcastReceiver { PackageUtils.dumpInstalledListCache(); ExtensionsKt.doOnMainProcessOnly(context, () -> { Utils.log("InstallAndUninstallReceiver:: onReceive->" + intent.getAction() + "==" + intent.getDataString()); + + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU + && Build.MANUFACTURER.toLowerCase(Locale.CHINA).contains("xiaomi")) { + Intent foregroundServiceIntent = new Intent(context, InstallService.class); + foregroundServiceIntent.putExtra(InstallService.KEY_SERVICE_ACTION, InstallService.STOP_FOREGROUND); + context.startForegroundService(foregroundServiceIntent); + } + // 接收安装广播 if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) { String packageName = intent.getDataString();