diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index db0513272b..59ae672b97 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -318,12 +318,12 @@ public class PackageUtils { /** * 此设备是否不能调用 packageManager.getPackageArchiveInfo 来获取 APK 信息 - * + *

* 部分设备 (已知 vivo 5.1.1 及 5.0.1 的设备) 在调用 packageManager.getPackageArchiveInfo 获取比较大的 APK 文件时会出现 ANR */ public static boolean isDeviceUnableToHandleBigApkFile(String path) { if ("vivo".equals(Build.MANUFACTURER) - && Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { + && Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { File file = new File(path); if (file != null && file.length() > 1024 * 1024 * 1024) { @@ -337,12 +337,12 @@ public class PackageUtils { /** * 从 APK 文件里读包名的另类方法 * 部分设备 (已知 vivo 5.1.1) 在调用 packageManager.getPackageArchiveInfo 获取比较大的 APK 文件时会出现 ANR - * + *

* 令人迷惑的点: * 1. 同样的代码,同样的 APK 在 demo 包里调用 packageManager.getPackageArchiveInfo 并不会 ANR * 2. 把 packageManager.getPackageArchiveInfo 放在子线程调用一样会出现 ANR * 3. demo 里 manifest 中 application 配置和 targetSdk 也改成与光环一样也不会出现 ANR - * + *

* 大概是光环的某个配置触发了系统的 bug ? */ private static String getPackageNameByPathAlternative(String path) { @@ -445,6 +445,17 @@ public class PackageUtils { return list; } + public static ArrayList getAllPackageNameIncludeGh(Context context) { + ArrayList list = new ArrayList<>(); + List packageInfos = getInstalledPackages(context, 0); + for (PackageInfo packageInfo : packageInfos) { + if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { + list.add(packageInfo.packageName); + } + } + return list; + } + /* * 获取所有已安装的软件的包名(包括系统应用) */ @@ -557,7 +568,7 @@ public class PackageUtils { gh_version = gh_version.substring(2); try { return Long.parseLong(gh_version) < Long.parseLong(apkEntity.getGhVersion()) && apkEntity - .getForce() && gh_id.equals(gameId); + .getForce() && gh_id.equals(gameId); } catch (NumberFormatException exception) { // gh_id 可能出錯 exception.printStackTrace(); diff --git a/app/src/main/java/com/gh/common/util/RecommendPopupHelper.kt b/app/src/main/java/com/gh/common/util/RecommendPopupHelper.kt index 24029ed6e5..fde0e331f6 100644 --- a/app/src/main/java/com/gh/common/util/RecommendPopupHelper.kt +++ b/app/src/main/java/com/gh/common/util/RecommendPopupHelper.kt @@ -34,24 +34,37 @@ object RecommendPopupHelper { //判断是否符合包名限制 val nameRule = entity.recommendPackage.nameRule val packages = entity.recommendPackage.details - val installedPackages = PackageUtils.getAllPackageNameIncludeSystemApps(HaloApp.getInstance()) - var isMatchSuccess = false - + val installedPackages = PackageUtils.getAllPackageNameIncludeGh(HaloApp.getInstance()) + var isMatchSuccess = true + val checkInstalled: (splitPackages: List) -> Boolean = { + var isInstalled = false + it.forEach { packageName -> + if (installedPackages.contains(packageName)) { + isInstalled = true + return@forEach + } + } + isInstalled + } when (nameRule) { "installed" -> { - //设备上安装了指定的包名才生效 + //设备上安装了指定的包名才生效(需全部满足) packages.forEach { - if (installedPackages.contains(it)) { - isMatchSuccess = true + val splitPackages = it.split("、") + val isInstalled = checkInstalled(splitPackages) + if (!isInstalled) { + isMatchSuccess = false return@forEach } } } "uninstalled" -> { - //设备上未安装指定的包名才生效 + //设备上未安装指定的包名才生效(需全部满足) packages.forEach { - if (!installedPackages.contains(it)) { - isMatchSuccess = true + val splitPackages = it.split("、") + val isInstalled = checkInstalled(splitPackages) + if (isInstalled) { + isMatchSuccess = false return@forEach } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index 8a481f2631..f150f9dd0c 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -574,6 +574,9 @@ class GameDetailFragment : NormalFragment() { GameBigEventDialog.showGameBigEventDialog(requireContext(), mGameEntity?.name ?: "", it, mEntrance) } + mViewModel.recommendPopupLiveData.observe(this, Observer { + initRecommendUI() + }) mUserViewModel.loginObsUserinfo.observe(this, Observer { if (it != null && mGameEntity != null) { @@ -1178,8 +1181,11 @@ class GameDetailFragment : NormalFragment() { } } - private fun initRecommendUI(recommendPopup: RecommendPopupEntity) { - val popupDetail = recommendPopup.popupDetail + private fun initRecommendUI() { + val recommendPopupList = mViewModel.recommendPopupLiveData.value + mRecommendPopupEntity = RecommendPopupHelper.getRecommendPopup(mViewModel.game, recommendPopupList) + ?: return + val popupDetail = mRecommendPopupEntity!!.popupDetail mRecommendText.text = popupDetail.text if (popupDetail.images.isNotEmpty()) { ImageUtils.display(mRecommendImage, popupDetail.images[0]) @@ -1214,10 +1220,7 @@ class GameDetailFragment : NormalFragment() { } private fun showRecommendView() { - val recommendPopupList = mViewModel.recommendPopupList - mRecommendPopupEntity = RecommendPopupHelper.getRecommendPopup(mViewModel.game, recommendPopupList) - ?: return - initRecommendUI(mRecommendPopupEntity!!) + if (mRecommendPopupEntity == null) return mRecommendView.post { if (!mIsRecommendViewShow) { val width = mRecommendView.measuredWidth.toFloat() 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 e0e40d60c6..105fa9ec46 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt @@ -43,7 +43,7 @@ class GameDetailViewModel(application: Application, val gameLiveData = MutableLiveData>() val gameDetailLiveData = MutableLiveData>() val bigEventLiveData = MutableLiveData>() - var recommendPopupList: ArrayList? = null + val recommendPopupLiveData = MutableLiveData>() // 供外部 fragment (如 GameDetailFragment) 用的合并用户数据后的游戏数据 liveData val unifiedGameDetailWithUserRelatedInfoForParentLiveData = MutableLiveData() @@ -457,7 +457,7 @@ class GameDetailViewModel(application: Application, .compose(singleToMain()) .subscribe(object : BiResponse>() { override fun onSuccess(data: ArrayList) { - recommendPopupList = data + recommendPopupLiveData.postValue(data) } }) }