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 ee91a311ca..aac54d73b7 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -8,7 +8,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; -import android.content.pm.SigningInfo; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; @@ -46,47 +45,38 @@ public class PackageUtils { /* * 判断是否可以更新,只判断gh_version的大小 */ - public static List isCanUpdate(Context context, GameEntity gameEntity) { + public static List getUpdateData(Context context, GameEntity gameEntity) { List updateList = new ArrayList<>(); - boolean isAPluginGame = false; + // 插件更新 for (ApkEntity apkEntity : gameEntity.getApk()) { - // 判断是否gh_version是否存在 - String gh_version = (String) PackageUtils.getMetaData(context, apkEntity.getPackageName(), "gh_version"); - Object gh_id = PackageUtils.getMetaData(context, apkEntity.getPackageName(), "gh_id"); - if (gh_version != null && apkEntity.getGhVersion() != null && gh_id != null) { - - // 确定这是一个插件游戏 - if (!isAPluginGame) isAPluginGame = true; - gh_version = gh_version.substring(2); - if (Long.parseLong(gh_version) < Long.parseLong(apkEntity.getGhVersion()) && apkEntity.getForce() - && gh_id.equals(gameEntity.getId())) { - GameUpdateEntity updateEntity = new GameUpdateEntity(); - updateEntity.setId(gameEntity.getId()); - updateEntity.setName(gameEntity.getName()); - updateEntity.setIcon(gameEntity.getIcon()); - updateEntity.setPackageName(apkEntity.getPackageName()); - updateEntity.setSize(apkEntity.getSize()); - updateEntity.setVersion(apkEntity.getVersion()); - updateEntity.setGhVersion(apkEntity.getGhVersion()); - updateEntity.setUrl(apkEntity.getUrl()); - updateEntity.setPlatform(apkEntity.getPlatform()); - updateEntity.setEtag(apkEntity.getEtag()); - updateEntity.setBrief(gameEntity.getBrief()); - updateEntity.setTag(gameEntity.getTag()); - updateEntity.setTagStyle(gameEntity.getTagStyle()); - updateEntity.setDownload(gameEntity.getDownload()); - updateEntity.setIndexPlugin(gameEntity.getIndexPlugin()); - updateList.add(updateEntity); - } + if (isCanUpdate(apkEntity, gameEntity.getId())) { + GameUpdateEntity updateEntity = new GameUpdateEntity(); + updateEntity.setId(gameEntity.getId()); + updateEntity.setName(gameEntity.getName()); + updateEntity.setIcon(gameEntity.getIcon()); + updateEntity.setPackageName(apkEntity.getPackageName()); + updateEntity.setSize(apkEntity.getSize()); + updateEntity.setVersion(apkEntity.getVersion()); + updateEntity.setGhVersion(apkEntity.getGhVersion()); + updateEntity.setUrl(apkEntity.getUrl()); + updateEntity.setPlatform(apkEntity.getPlatform()); + updateEntity.setEtag(apkEntity.getEtag()); + updateEntity.setBrief(gameEntity.getBrief()); + updateEntity.setTag(gameEntity.getTag()); + updateEntity.setTagStyle(gameEntity.getTagStyle()); + updateEntity.setDownload(gameEntity.getDownload()); + updateEntity.setIndexPlugin(gameEntity.getIndexPlugin()); + updateList.add(updateEntity); } } - // 不是插件游戏 - if (!isAPluginGame) { - for (ApkEntity apkEntity : gameEntity.getApkNormal()) { + // 非插件游戏更新 + for (ApkEntity apkEntity : gameEntity.getApkNormal()) { + // ghVersion 不存在即是非插件游戏 + if (TextUtils.isEmpty(apkEntity.getGhVersion())) { String versionFromRequest = apkEntity.getVersion(); String versionFromInstalledApp = getVersionByPackage(apkEntity.getPackageName()); @@ -197,7 +187,7 @@ public class PackageUtils { } return ret; } - + /* * 启动安装应用程序 */ @@ -223,6 +213,7 @@ public class PackageUtils { /** * 根据 path 获取 apk 信息确定处理方式 + * * @return true 为直接唤起系统 PackageInstaller, false 为需要插件化 */ public static boolean isCanLaunchSetup(Context context, String path) { @@ -458,4 +449,56 @@ public class PackageUtils { return null; } + + /** + * todo 统一判断 + * + * 判断游戏包是否可以更新 + * + * @param apkEntity apkEntity 必须是已安装的游戏 + * @param gameId 游戏id + * @return true:可以更新 false:不可以更新 + */ + public static boolean isCanUpdate(ApkEntity apkEntity, String gameId) { + // gh_version: gh + timestamp + String gh_version = (String) PackageUtils.getMetaData( + HaloApp.getInstance().getApplication(), + apkEntity.getPackageName(), + "gh_version"); + + // gh_version: game id + Object gh_id = PackageUtils.getMetaData( + HaloApp.getInstance().getApplication(), + apkEntity.getPackageName(), + "gh_id"); + + if (gh_version != null && apkEntity.getGhVersion() != null && gh_id != null) { + gh_version = gh_version.substring(2); + return Long.parseLong(gh_version) < Long.parseLong(apkEntity.getGhVersion()) + && apkEntity.getForce() + && gh_id.equals(gameId); + } + return false; + } + + /** + * todo 统一判断 + * + * 判断游戏包是否可以插件化 + * + * @param apkEntity apkEntity 必须是已安装的游戏 + * + * @return true:可以插件化 false:不可以插件化 + */ + public static boolean isCanPluggable(ApkEntity apkEntity) { + String gh_id = (String) PackageUtils.getMetaData( + HaloApp.getInstance().getApplication(), + apkEntity.getPackageName(), + "gh_id"); + + return PackageHelper.INSTANCE.getLocalPackageNameSet().contains(apkEntity.getPackageName()) + && gh_id == null + && !TextUtils.isEmpty(apkEntity.getGhVersion()) + && !PackageUtils.isSignature(HaloApp.getInstance().getApplication(), apkEntity.getPackageName()); + } } diff --git a/app/src/main/java/com/gh/download/dialog/DownloadDialog.kt b/app/src/main/java/com/gh/download/dialog/DownloadDialog.kt index 1ee8c9ee67..5039fef219 100644 --- a/app/src/main/java/com/gh/download/dialog/DownloadDialog.kt +++ b/app/src/main/java/com/gh/download/dialog/DownloadDialog.kt @@ -35,6 +35,8 @@ class DownloadDialog : BaseDialogFragment() { private lateinit var mBinding: DialogDownloadBinding private var mAdapter: DownloadDialogAdapter? = null + + // 合集页面保持和后台一样的顺序 private var mCollectionAdapter: DownloadDialogAdapter? = null private var mEntrance: String = "" diff --git a/app/src/main/java/com/gh/download/dialog/DownloadViewModel.kt b/app/src/main/java/com/gh/download/dialog/DownloadViewModel.kt index 746a8c4ec6..1b46481fee 100644 --- a/app/src/main/java/com/gh/download/dialog/DownloadViewModel.kt +++ b/app/src/main/java/com/gh/download/dialog/DownloadViewModel.kt @@ -1,14 +1,161 @@ package com.gh.download.dialog import android.app.Application +import android.text.TextUtils import androidx.lifecycle.AndroidViewModel +import com.gh.common.util.PackageHelper +import com.gh.common.util.PackageUtils +import com.gh.common.util.PlatformUtils +import com.gh.download.DownloadManager +import com.gh.gamecenter.entity.ApkEntity +import com.gh.gamecenter.entity.GameCollectionEntity +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.manager.PackagesManager +import com.halo.assistant.HaloApp +import com.lightgame.download.DownloadStatus +import java.util.ArrayList +import java.util.concurrent.ConcurrentHashMap /** - * 是否需要viewModel? + * 已安装部分排序:安装插件化->安装更新->插件化下载中->更新下载中->插件化->更新->启动 + * + * 其它部分排序:安装→下载中 + * + * 注意: + * 1.上述一级页面排序包含合集 + * 2.二级页面(合集详情),切勿打乱原有排序,按后台顺序显示 */ -class DownloadViewModel(application: Application) : AndroidViewModel(application) { +class DownloadViewModel(val gameEntity: GameEntity, application: Application) : AndroidViewModel(application) { + + + var allApkList: List = ArrayList() + val installedApkList: List = ArrayList() + val otherApkList: List = ArrayList() fun getInstalledApkData() { +// for (apkEntity in allApkList) { +// val packageName = apkEntity.packageName +// var gh_id: Any? +// val ghId = PackageUtils.getMetaData(HaloApp.getInstance().application, apkEntity.packageName, "gh_id") +// if (PackageHelper.localPackageNameSet.contains(apkEntity.packageName) && (ghId == null || ghId == gameEntity.id)) { +// return if (!PackageUtils.isSignature(getApplication(), packageName)) { +// 8 +// } else if (PackagesManager.isCanUpdate(gameEntity.id, packageName)) { +// 5 +// } else { +// 2 +// } +// } +// if (apkEntity.order < 1) apkEntity.order = 1 +// +// val platform = apkEntity.getPlatform() +// val id = PlatformUtils.getInstance(getApplication()).getPlatformPic(platform) +// if (id == 0) { +// val path = PlatformUtils.getInstance(getApplication()).getPlatformPicUrl(platform) +// ?: return 0 +// } +// } + } + private fun getSortValue(apkEntity: ApkEntity): Int { + /* + * 安装插件 10 + * 插件化下载中 9 + * 插件化 8 + * 安装更新 7 + * 更新下载中 6 + * 更新 5 + * 安装 4 + * 下载中 3 + * 启动 2 + * 默认(有图片)1 + * 默认(无图片)0 + */ + + val gh_id: Any? + val packageName = apkEntity.packageName + val downloadEntity = DownloadManager.getInstance(getApplication()).getDownloadEntityByUrl(apkEntity.url) + if (downloadEntity == null) { + if (!TextUtils.isEmpty(packageName) && PackagesManager.isInstalled(packageName)) { + gh_id = PackageUtils.getMetaData(getApplication(), packageName, "gh_id") + if (gh_id == null || gh_id == gameEntity.id) { + return if (!PackageUtils.isSignature(getApplication(), packageName)) { + 8 + } else if (PackagesManager.isCanUpdate(gameEntity.id, packageName)) { + 5 + } else { + 2 + } + } + } + if (apkEntity.order < 1) apkEntity.order = 1 + + val platform = apkEntity.getPlatform() + val id = PlatformUtils.getInstance(getApplication()).getPlatformPic(platform) + if (id == 0) { + val path = PlatformUtils.getInstance(getApplication()).getPlatformPicUrl(platform) + ?: return 0 + } + } else { + return if (downloadEntity.status == DownloadStatus.done) { + if (downloadEntity.isPluggable) { + 10 + } else if (downloadEntity.isUpdate) { + 7 + } else { + 4 + } + } else { + if (downloadEntity.isPluggable) { + 9 + } else if (downloadEntity.isUpdate) { + 6 + } else { + 3 + } + } + } + return 0 + } + + + private fun mergeApkCollection(gameEntity: GameEntity) { + val gameCollectionApk = ArrayList() + val hashMap = ConcurrentHashMap() + var isCollection: Boolean + + for (apkEntity in gameEntity.getApk()) { + isCollection = false + for (gameCollectionEntity in gameEntity.collection) { + for (packageName in gameCollectionEntity.`package`) { + if (packageName == apkEntity.packageName) { + isCollection = true + val index = hashMap[gameCollectionEntity.name] + if (index != null) { + gameCollectionApk[index].apkCollection?.saveApkEntity?.add(apkEntity) + } else { + val newApkEntity = ApkEntity() + val collectionEntity = GameCollectionEntity() + val saveApkList = ArrayList() + saveApkList.add(apkEntity) + collectionEntity.saveApkEntity = saveApkList + collectionEntity.id = gameCollectionEntity.id + collectionEntity.name = gameCollectionEntity.name + collectionEntity.icon = gameCollectionEntity.icon + collectionEntity.color = gameCollectionEntity.color + newApkEntity.apkCollection = collectionEntity + gameCollectionApk.add(newApkEntity) + + hashMap[gameCollectionEntity.name] = gameCollectionApk.size - 1 + } + } + } + } + if (!isCollection) { + gameCollectionApk.add(apkEntity) + } + } + + allApkList = gameCollectionApk } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java index 3b40928168..dbf9820ad7 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java @@ -126,7 +126,7 @@ class GameUpdateFragmentAdapter extends BaseRecyclerAdapter implemen .subscribe(new Response() { @Override public void onResponse(GameEntity response) { - List update = PackageUtils.isCanUpdate(mContext, response); + List update = PackageUtils.getUpdateData(mContext, response); if (update.size() > 0) { updateList.addAll(update); // PackagesManager.INSTANCE.addUpdateList(update); diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameCollectionEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameCollectionEntity.kt index 7284733868..6dab1164a3 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameCollectionEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameCollectionEntity.kt @@ -11,12 +11,12 @@ import kotlinx.android.parcel.Parcelize data class GameCollectionEntity( @SerializedName("_id") var id: String? = "", - var color: String? = null, - var icon: String? = null, // todo remove? - var name: String? = null, + var color: String = "", + var icon: String = "", // todo remove? + var name: String = "", @SerializedName("package") var `package`: List = ArrayList(), - var saveApkEntity: List? = null, + var saveApkEntity: MutableList? = null, val remark: String = "", @SerializedName("new_icon") val newIcon: String = "", diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt index 8a1fa11882..7f2b280baf 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt @@ -67,8 +67,8 @@ data class GameUpdateEntity( } enum class PluginLocation { - only_index, - only_game, + only_index, // 首页插件化区域/下载管理 + only_game, // 游戏页面 force_open, // 无视后台判断强制打开 force_close, // 无视后台判断强制关闭 } diff --git a/app/src/main/java/com/gh/gamecenter/manager/PackagesManager.kt b/app/src/main/java/com/gh/gamecenter/manager/PackagesManager.kt index 96e45ea218..dca27c3ad9 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/PackagesManager.kt +++ b/app/src/main/java/com/gh/gamecenter/manager/PackagesManager.kt @@ -5,6 +5,9 @@ import com.gh.common.constant.Config import com.gh.gamecenter.entity.GameInstall import com.gh.gamecenter.entity.GameUpdateEntity +/** + * todo 整理部分与[PackageUtils]冲突的方法 + */ object PackagesManager { // 存在网络延迟 diff --git a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt index 2df3449281..8978eb9bc4 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt @@ -219,7 +219,7 @@ object PackageRepository { * @return 该请求是否存在可更新的游戏 */ private fun checkGameUpdate(game: GameEntity): Boolean { - val updateList = PackageUtils.isCanUpdate(getApplication(), game) + val updateList = PackageUtils.getUpdateData(getApplication(), game) if (updateList.size > 0) { for (updateEntity in updateList) { addUpdateOrPluggable(updateEntity)