From 28afb4f14c4645dd4782fccca94bcc6f5af9262f Mon Sep 17 00:00:00 2001 From: kehaoyuan Date: Mon, 13 Apr 2020 18:57:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E7=89=88=E6=9C=AC=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E4=BC=98=E5=8C=96(=E4=B8=80=E7=BA=A7?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90)https://?= =?UTF-8?q?gitlab.ghzs.com/pm/halo-app-issues/issues/819?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/Extensions.kt | 9 + .../java/com/gh/common/util/PackageUtils.java | 24 +- .../com/gh/download/dialog/DownloadDialog.kt | 55 ++--- .../download/dialog/DownloadDialogAdapter.kt | 17 +- .../DownloadDialogInstalledItemViewHolder.kt | 105 +++++---- .../dialog/DownloadDialogItemStatus.kt | 14 ++ .../dialog/DownloadDialogItemViewHolder.kt | 129 +++++++++-- .../gh/download/dialog/DownloadViewModel.kt | 211 ++++++++++++------ .../gh/gamecenter/manager/PackagesManager.kt | 7 +- app/src/main/res/values/strings.xml | 3 +- 10 files changed, 382 insertions(+), 192 deletions(-) create mode 100644 app/src/main/java/com/gh/download/dialog/DownloadDialogItemStatus.kt diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index 64b4107575..28c51004fc 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -237,6 +237,15 @@ inline fun tryCatchInRelease(action: (() -> Unit)) { } } +/** + * 在 debug 状态下抛出异常 + */ +fun throwExceptionInDebug(message: String) { + if (BuildConfig.DEBUG) { + throw RuntimeException(message) + } +} + /** * String related */ 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 aac54d73b7..55b04a0973 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -14,6 +14,8 @@ import android.os.Build; import android.os.Bundle; import android.text.TextUtils; +import androidx.core.content.FileProvider; + import com.g00fy2.versioncompare.Version; import com.gh.common.constant.Constants; import com.gh.gamecenter.BuildConfig; @@ -36,7 +38,7 @@ import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; -import androidx.core.content.FileProvider; +import javax.annotation.Nullable; public class PackageUtils { @@ -129,6 +131,19 @@ public class PackageUtils { return null; } + + /** + * 获取已安装游戏的光环ID(游戏ID) + * + * @param packageName + * @return + */ + @Nullable + public static Object getGhId(String packageName) { + return getMetaData(HaloApp.getInstance().getApplication(), packageName, "gh_id"); + } + + /* * 判断是否是插件包 */ @@ -452,7 +467,7 @@ public class PackageUtils { /** * todo 统一判断 - * + *

* 判断游戏包是否可以更新 * * @param apkEntity apkEntity 必须是已安装的游戏 @@ -483,11 +498,10 @@ public class PackageUtils { /** * todo 统一判断 - * + *

* 判断游戏包是否可以插件化 * * @param apkEntity apkEntity 必须是已安装的游戏 - * * @return true:可以插件化 false:不可以插件化 */ public static boolean isCanPluggable(ApkEntity apkEntity) { @@ -496,7 +510,7 @@ public class PackageUtils { apkEntity.getPackageName(), "gh_id"); - return PackageHelper.INSTANCE.getLocalPackageNameSet().contains(apkEntity.getPackageName()) + return PackageUtils.isInstalled(HaloApp.getInstance().getApplication(), 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 5039fef219..78238e117d 100644 --- a/app/src/main/java/com/gh/download/dialog/DownloadDialog.kt +++ b/app/src/main/java/com/gh/download/dialog/DownloadDialog.kt @@ -15,16 +15,17 @@ import androidx.recyclerview.widget.RecyclerView import com.gh.base.fragment.BaseDialogFragment import com.gh.common.util.DialogUtils import com.gh.common.util.DirectUtils +import com.gh.common.util.observeNonNull import com.gh.download.DownloadManager import com.gh.gamecenter.BuildConfig import com.gh.gamecenter.R import com.gh.gamecenter.databinding.DialogDownloadBinding -import com.lightgame.utils.AppManager import com.gh.gamecenter.entity.GameEntity import com.halo.assistant.HaloApp import com.lightgame.download.DataWatcher import com.lightgame.download.DownloadEntity import com.lightgame.download.DownloadStatus +import com.lightgame.utils.AppManager import com.lightgame.utils.Utils @@ -46,13 +47,15 @@ class DownloadDialog : BaseDialogFragment() { if (downloadEntity.gameId == mGameEntity.id && DownloadStatus.delete != DownloadManager.getInstance(requireContext()).getStatus(downloadEntity.url)) { mAdapter?.listData?.forEachIndexed { index, entity -> - if (entity.normal != null || entity.installed != null) { + if (entity.normal?.packageName == downloadEntity.packageName + || entity.installed?.packageName == downloadEntity.packageName) { mAdapter?.notifyItemChanged(index) } } mCollectionAdapter?.listData?.forEachIndexed { index, entity -> - if (entity.normal != null || entity.installed != null) { + if (entity.normal?.packageName == downloadEntity.packageName + || entity.installed?.packageName == downloadEntity.packageName) { mCollectionAdapter?.notifyItemChanged(index) } } @@ -72,7 +75,14 @@ class DownloadDialog : BaseDialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mViewModel = ViewModelProviders.of(this).get(DownloadViewModel::class.java) + val factory = DownloadViewModel.Factory(HaloApp.getInstance().application, mGameEntity) + mViewModel = ViewModelProviders.of(this, factory).get(DownloadViewModel::class.java) + mViewModel.listLiveData.observeNonNull(this, callback = { itemList -> + mAdapter = DownloadDialogAdapter(requireContext(), itemList, mGameEntity, mEntrance) + mBinding.contentList.layoutManager = createLayoutManager(itemList) + mBinding.contentList.adapter = mAdapter + + }) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -92,41 +102,6 @@ class DownloadDialog : BaseDialogFragment() { } } } - - // todo test - val apks = mGameEntity.getApk() - val itemList: MutableList = ArrayList() - apks.forEachIndexed { index, apkEntity -> - if (index == 0) { - val itemLink = DownloadDialogItemData() - val links : MutableList = arrayListOf() - links.add(GameEntity.PluginLink(title = "如何识别手机适用平台?")) - links.add(GameEntity.PluginLink(title = "如何插件化?")) - itemLink.links = links - itemList.add(itemLink) - val itemSection = DownloadDialogItemData() - itemSection.section = DownloadDialogSectionType.INSTALLED - itemList.add(itemSection) - } - - if (index == 5) { - val itemSection = DownloadDialogItemData() - itemSection.section = DownloadDialogSectionType.OTHER - itemList.add(itemSection) - } - - if (index < 5) { - val itemInstalled = DownloadDialogItemData() - itemInstalled.installed = apkEntity - itemList.add(itemInstalled) - } else { - val itemInstalled = DownloadDialogItemData() - itemInstalled.normal = apkEntity - itemList.add(itemInstalled) - } - } - mBinding.contentList.layoutManager = createLayoutManager(itemList) - mBinding.contentList.adapter = DownloadDialogAdapter(requireContext(), itemList, mGameEntity) return mBinding.root } @@ -150,6 +125,8 @@ class DownloadDialog : BaseDialogFragment() { override fun onResume() { + mAdapter?.notifyDataSetChanged() + mCollectionAdapter?.notifyDataSetChanged() super.onResume() DownloadManager.getInstance(requireContext()).addObserver(mDataWatcher) } diff --git a/app/src/main/java/com/gh/download/dialog/DownloadDialogAdapter.kt b/app/src/main/java/com/gh/download/dialog/DownloadDialogAdapter.kt index e9cfdf0dd7..14f230e78b 100644 --- a/app/src/main/java/com/gh/download/dialog/DownloadDialogAdapter.kt +++ b/app/src/main/java/com/gh/download/dialog/DownloadDialogAdapter.kt @@ -15,8 +15,11 @@ import com.lightgame.adapter.BaseRecyclerAdapter import com.lightgame.utils.Utils class DownloadDialogAdapter(context: Context, - val listData: MutableList, - private val mGameEntity: GameEntity) : BaseRecyclerAdapter(context) { + val listData: List, + private val mGameEntity: GameEntity, + private val mEntrance: String) : BaseRecyclerAdapter(context) { + + private val mPath = "下载弹窗" override fun getItemViewType(position: Int): Int { val itemData = listData[position] @@ -59,11 +62,11 @@ class DownloadDialogAdapter(context: Context, Utils.toast(mContext, data.title) } } - is DownloadDialogInstalledItemViewHolder->{ - holder.bindInstalledItem(listData[position].installed!!, mGameEntity) + is DownloadDialogInstalledItemViewHolder -> { + holder.bindInstalledItem(listData[position].installed!!, mGameEntity, mEntrance, mPath) } - is DownloadDialogItemViewHolder ->{ - holder.bindItem(listData[position].normal!!) + is DownloadDialogItemViewHolder -> { + holder.bindItem(listData[position].normal!!, mGameEntity, mEntrance, mPath) } } } @@ -77,5 +80,7 @@ class DownloadDialogAdapter(context: Context, private const val ITEM_SECTION = 201 private const val ITEM_INSTALLED = 202 private const val ITEM_NORMAL = 203 + + const val ITEM_TAG_KEY = R.id.download_item_type } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/download/dialog/DownloadDialogInstalledItemViewHolder.kt b/app/src/main/java/com/gh/download/dialog/DownloadDialogInstalledItemViewHolder.kt index b5ab8124ca..7f1be2af9e 100644 --- a/app/src/main/java/com/gh/download/dialog/DownloadDialogInstalledItemViewHolder.kt +++ b/app/src/main/java/com/gh/download/dialog/DownloadDialogInstalledItemViewHolder.kt @@ -1,88 +1,101 @@ package com.gh.download.dialog -import android.text.TextUtils import android.view.View import com.gh.base.BaseRecyclerViewHolder import com.gh.common.constant.Config -import com.gh.common.util.PackageHelper import com.gh.common.util.PackageUtils +import com.gh.common.util.throwExceptionInDebug import com.gh.common.util.visibleIf import com.gh.download.DownloadManager -import com.gh.gamecenter.BuildConfig import com.gh.gamecenter.R import com.gh.gamecenter.databinding.DownloadDialogInstalledItemBinding import com.gh.gamecenter.entity.ApkEntity import com.gh.gamecenter.entity.GameEntity -import com.gh.gamecenter.entity.PluginLocation -import com.gh.gamecenter.manager.PackagesManager import com.halo.assistant.HaloApp -import com.lightgame.download.DownloadEntity import com.lightgame.download.DownloadStatus class DownloadDialogInstalledItemViewHolder(val binding: DownloadDialogInstalledItemBinding) : BaseRecyclerViewHolder(binding.root) { - fun bindInstalledItem(apk: ApkEntity, gameEntity: GameEntity){ - binding.apk = apk - val apkLink = apk.apkLink + // todo 出现较严重的卡顿 + fun bindInstalledItem(apkEntity: ApkEntity, gameEntity: GameEntity, entrance: String, path: String) { + binding.apk = apkEntity + val apkLink = apkEntity.apkLink + val apkCollection = apkEntity.apkCollection if (apkLink != null) { + } else if (apkCollection != null) { + binding.collection.visibility = View.VISIBLE + binding.downloadStatusIcon.visibility = View.GONE + binding.progressbar.visibility = View.GONE + binding.pluggable.visibility = View.GONE + binding.install.visibility = View.GONE + binding.update.visibility = View.GONE + binding.remark.visibleIf(apkEntity.remark.isNotEmpty()) + + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.COLLECTION) } else { - val downloadEntity = DownloadManager.getInstance(HaloApp.getInstance().application).getDownloadEntityByUrl(apk.url) + val downloadEntity = DownloadManager.getInstance(HaloApp.getInstance().application).getDownloadEntityByUrl(apkEntity.url) if (downloadEntity != null) { + binding.downloadStatusIcon.visibility = View.VISIBLE binding.progressbar.visibility = View.VISIBLE binding.status.visibility = View.VISIBLE binding.remark.visibility = View.GONE + binding.launch.visibility = View.GONE + binding.pluggable.visibility = View.GONE + binding.update.visibility = View.GONE binding.install.visibleIf(DownloadStatus.done == downloadEntity.status) binding.downloadStatusIcon.setImageResource(R.drawable.download_dialog_status_pause) - binding.progressbar.progress = downloadEntity.progress.toInt() - binding.status.text = getDownloadingStatusText(downloadEntity) + binding.progressbar.progress = downloadEntity.percent.toInt() + binding.status.text = DownloadDialogItemViewHolder.getDownloadingStatusText(downloadEntity) + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.DOWNLOADING) } else { binding.progressbar.visibility = View.GONE binding.status.visibility = View.GONE binding.install.visibility = View.GONE - binding.remark.visibleIf(apk.remark.isNotEmpty()) + binding.remark.visibleIf(apkEntity.remark.isNotEmpty()) - val ghId = PackageUtils.getMetaData(HaloApp.getInstance().application, apk.packageName, "gh_id") - if (PackageHelper.localPackageNameSet.contains(apk.packageName) && (ghId == null || ghId == gameEntity.id)) { - if (gameEntity.getTag().size != 0 - && !TextUtils.isEmpty(apk.ghVersion) - && !PackageUtils.isSignature(HaloApp.getInstance().application, apk.packageName) - && apk.isShowPlugin(PluginLocation.only_game)) { - binding.pluggable.visibility = View.VISIBLE - } else if (PackagesManager.isCanUpdate(gameEntity.id, apk.packageName)) { - binding.update.visibility = View.VISIBLE - } else { - var isFilter = false - val settings = Config.getSettings() - settings?.gameDownloadBlackList?.forEach {pkgName-> - if (pkgName == apk.packageName) { - isFilter = true - } - } + if (PackageUtils.isCanPluggable(apkEntity)) { + binding.pluggable.visibility = View.VISIBLE + binding.update.visibility = View.GONE + binding.launch.visibility = View.GONE - if (isFilter) { - // 已安装 - } else { - // 启动 + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.PLUGGABLE) + } else if (PackageUtils.isCanUpdate(apkEntity, gameEntity.id)) { + binding.update.visibility = View.VISIBLE + binding.pluggable.visibility = View.GONE + binding.launch.visibility = View.GONE + + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.UPDATE) + } else if (PackageUtils.getGhId(apkEntity.packageName) == gameEntity.id) { + binding.launch.visibility = View.VISIBLE + binding.pluggable.visibility = View.GONE + binding.update.visibility = View.GONE + + var isFilter = false + Config.getSettings()?.gameDownloadBlackList?.forEach { pkgName -> + if (pkgName == apkEntity.packageName) { + isFilter = true } } + + if (isFilter) { + // 已安装 + + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.INSTALLED) + } else { + // 启动 + + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.LAUNCH) + } } else { - binding.launch.visibility = View.VISIBLE + throwExceptionInDebug("下载弹窗-我的版本出现位置类型") } + } } + + DownloadDialogItemViewHolder.setDownloadClickListener(itemView, apkEntity, gameEntity, entrance, path) binding.executePendingBindings() } - - private fun getDownloadingStatusText (downloadEntity: DownloadEntity): String { - return when(downloadEntity.status){ - DownloadStatus.pause-> "已暂停" - DownloadStatus.waiting ->"等待中" - DownloadStatus.done ->"等待安装" - DownloadStatus.downloading ->downloadEntity.speed.toString() - - else -> if (BuildConfig.DEBUG) throw IllegalStateException() else "" - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/download/dialog/DownloadDialogItemStatus.kt b/app/src/main/java/com/gh/download/dialog/DownloadDialogItemStatus.kt new file mode 100644 index 0000000000..f8712c2ac3 --- /dev/null +++ b/app/src/main/java/com/gh/download/dialog/DownloadDialogItemStatus.kt @@ -0,0 +1,14 @@ +package com.gh.download.dialog + +enum class DownloadDialogItemStatus { + DOWNLOAD, + LAUNCH, + DOWNLOADING, + INSTALL, + PLUGGABLE, + UPDATE, + COLLECTION, + LINK, + INSTALLED, + IGNORE +} diff --git a/app/src/main/java/com/gh/download/dialog/DownloadDialogItemViewHolder.kt b/app/src/main/java/com/gh/download/dialog/DownloadDialogItemViewHolder.kt index b7df259dad..7d6b3cbebb 100644 --- a/app/src/main/java/com/gh/download/dialog/DownloadDialogItemViewHolder.kt +++ b/app/src/main/java/com/gh/download/dialog/DownloadDialogItemViewHolder.kt @@ -1,55 +1,154 @@ package com.gh.download.dialog import android.view.View +import com.gh.base.BaseActivity import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.util.DialogUtils +import com.gh.common.util.PackageUtils +import com.gh.common.util.SpeedUtils import com.gh.common.util.visibleIf import com.gh.download.DownloadManager import com.gh.gamecenter.BuildConfig +import com.gh.gamecenter.DownloadManagerActivity import com.gh.gamecenter.R import com.gh.gamecenter.databinding.DownloadDialogItemBinding import com.gh.gamecenter.entity.ApkEntity +import com.gh.gamecenter.entity.GameEntity import com.halo.assistant.HaloApp import com.lightgame.download.DownloadEntity import com.lightgame.download.DownloadStatus +import com.lightgame.download.FileUtils +import com.lightgame.utils.Utils class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : BaseRecyclerViewHolder(binding.root) { - fun bindItem(apk: ApkEntity){ - binding.apk = apk - val apkLink = apk.apkLink + // todo 出现较严重的卡顿 + fun bindItem(apkEntity: ApkEntity, gameEntity: GameEntity, entrance: String, path: String) { + binding.apk = apkEntity + val apkLink = apkEntity.apkLink + val apkCollection = apkEntity.apkCollection + + if (apkLink != null) { + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.LINK) + } else if (apkCollection != null) { + binding.downloadStatusIcon.visibility = View.VISIBLE + binding.progressbar.visibility = View.GONE + binding.install.visibility = View.GONE + binding.remark.visibleIf(apkEntity.remark.isNotEmpty()) + + binding.downloadStatusIcon.setImageResource(R.drawable.download_dialog_status_collection) + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.COLLECTION) } else { - val downloadEntity = DownloadManager.getInstance(HaloApp.getInstance().application).getDownloadEntityByUrl(apk.url) + val downloadEntity = DownloadManager.getInstance(HaloApp.getInstance().application).getDownloadEntityByUrl(apkEntity.url) if (downloadEntity != null) { + binding.downloadStatusIcon.visibility = View.VISIBLE binding.progressbar.visibility = View.VISIBLE binding.status.visibility = View.VISIBLE binding.remark.visibility = View.GONE binding.install.visibleIf(DownloadStatus.done == downloadEntity.status) binding.downloadStatusIcon.setImageResource(R.drawable.download_dialog_status_pause) - binding.progressbar.progress = downloadEntity.progress.toInt() + binding.progressbar.progress = downloadEntity.percent.toInt() binding.status.text = getDownloadingStatusText(downloadEntity) + + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.DOWNLOADING) } else { binding.progressbar.visibility = View.GONE - binding.status.visibility = View.GONE binding.install.visibility = View.GONE - binding.remark.visibleIf(apk.remark.isNotEmpty()) + binding.remark.visibleIf(apkEntity.remark.isNotEmpty()) - binding.downloadStatusIcon.setImageResource(R.drawable.download_dialog_status_download) + if (PackageUtils.isCanPluggable(apkEntity)) { + binding.downloadStatusIcon.visibility = View.VISIBLE + binding.status.visibility = View.VISIBLE + + binding.status.text = "可插件化" + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.PLUGGABLE) + } else if (PackageUtils.isCanUpdate(apkEntity, gameEntity.id)) { + binding.downloadStatusIcon.visibility = View.VISIBLE + binding.status.visibility = View.VISIBLE + + binding.status.text = "可更新" + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.UPDATE) + } else if (PackageUtils.getGhId(apkEntity.packageName) == gameEntity.id) { + binding.downloadStatusIcon.visibility = View.GONE + binding.status.visibility = View.VISIBLE + + binding.downloadStatusIcon.setImageResource(R.drawable.download_dialog_status_update) + binding.status.text = "点击启动" + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.LAUNCH) + } else { + binding.downloadStatusIcon.visibility = View.VISIBLE + binding.status.visibility = View.GONE + + binding.downloadStatusIcon.setImageResource(R.drawable.download_dialog_status_download) + itemView.setTag(DownloadDialogAdapter.ITEM_TAG_KEY, DownloadDialogItemStatus.DOWNLOAD) + } } } + + setDownloadClickListener(itemView, apkEntity, gameEntity, entrance, path) binding.executePendingBindings() } - private fun getDownloadingStatusText (downloadEntity: DownloadEntity): String { - return when(downloadEntity.status){ - DownloadStatus.pause-> "已暂停" - DownloadStatus.waiting ->"等待中" - DownloadStatus.done ->"等待安装" - DownloadStatus.downloading ->downloadEntity.speed.toString() + companion object { + fun getDownloadingStatusText(downloadEntity: DownloadEntity): String { + return when (downloadEntity.status) { + DownloadStatus.pause -> "已暂停" + DownloadStatus.waiting -> "等待中" + DownloadStatus.done -> "等待安装" + DownloadStatus.downloading -> SpeedUtils.getSpeed(downloadEntity.speed) - else -> if (BuildConfig.DEBUG) throw IllegalStateException() else "" + else -> if (BuildConfig.DEBUG) throw IllegalStateException() else "" + } + } + + fun setDownloadClickListener(itemView: View, apkEntity: ApkEntity, gameEntity: GameEntity, entrance: String, path: String) { + itemView.setOnClickListener { + when (itemView.getTag(DownloadDialogAdapter.ITEM_TAG_KEY)) { + DownloadDialogItemStatus.DOWNLOAD -> { + DialogUtils.checkDownload(it.context, apkEntity.size) { isSubscribe -> + DownloadManager.createDownload(it.context, apkEntity, gameEntity, "下载", entrance, path, isSubscribe, null) + } + } + DownloadDialogItemStatus.LAUNCH -> { + PackageUtils.launchApplicationByPackageName(it.context, apkEntity.packageName) + } + DownloadDialogItemStatus.DOWNLOADING -> { + // 打开下载管理界面 + it.context.startActivity(DownloadManagerActivity.getDownloadMangerIntent( + it.context, + apkEntity.url, + BaseActivity.mergeEntranceAndPath(entrance, path))) + } + DownloadDialogItemStatus.INSTALL -> { + val downloadEntity = DownloadManager.getInstance(it.context).getDownloadEntityByUrl(apkEntity.url) + if (FileUtils.isEmptyFile(path)) { + Utils.toast(it.context, R.string.install_failure_hint) + DownloadManager.getInstance(it.context).cancel(apkEntity.url) + } else { + PackageUtils.launchSetup(it.context, downloadEntity) + } + } + DownloadDialogItemStatus.PLUGGABLE -> { + DialogUtils.checkDownload(it.context, apkEntity.size) { isSubscribe -> + DownloadManager.createDownload(it.context, apkEntity, gameEntity, "插件化", entrance, path, isSubscribe, null) + } + } + DownloadDialogItemStatus.UPDATE -> { + DialogUtils.checkDownload(it.context, apkEntity.size) { isSubscribe -> + DownloadManager.createDownload(it.context, apkEntity, gameEntity, "更新", entrance, path, isSubscribe, null) + } + } + DownloadDialogItemStatus.COLLECTION -> { + + } + DownloadDialogItemStatus.LINK -> { + + } + } + } } } } \ No newline at end of file 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 1b46481fee..2a98b805d6 100644 --- a/app/src/main/java/com/gh/download/dialog/DownloadViewModel.kt +++ b/app/src/main/java/com/gh/download/dialog/DownloadViewModel.kt @@ -1,19 +1,18 @@ package com.gh.download.dialog import android.app.Application -import android.text.TextUtils import androidx.lifecycle.AndroidViewModel -import com.gh.common.util.PackageHelper +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider 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.* import java.util.concurrent.ConcurrentHashMap /** @@ -25,101 +24,111 @@ import java.util.concurrent.ConcurrentHashMap * 1.上述一级页面排序包含合集 * 2.二级页面(合集详情),切勿打乱原有排序,按后台顺序显示 */ -class DownloadViewModel(val gameEntity: GameEntity, application: Application) : AndroidViewModel(application) { +class DownloadViewModel(application: Application, val gameEntity: GameEntity) : AndroidViewModel(application) { + val listLiveData: MutableLiveData> = MutableLiveData() - var allApkList: List = ArrayList() - val installedApkList: List = ArrayList() - val otherApkList: List = ArrayList() + private var mAllApkList: MutableList = ArrayList() + private val mInstalledApkList: MutableList = ArrayList() + private val mOtherApkList: MutableList = 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 -// } -// } + init { + initListData() + } + + private fun initListData() { + mergeApkCollection() + mergeApkLink() + + mAllApkList.forEach { apk -> + if (PackagesManager.isInstalled(apk.packageName)) { + setSortValueToApkEntity(apk) + mInstalledApkList.add(apk) + } else { + setSortValueToApkEntity(apk) + mOtherApkList.add(apk) + } + } + + mInstalledApkList.sortWith(Comparator { o1, o2 -> o2.order - o1.order }) + mOtherApkList.sortWith(Comparator { o1, o2 -> o2.order - o1.order }) + + val itemList: MutableList = ArrayList() + + val pluginLink = gameEntity.pluginLink + if (pluginLink.isNotEmpty()) { + itemList.add(DownloadDialogItemData(links = pluginLink)) + } + + if (mInstalledApkList.isNotEmpty()) { + itemList.add(DownloadDialogItemData(section = DownloadDialogSectionType.INSTALLED)) + } + + mInstalledApkList.forEach { apk -> + itemList.add(DownloadDialogItemData(installed = apk)) + } + + if (mOtherApkList.isNotEmpty()) { + itemList.add(DownloadDialogItemData(section = DownloadDialogSectionType.OTHER)) + } + + mOtherApkList.forEach { apk -> + itemList.add(DownloadDialogItemData(normal = apk)) + } + + listLiveData.postValue(itemList) + } + + private fun setSortValueToApkEntity(apkEntity: ApkEntity) { + apkEntity.apkCollection?.saveApkEntity?.forEach { saveApk -> + val sortValue = getSortValue(saveApk) + if (apkEntity.order < sortValue) { + apkEntity.order = sortValue + } + } + + if (apkEntity.order == 0) { + apkEntity.order = getSortValue(apkEntity) + } } 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 (PackagesManager.isInstalled(packageName)) { + if (PackageUtils.isCanPluggable(apkEntity)) { + return SORT_PLUGGABLE + } else if (PackageUtils.isCanUpdate(apkEntity, gameEntity.id)) { + return SORT_UPDATE + } else if (PackageUtils.getMetaData(getApplication(), packageName, "gh_id") == gameEntity.id) { + return SORT_NORMAL_LUNCH } } - 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 - } + return SORT_NORMAL } else { return if (downloadEntity.status == DownloadStatus.done) { if (downloadEntity.isPluggable) { - 10 + SORT_PLUGGABLE_INSTALL } else if (downloadEntity.isUpdate) { - 7 + SORT_UPDATE_INSTALL } else { - 4 + SORT_NORMAL_INSTALL } } else { if (downloadEntity.isPluggable) { - 9 + SORT_PLUGGABLE_DOWNLOADING } else if (downloadEntity.isUpdate) { - 6 + SORT_UPDATE_DOWNLOADING } else { - 3 + SORT_NORMAL_DOWNLOADING } } } - return 0 } - private fun mergeApkCollection(gameEntity: GameEntity) { + private fun mergeApkCollection() { val gameCollectionApk = ArrayList() val hashMap = ConcurrentHashMap() var isCollection: Boolean @@ -156,6 +165,60 @@ class DownloadViewModel(val gameEntity: GameEntity, application: Application) : } } - allApkList = gameCollectionApk + mAllApkList = gameCollectionApk + } + + private fun mergeApkLink() { + gameEntity.apkLink?.forEach { link -> + val collection = link.collection + if (collection.isNotEmpty()) { + mAllApkList.forEach { apk -> + apk.apkCollection?.let { apkCollection -> + val saveApkEntity = apkCollection.saveApkEntity + if (saveApkEntity != null && collection == apkCollection.id) { + val element = ApkEntity() + element.apkLink = link + if (saveApkEntity.size > link.sort) { + saveApkEntity.add(link.sort, element) + } else { + saveApkEntity.add(element) + } + } + } + } + } else { + val linkApkEntity = ApkEntity() + linkApkEntity.apkLink = link + if (mAllApkList.size > link.sort) { + mAllApkList.add(link.sort, linkApkEntity) + } else { + mAllApkList.add(linkApkEntity) + } + } + } + } + + + class Factory(val mApplication: Application, val gameEntity: GameEntity) : ViewModelProvider.NewInstanceFactory() { + override fun create(modelClass: Class): T { + return DownloadViewModel(mApplication, gameEntity) as T + } + } + + companion object { + + // 需要修改排序的话,只需要修改以下数值即可(由大到小排序) + const val SORT_PLUGGABLE_INSTALL = 10 + const val SORT_PLUGGABLE_DOWNLOADING = 9 + const val SORT_PLUGGABLE = 8 + + const val SORT_UPDATE_INSTALL = 7 + const val SORT_UPDATE_DOWNLOADING = 6 + const val SORT_UPDATE = 5 + + const val SORT_NORMAL_INSTALL = 4 + const val SORT_NORMAL_DOWNLOADING = 3 + const val SORT_NORMAL_LUNCH = 2 + const val SORT_NORMAL = 1 } } \ No newline at end of file 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 dca27c3ad9..2f2482c14e 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/PackagesManager.kt +++ b/app/src/main/java/com/gh/gamecenter/manager/PackagesManager.kt @@ -104,12 +104,7 @@ object PackagesManager { if (TextUtils.isEmpty(packageName)) { return false } - for (pkg in installedPkgList) { - if (pkg == packageName) { - return true - } - } - return false + return installedPkgList.contains(packageName) } /** diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4c3fb12bc4..bf2fd24f9a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -657,7 +657,8 @@ 你还可以搜索邀请更多玩家 微信提醒 - + + 无力吐槽