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 964037f256..c77588eae5 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -922,9 +922,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/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 6924090716..50b5600e84 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -884,6 +884,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 88d823fcf6..29136fbc75 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())) 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 9e8f22b04d..7fa3803dca 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) { 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 80fa137a2e..3cab9bb465 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 5cee6d474d..6bb29afceb 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 @@ -1834,6 +1835,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) @@ -1845,6 +1847,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) @@ -1987,6 +1990,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/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/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 } diff --git a/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt b/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt index 2a8efc3963..0c624f0d11 100644 --- a/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt +++ b/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt @@ -94,7 +94,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 f86fa3728a..8cd94800de 100644 --- a/app/src/main/java/com/gh/vspace/VHelper.kt +++ b/app/src/main/java/com/gh/vspace/VHelper.kt @@ -1717,17 +1717,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/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b3ec9c8da4..697f8f0700 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -522,4 +522,5 @@ 至少勾选一种提醒方式 区服已开服,不能设置提醒 网络异常,请检查手机网络状态 + 打开外部浏览器失败,已复制链接到粘贴板,请自行打开链接 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 6189b0ca76..9e2d7eaac9 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 @@ -116,7 +116,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 = "",