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 @@
你还可以搜索邀请更多玩家
微信提醒
-
+
+
- 无力吐槽