diff --git a/app/src/main/java/com/gh/common/DefaultJsApi.kt b/app/src/main/java/com/gh/common/DefaultJsApi.kt index 517874ad29..48b535745b 100644 --- a/app/src/main/java/com/gh/common/DefaultJsApi.kt +++ b/app/src/main/java/com/gh/common/DefaultJsApi.kt @@ -550,10 +550,9 @@ class DefaultJsApi( @JavascriptInterface fun installDownloadedGame(event: Any) { val url = event.toString() - val vUrl = VHelper.getVUrl(url) - val downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(url, null, false) - ?: DownloadManager.getInstance().getDownloadEntitySnapshot(vUrl, null, false) + val downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(url, null) + ?: DownloadManager.getInstance().getDownloadEntitySnapshot(url, null) NewFlatLogUtils.logGameInstall( gameId = downloadEntity?.gameId ?: "", @@ -568,7 +567,7 @@ class DefaultJsApi( ) downloadEntity?.let { - PackageInstaller.install(context, it, showUnzipToast = false) + PackageInstaller.install(context, it, showUnzipToast = false, ignoreAsVGame = false) } } diff --git a/app/src/main/java/com/gh/common/chain/BrowserInstallHandler.kt b/app/src/main/java/com/gh/common/chain/BrowserInstallHandler.kt index d793caf27e..1e37cf5700 100644 --- a/app/src/main/java/com/gh/common/chain/BrowserInstallHandler.kt +++ b/app/src/main/java/com/gh/common/chain/BrowserInstallHandler.kt @@ -1,23 +1,21 @@ package com.gh.common.chain import android.content.Context -import com.gh.common.xapk.XapkInstaller import com.gh.download.server.BrowserInstallHelper -import com.gh.gamecenter.core.utils.EmptyCallback import com.gh.gamecenter.feature.entity.GameEntity -class BrowserInstallHandler : ChainHandler() { +class BrowserInstallHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { BrowserInstallHelper.showBrowserInstallHintDialog( context, gameEntity, - gameEntity.isVGame() || gameEntity.isSplitXApk() + asVGame || gameEntity.isSplitXApk() ) { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } } diff --git a/app/src/main/java/com/gh/common/chain/CertificationHandler.kt b/app/src/main/java/com/gh/common/chain/CertificationHandler.kt index 4665e3dc58..070505b083 100644 --- a/app/src/main/java/com/gh/common/chain/CertificationHandler.kt +++ b/app/src/main/java/com/gh/common/chain/CertificationHandler.kt @@ -4,14 +4,14 @@ import android.content.Context import com.gh.common.dialog.CertificationDialog import com.gh.gamecenter.feature.entity.GameEntity -class CertificationHandler : ChainHandler() { +class CertificationHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { CertificationDialog.showCertificationDialog(context, gameEntity) { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } } diff --git a/app/src/main/java/com/gh/common/chain/ChainHandler.kt b/app/src/main/java/com/gh/common/chain/ChainHandler.kt deleted file mode 100644 index fe0781146b..0000000000 --- a/app/src/main/java/com/gh/common/chain/ChainHandler.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.gh.common.chain - -import android.content.Context -import com.gh.gamecenter.feature.entity.GameEntity - -abstract class ChainHandler { - private var next: ChainHandler? = null - var processEndCallback: ((Any?) -> Unit)? = null - - fun setNext(next: ChainHandler?) { - this.next = next - } - - fun getNext(): ChainHandler? { - return next - } - - fun hasNext(): Boolean { - return next != null - } - - abstract fun handleRequest(context: Context, gameEntity: GameEntity) - -} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/chain/CheckDownloadHandler.kt b/app/src/main/java/com/gh/common/chain/CheckDownloadHandler.kt index ec116aeed1..6bce019d05 100644 --- a/app/src/main/java/com/gh/common/chain/CheckDownloadHandler.kt +++ b/app/src/main/java/com/gh/common/chain/CheckDownloadHandler.kt @@ -5,15 +5,15 @@ import com.gh.common.util.DialogUtils import com.gh.gamecenter.common.utils.safelyGetInRelease import com.gh.gamecenter.feature.entity.GameEntity -class CheckDownloadHandler : ChainHandler() { +class CheckDownloadHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { val apk = gameEntity.getApk().safelyGetInRelease(0) ?: return DialogUtils.checkDownload(context, apk.size, gameEntity.id, gameEntity.name, gameEntity.categoryChinese) { isSubscribe: Boolean -> if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(isSubscribe) + processEndCallback?.invoke(asVGame, isSubscribe) } } diff --git a/app/src/main/java/com/gh/common/chain/CheckStoragePermissionHandler.kt b/app/src/main/java/com/gh/common/chain/CheckStoragePermissionHandler.kt index 51babb67d6..99783e735e 100644 --- a/app/src/main/java/com/gh/common/chain/CheckStoragePermissionHandler.kt +++ b/app/src/main/java/com/gh/common/chain/CheckStoragePermissionHandler.kt @@ -4,9 +4,9 @@ import android.content.Context import com.gh.gamecenter.common.utils.PermissionHelper import com.gh.gamecenter.feature.entity.GameEntity -class CheckStoragePermissionHandler : ChainHandler() { +class CheckStoragePermissionHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { PermissionHelper.checkStoragePermissionBeforeAction( context, gameEntity.id, @@ -14,9 +14,9 @@ class CheckStoragePermissionHandler : ChainHandler() { gameEntity.categoryChinese ) { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } } diff --git a/app/src/main/java/com/gh/common/chain/ChainBuilder.kt b/app/src/main/java/com/gh/common/chain/DownloadChainBuilder.kt similarity index 52% rename from app/src/main/java/com/gh/common/chain/ChainBuilder.kt rename to app/src/main/java/com/gh/common/chain/DownloadChainBuilder.kt index a7e3c84e6e..dbb1208c2b 100644 --- a/app/src/main/java/com/gh/common/chain/ChainBuilder.kt +++ b/app/src/main/java/com/gh/common/chain/DownloadChainBuilder.kt @@ -1,22 +1,22 @@ package com.gh.common.chain -class ChainBuilder { +class DownloadChainBuilder { - private val handlers: MutableList = ArrayList() + private val handlers: MutableList = ArrayList() - private var processEndCallback: ((Any?) -> Unit)? = null + private var processEndCallback: ((asVGame: Boolean, Any?) -> Unit)? = null - fun setProcessEndCallback(callback: (Any?) -> Unit): ChainBuilder { + fun setProcessEndCallback(callback: (asVGame: Boolean, Any?) -> Unit): DownloadChainBuilder { processEndCallback = callback return this } - fun addHandler(handler: ChainHandler): ChainBuilder { + fun addHandler(handler: DownloadChainHandler): DownloadChainBuilder { handlers.add(handler) return this } - fun buildHandlerChain(): ChainHandler? { + fun buildHandlerChain(): DownloadChainHandler? { for (i in handlers.indices) { handlers[i].processEndCallback = processEndCallback if (i + 1 < handlers.size) { diff --git a/app/src/main/java/com/gh/common/chain/DownloadChainHandler.kt b/app/src/main/java/com/gh/common/chain/DownloadChainHandler.kt new file mode 100644 index 0000000000..fd28ffe7a1 --- /dev/null +++ b/app/src/main/java/com/gh/common/chain/DownloadChainHandler.kt @@ -0,0 +1,40 @@ +package com.gh.common.chain + +import android.content.Context +import com.gh.gamecenter.feature.entity.GameEntity + +abstract class DownloadChainHandler { + private var next: DownloadChainHandler? = null + + // asVGame: 当前下载是否以畅玩游戏来进行 + var processEndCallback: ((asVGame: Boolean, Any?) -> Unit)? = null + + /** + * 设置下一个处理者 + */ + fun setNext(next: DownloadChainHandler?) { + this.next = next + } + + /** + * 获取下一个处理者 + */ + fun getNext(): DownloadChainHandler? { + return next + } + + /** + * 是否存在下一个处理者 + */ + fun hasNext(): Boolean { + return next != null + } + + /** + * 处理请求 + * @param gameEntity 游戏实体 + * @param asVGame 是否作为畅玩游戏进行 + */ + abstract fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/chain/DownloadDialogHelperHandler.kt b/app/src/main/java/com/gh/common/chain/DownloadDialogHelperHandler.kt index 29d1ff02b6..bbbc849edb 100644 --- a/app/src/main/java/com/gh/common/chain/DownloadDialogHelperHandler.kt +++ b/app/src/main/java/com/gh/common/chain/DownloadDialogHelperHandler.kt @@ -3,21 +3,18 @@ package com.gh.common.chain import android.content.Context import com.gh.common.util.DownloadDialogHelper import com.gh.gamecenter.common.utils.safelyGetInRelease -import com.gh.gamecenter.core.utils.EmptyCallback import com.gh.gamecenter.feature.entity.GameEntity -class DownloadDialogHelperHandler : ChainHandler() { +class DownloadDialogHelperHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { val apk = gameEntity.getApk().safelyGetInRelease(0) ?: return - DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk, object : EmptyCallback { - override fun onCallback() { - if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) - } else { - processEndCallback?.invoke(null) - } + DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk) { + if (hasNext()) { + getNext()?.handleRequest(context, gameEntity, asVGame) + } else { + processEndCallback?.invoke(asVGame, null) } - }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/chain/GamePermissionHandler.kt b/app/src/main/java/com/gh/common/chain/GamePermissionHandler.kt index 1fd3d6eb7c..31bd684a11 100644 --- a/app/src/main/java/com/gh/common/chain/GamePermissionHandler.kt +++ b/app/src/main/java/com/gh/common/chain/GamePermissionHandler.kt @@ -5,14 +5,14 @@ import androidx.appcompat.app.AppCompatActivity import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment -class GamePermissionHandler : ChainHandler() { +class GamePermissionHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { GamePermissionDialogFragment.show((context as AppCompatActivity), gameEntity, gameEntity.info) { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } } diff --git a/app/src/main/java/com/gh/common/chain/LandPageAddressHandler.kt b/app/src/main/java/com/gh/common/chain/LandPageAddressHandler.kt index ea49101f78..ea68e0491d 100644 --- a/app/src/main/java/com/gh/common/chain/LandPageAddressHandler.kt +++ b/app/src/main/java/com/gh/common/chain/LandPageAddressHandler.kt @@ -5,18 +5,18 @@ import com.gh.common.util.DialogUtils import com.gh.common.util.DirectUtils import com.gh.gamecenter.feature.entity.GameEntity -class LandPageAddressHandler : ChainHandler() { +class LandPageAddressHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { if (gameEntity.isLandPageAddressDialog()) { DialogUtils.showLandPageAddressDialog(context, gameEntity) {// 跳转第三方落地页 DirectUtils.directToExternalBrowser(context, gameEntity.landPageAddressDialog!!.link!!) } } else { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } } diff --git a/app/src/main/java/com/gh/common/chain/OverseaDownloadHandler.kt b/app/src/main/java/com/gh/common/chain/OverseaDownloadHandler.kt index c167d4238a..d3e6a5f89a 100644 --- a/app/src/main/java/com/gh/common/chain/OverseaDownloadHandler.kt +++ b/app/src/main/java/com/gh/common/chain/OverseaDownloadHandler.kt @@ -4,22 +4,22 @@ import android.content.Context import com.gh.common.util.DialogUtils import com.gh.gamecenter.feature.entity.GameEntity -class OverseaDownloadHandler : ChainHandler() { +class OverseaDownloadHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { if (gameEntity.isOverseaAddressDialog()) { DialogUtils.showOverseaDownloadDialog(context, gameEntity) {// 跳转海外下载地址弹窗 if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } } else { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } } diff --git a/app/src/main/java/com/gh/common/chain/PackageCheckHandler.kt b/app/src/main/java/com/gh/common/chain/PackageCheckHandler.kt index 5a5806768b..25b0651c07 100644 --- a/app/src/main/java/com/gh/common/chain/PackageCheckHandler.kt +++ b/app/src/main/java/com/gh/common/chain/PackageCheckHandler.kt @@ -5,14 +5,14 @@ import androidx.appcompat.app.AppCompatActivity import com.gh.common.dialog.PackageCheckDialogFragment import com.gh.gamecenter.feature.entity.GameEntity -class PackageCheckHandler : ChainHandler() { +class PackageCheckHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { PackageCheckDialogFragment.show((context as AppCompatActivity), gameEntity) { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } } diff --git a/app/src/main/java/com/gh/common/chain/UnsupportedFeatureHandler.kt b/app/src/main/java/com/gh/common/chain/UnsupportedFeatureHandler.kt index aa57fd15ab..262d31acf7 100644 --- a/app/src/main/java/com/gh/common/chain/UnsupportedFeatureHandler.kt +++ b/app/src/main/java/com/gh/common/chain/UnsupportedFeatureHandler.kt @@ -4,18 +4,20 @@ import android.content.Context import com.gh.gamecenter.common.utils.DialogHelper import com.gh.gamecenter.feature.entity.GameEntity -class UnsupportedFeatureHandler : ChainHandler() { +class UnsupportedFeatureHandler : DownloadChainHandler() { override fun handleRequest( - context: Context, gameEntity: GameEntity + context: Context, + gameEntity: GameEntity, + asVGame: Boolean ) { if (shouldShowUnsupportedFeatureDialog()) { DialogHelper.showUnsupportedFeatureDialog(context) } else { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } } diff --git a/app/src/main/java/com/gh/common/chain/UpdateNewSimulatorHandler.kt b/app/src/main/java/com/gh/common/chain/UpdateNewSimulatorHandler.kt index 4bd9d27501..c405d6d556 100644 --- a/app/src/main/java/com/gh/common/chain/UpdateNewSimulatorHandler.kt +++ b/app/src/main/java/com/gh/common/chain/UpdateNewSimulatorHandler.kt @@ -5,31 +5,27 @@ import com.gh.common.simulator.NewSimulatorGameManager import com.gh.common.simulator.SimulatorGameManager import com.gh.gamecenter.feature.entity.GameEntity -class UpdateNewSimulatorHandler: ChainHandler() { +class UpdateNewSimulatorHandler: DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { if (SimulatorGameManager.isSimulatorGame(gameEntity)) { if (NewSimulatorGameManager.shouldShowUpdateNewSimulatorAlert(context)) { NewSimulatorGameManager.showUpdateNewsSimulator(context, gameEntity) { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } - } - else{ + } else { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } } - } - else{ + } else { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } } - - } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/chain/ValidateVSpaceHandler.kt b/app/src/main/java/com/gh/common/chain/ValidateVSpaceHandler.kt index 49c567d4f5..08295dde10 100644 --- a/app/src/main/java/com/gh/common/chain/ValidateVSpaceHandler.kt +++ b/app/src/main/java/com/gh/common/chain/ValidateVSpaceHandler.kt @@ -4,15 +4,23 @@ import android.content.Context import com.gh.gamecenter.feature.entity.GameEntity import com.gh.vspace.VHelper -class ValidateVSpaceHandler : ChainHandler() { +class ValidateVSpaceHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { - VHelper.validateVSpaceBeforeAction(context, gameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { + val closure = { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } + + if (asVGame) { + VHelper.validateVSpaceBeforeAction(context, gameEntity) { + closure.invoke() + } + } else { + closure.invoke() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/chain/VersionNumberHandler.kt b/app/src/main/java/com/gh/common/chain/VersionNumberHandler.kt index 6e0435fec8..d3e4885f94 100644 --- a/app/src/main/java/com/gh/common/chain/VersionNumberHandler.kt +++ b/app/src/main/java/com/gh/common/chain/VersionNumberHandler.kt @@ -7,14 +7,14 @@ import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.toResString import com.gh.gamecenter.feature.entity.GameEntity -class VersionNumberHandler : ChainHandler() { +class VersionNumberHandler : DownloadChainHandler() { - override fun handleRequest(context: Context, gameEntity: GameEntity) { + override fun handleRequest(context: Context, gameEntity: GameEntity, asVGame: Boolean) { val confirmCallback = { if (hasNext()) { - getNext()?.handleRequest(context, gameEntity) + getNext()?.handleRequest(context, gameEntity, asVGame) } else { - processEndCallback?.invoke(null) + processEndCallback?.invoke(asVGame, null) } } if (!gameEntity.isShowVersionNumber()) { diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index c3208c4da3..c4b73b5bb6 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -3,27 +3,21 @@ package com.gh.common.databind; import android.content.Context; import android.content.Intent; import android.graphics.Color; -import android.graphics.Typeface; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; -import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -import androidx.core.content.ContextCompat; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import com.facebook.drawee.view.SimpleDraweeView; import com.gh.common.chain.BrowserInstallHandler; import com.gh.common.chain.CertificationHandler; -import com.gh.common.chain.ChainBuilder; -import com.gh.common.chain.ChainHandler; +import com.gh.common.chain.DownloadChainBuilder; +import com.gh.common.chain.DownloadChainHandler; import com.gh.common.chain.CheckDownloadHandler; import com.gh.common.chain.CheckStoragePermissionHandler; import com.gh.common.chain.DownloadDialogHelperHandler; @@ -46,7 +40,6 @@ import com.gh.common.util.DialogUtils; import com.gh.common.util.GameUtils; import com.gh.common.util.GameViewUtils; import com.gh.common.util.LogUtils; -import com.gh.common.util.NewsUtils; import com.gh.common.util.PackageInstaller; import com.gh.common.util.PackageLauncher; import com.gh.common.util.PackageUtils; @@ -57,26 +50,16 @@ import com.gh.download.server.BrowserInstallHelper; import com.gh.gamecenter.DownloadManagerActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.WebActivity; -import com.gh.gamecenter.common.baselist.LoadStatus; -import com.gh.gamecenter.common.callback.OnViewClickListener; import com.gh.gamecenter.common.entity.LinkEntity; -import com.gh.gamecenter.common.eventbus.EBReuse; import com.gh.gamecenter.common.utils.DarkModeUtils; import com.gh.gamecenter.common.utils.ExtensionsKt; -import com.gh.gamecenter.common.utils.ImageUtils; import com.gh.gamecenter.common.utils.NewFlatLogUtils; import com.gh.gamecenter.common.utils.SensorsBridge; -import com.gh.gamecenter.common.view.DrawableView; -import com.gh.gamecenter.core.utils.DisplayUtils; import com.gh.gamecenter.core.utils.MtaHelper; -import com.gh.gamecenter.core.utils.NumberUtils; import com.gh.gamecenter.core.utils.ToastUtils; -import com.gh.gamecenter.databinding.KaifuDetailItemRowBinding; import com.gh.gamecenter.feature.entity.ApkEntity; -import com.gh.gamecenter.feature.entity.CommunityVideoEntity; import com.gh.gamecenter.feature.entity.GameEntity; import com.gh.gamecenter.feature.entity.PluginLocation; -import com.gh.gamecenter.feature.entity.ServerCalendarEntity; import com.gh.gamecenter.feature.entity.TagStyleEntity; import com.gh.gamecenter.feature.entity.TestEntity; import com.gh.gamecenter.feature.exposure.ExposureEvent; @@ -85,14 +68,11 @@ import com.gh.gamecenter.feature.view.DownloadButton; import com.gh.gamecenter.feature.view.GameIconView; import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment; import com.gh.gamecenter.manager.PackagesManager; -import com.gh.vspace.VDownloadManagerActivity; import com.gh.vspace.VHelper; import com.lightgame.download.DownloadEntity; import com.lightgame.download.FileUtils; import com.lightgame.utils.Utils; -import org.greenrobot.eventbus.EventBus; - import java.io.File; import java.util.ArrayList; import java.util.List; @@ -100,134 +80,8 @@ import java.util.List; /** * Created by khy on 12/02/18. */ - public class BindingAdapters { - public static void loadIcon(SimpleDraweeView view, String imageUrl) { - ImageUtils.displayIcon(view, imageUrl); - } - - public static void loadImage(SimpleDraweeView view, String imageUrl) { - ImageUtils.display(view, imageUrl); - } - - public static void setTextSize(TextView view, int number) { - view.setTextSize(number); - } - - public static void setTypeface(TextView view, String type) { - if (type == null) return; - - switch (type) { - case "bold": - view.setTypeface(null, Typeface.BOLD); - break; - case "italic": - view.setTypeface(null, Typeface.ITALIC); - break; - case "bold_italic": - view.setTypeface(null, Typeface.BOLD_ITALIC); - break; - default: - view.setTypeface(null, Typeface.NORMAL); - break; - } - } - - public static void addDetailKaiFuView(LinearLayout view, List list - , OnViewClickListener listener, Boolean isReadyPatch) { - if (list == null) return; - view.removeAllViews(); - for (int i = 0; i < list.size() + 1; i++) { // 1 is Title - View inflate = LayoutInflater.from(view.getContext()).inflate(R.layout.kaifu_detail_item_row, null); - KaifuDetailItemRowBinding binding = KaifuDetailItemRowBinding.bind(inflate); - binding.getRoot().setBackgroundColor(isReadyPatch != null && isReadyPatch ? ExtensionsKt.toColor(R.color.theme) : ExtensionsKt.toColor(R.color.white)); - binding.getRoot().setPadding(DisplayUtils.dip2px(1), DisplayUtils.dip2px(1), DisplayUtils.dip2px(1), i == list.size() ? DisplayUtils.dip2px(1) : 0); - ServerCalendarEntity serverEntity = list.get(i - 1); - binding.timeTv.setText(i == 0 ? "时间" : serverEntity.getFormatTime("HH:mm")); - binding.remarkTv.setText(i == 0 ? "备注" : serverEntity.getRemark()); - binding.nameTv.setText(i == 0 ? "名字" : (TextUtils.isEmpty(serverEntity.getNote()) ? "-" : serverEntity.getNote())); - if (i != 0) { - binding.getRoot().setOnClickListener(v -> { - listener.onClick(v, isReadyPatch != null && isReadyPatch ? serverEntity : null); - }); - - // 滑动冲突处理 - binding.getRoot().setOnTouchListener((v, event) -> { - if (list.size() > 5) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { - EventBus.getDefault().post(new EBReuse("CalenderDown")); - } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { - EventBus.getDefault().post(new EBReuse("CalenderCancel")); - } - } - return false; - }); - } - view.addView(inflate); - } - } - - // 如果超过10000,则转换为1.0W - public static void transSimpleCount(TextView view, int count) { - view.setText(NumberUtils.transSimpleCount(count)); - } - - public static void textColorFromString(TextView tv, String hexString) { - if (TextUtils.isEmpty(hexString)) return; - - try { - tv.setTextColor(Color.parseColor(hexString)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void showHide(View view, Boolean show) { - if (show != null && show) { - view.setVisibility(View.VISIBLE); - } else { - view.setVisibility(View.GONE); - } - } - - public static void goneIf(View view, Boolean gone) { - if (gone != null && gone) { - view.setVisibility(View.GONE); - } else { - view.setVisibility(View.VISIBLE); - } - } - - /** - * lazy 的 paddingTop - */ - public static void lazyPaddingLeft(View view, int paddingLeftInDp) { - view.setPadding(DisplayUtils.dip2px(paddingLeftInDp), view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()); - } - - /** - * lazy 的 paddingTop - */ - public static void lazyPaddingTop(View view, int paddingTopInDp) { - view.setPadding(view.getPaddingLeft(), DisplayUtils.dip2px(paddingTopInDp), view.getPaddingRight(), view.getPaddingBottom()); - } - - /** - * lazy 的 paddingBottom - */ - public static void lazyPaddingBottom(View view, int paddingBottomInDp) { - view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), DisplayUtils.dip2px(paddingBottomInDp)); - } - - public static void visibleInvisible(View view, Boolean show) { - if (show != null && show) { - view.setVisibility(View.VISIBLE); - } else { - view.setVisibility(View.INVISIBLE); - } - } - public static void setMessageUnread(TextView view, int unreadCount) { if (unreadCount < 100) { view.setText(String.valueOf(unreadCount)); @@ -236,119 +90,12 @@ public class BindingAdapters { } } - public static void setServerTypePadding(TextView view, String serverType) { - int paddRight = 0; - if (TextUtils.isEmpty(serverType)) { - } else { - if ("删档内测".equals(serverType) || "不删档内测".equals(serverType)) { - if ("删档内测".equals(serverType)) { - paddRight = DisplayUtils.dip2px(view.getContext(), 50); - } else { - paddRight = DisplayUtils.dip2px(view.getContext(), 60); - } - } else { - paddRight = DisplayUtils.dip2px(view.getContext(), 30); - } - } - view.setPadding(0, 0, paddRight, 0); - } - - public static void setServerType(TextView view, String serverType) { - view.setText(serverType); - if ("删档内测".equals(serverType) || "不删档内测".equals(serverType)) { - view.setBackgroundResource(R.drawable.textview_server_tag); - } else { - view.setBackgroundResource(R.drawable.textview_orange_up); - } - } - public static void setGame(View view, GameEntity gameEntity) { if (gameEntity != null && view instanceof GameIconView) { ((GameIconView) view).displayGameIcon(gameEntity); } } - public static void setGameIcon(View view, GameEntity gameEntity) { - if (gameEntity != null && view instanceof GameIconView) { - ((GameIconView) view).displayGameIcon(gameEntity.getIcon(), gameEntity.getIconSubscript(), gameEntity.getIconFloat()); - } - } - - public static void setArticleType(TextView view, String articleType) { - NewsUtils.setNewsType(view, articleType, 0, 0); - } - - public static void setDetailDownloadText(TextView view, GameEntity gameEntity) { - if (gameEntity == null || gameEntity.getApk().isEmpty()) { - view.setBackgroundResource(R.drawable.game_item_btn_pause_style); - view.setTextColor(0xFF999999); - view.setClickable(false); - } - } - - public static void setLiBaoBtn(TextView view, String status) { - if (TextUtils.isEmpty(status)) return; - switch (status) { - case "coming": - view.setText(R.string.libao_coming); - view.setBackgroundResource(R.drawable.textview_blue_style); - break; - case "ling": - view.setText(R.string.libao_ling); - view.setBackgroundResource(R.drawable.textview_green_style); - break; - case "tao": - view.setText(R.string.libao_tao); - view.setBackgroundResource(R.drawable.textview_orange_style); - break; - case "used_up": - view.setText(R.string.libao_used_up); - view.setBackgroundResource(R.drawable.textview_cancel_up); - break; - case "finish": - view.setText(R.string.libao_finish); - view.setBackgroundResource(R.drawable.textview_cancel_up); - break; - case "linged": - view.setText(R.string.libao_linged); - view.setBackgroundResource(R.drawable.libao_linged_style); - view.setTextColor(ContextCompat.getColorStateList(view.getContext(), R.color.libao_linged_selector)); - break; - case "taoed": - view.setText(R.string.libao_taoed); - view.setBackgroundResource(R.drawable.libao_taoed_style); - view.setTextColor(ContextCompat.getColorStateList(view.getContext(), R.color.libao_taoed_selector)); - break; - case "copy": - view.setText(R.string.libao_copy); - view.setBackgroundResource(R.drawable.textview_blue_style); - break; - case "repeatLing": - view.setText(R.string.libao_repeat_ling); - view.setBackgroundResource(R.drawable.textview_cancel_up); - break; - case "repeatLinged": - view.setText(R.string.libao_repeat_ling); - view.setBackgroundResource(R.drawable.textview_green_style); - break; - case "repeatTao": - view.setText(R.string.libao_repeat_tao); - view.setBackgroundResource(R.drawable.textview_cancel_up); - break; - case "repeatTaoed": - view.setText(R.string.libao_repeat_tao); - view.setBackgroundResource(R.drawable.textview_orange_style); - break; - case "unshelve": - view.setBackgroundResource(R.drawable.textview_cancel_style); - view.setText(R.string.libao_unshelve); - break; - default: - view.setBackgroundResource(R.drawable.textview_cancel_style); - view.setText("异常"); - } - } - // 大图下的进度条 public static void setDownloadButton(DownloadButton progressBar, GameEntity gameEntity, @@ -376,13 +123,9 @@ public class BindingAdapters { switch (progressBar.getButtonStyle()) { case DOWNLOADING_PLUGIN: case DOWNLOADING_NORMAL: - if (gameEntity.isVGame()) { - v.getContext().startActivity(VDownloadManagerActivity.getIntent(v.getContext(), true)); - } else { - Intent intent = DownloadManagerActivity.getDownloadMangerIntent(v.getContext(), - gameEntity.getApk().get(0).getUrl(), entrance); - v.getContext().startActivity(intent); - } + Intent intent = DownloadManagerActivity.getDownloadMangerIntent(v.getContext(), + gameEntity.getApk().get(0).getUrl(), entrance); + v.getContext().startActivity(intent); break; case NONE: Utils.toast(v.getContext(), "该游戏已关闭下载"); @@ -405,7 +148,7 @@ public class BindingAdapters { } } - ChainBuilder builder = new ChainBuilder(); + DownloadChainBuilder builder = new DownloadChainBuilder(); builder.addHandler(new UnsupportedFeatureHandler()); builder.addHandler(new GamePermissionHandler()); builder.addHandler(new CheckStoragePermissionHandler()); @@ -419,22 +162,33 @@ public class BindingAdapters { builder.addHandler(new OverseaDownloadHandler()); builder.addHandler(new CheckDownloadHandler()); - builder.setProcessEndCallback(o -> { - download(v.getContext(), progressBar, gameEntity, traceEvent, (boolean) o, entrance, location); + builder.setProcessEndCallback((asVGame, isSubscribe) -> { + download(v.getContext(), + progressBar, + gameEntity, + traceEvent, + asVGame, + (boolean) isSubscribe, + entrance, + location); return null; }); - final ChainHandler chainHandler = builder.buildHandlerChain(); + final DownloadChainHandler chainHandler = builder.buildHandlerChain(); if (chainHandler != null) { - chainHandler.handleRequest(v.getContext(), gameEntity); + chainHandler.handleRequest( + v.getContext(), + gameEntity, + GameUtils.shouldPerformAsVGame(gameEntity) + ); } } else { - ChainBuilder builder = new ChainBuilder(); + DownloadChainBuilder builder = new DownloadChainBuilder(); builder.addHandler(new UnsupportedFeatureHandler()); builder.addHandler(new GamePermissionHandler()); builder.addHandler(new CertificationHandler()); builder.addHandler(new VersionNumberHandler()); - builder.setProcessEndCallback(o -> { + builder.setProcessEndCallback((asVGame, isSubscribe) -> { DownloadDialog.showDownloadDialog( v.getContext(), gameEntity, @@ -443,9 +197,13 @@ public class BindingAdapters { location + ":" + gameEntity.getName()); return null; }); - final ChainHandler chainHandler = builder.buildHandlerChain(); + final DownloadChainHandler chainHandler = builder.buildHandlerChain(); if (chainHandler != null) { - chainHandler.handleRequest(v.getContext(), gameEntity); + chainHandler.handleRequest( + v.getContext(), + gameEntity, + GameUtils.shouldPerformAsVGame(gameEntity) + ); } } } @@ -458,7 +216,14 @@ public class BindingAdapters { if (downloadEntity != null) { File file = new File(downloadEntity.getPath()); if (!file.exists()) { - download(v.getContext(), progressBar, gameEntity, traceEvent, false, entrance, location); + download(v.getContext(), + progressBar, + gameEntity, + traceEvent, + false, + false, + entrance, + location); return; } @@ -467,12 +232,7 @@ public class BindingAdapters { return; } - if (gameEntity.isVGame()) { - VHelper.installOrLaunch((AppCompatActivity) v.getContext(), gameEntity, null); - return; - } - - PackageLauncher.launchApp(v.getContext(), gameEntity, gameEntity.getApk().get(0).getPackageName()); + PackageLauncher.launch(v.getContext(), gameEntity, null); } else { DownloadDialog.showDownloadDialog( v.getContext(), @@ -500,13 +260,12 @@ public class BindingAdapters { DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity); - if (gameEntity.isVGame()) { - VHelper.installOrLaunch(v.getContext(), gameEntity, null); - return; - } - if (downloadEntity != null) { - PackageInstaller.install(v.getContext(), downloadEntity); + if (ExtensionsKt.isLocalDownloadInDualDownloadMode(downloadEntity)) { + PackageInstaller.install(v.getContext(), downloadEntity); + } else { + VHelper.installOrLaunch(v.getContext(), gameEntity, null); + } } } break; @@ -592,7 +351,7 @@ public class BindingAdapters { } } else { - String status = GameUtils.getDownloadBtnText(progressBar.getContext(), gameEntity, PluginLocation.only_game); + String status = GameUtils.getDownloadBtnText(progressBar.getContext(), gameEntity, true, false, PluginLocation.only_game); switch (status) { case "插件化": progressBar.setButtonStyle(DownloadButton.ButtonStyle.PLUGIN); @@ -664,24 +423,6 @@ public class BindingAdapters { } } - /*private static void download(DownloadProgressBar progressBar, GameEntity gameEntity, ExposureEvent traceEvent, @Nullable String entrance, @Nullable String location, View v) { - if (gameEntity.getApk().size() == 1) { - ApkEntity apk = gameEntity.getApk().get(0); - DownloadDialogHelper.findAvailableDialogAndShow( - v.getContext(), - gameEntity, - apk, - () -> { - DialogUtils.checkDownload(v.getContext(), apk.getSize(), - isSubscribe -> download(progressBar, gameEntity, traceEvent, isSubscribe, entrance, location)); - }); - } else { - DownloadDialog.getInstance(v.getContext()).showPopupWindow(v, gameEntity, - entrance, location + gameEntity.getName(), traceEvent); - } - }*/ - - private static void updateReservation(DownloadButton progressBar, GameEntity gameEntity) { // 显示预约 if (gameEntity.isReservable()) { @@ -701,45 +442,35 @@ public class BindingAdapters { DownloadButton progressBar, GameEntity gameEntity, ExposureEvent traceEvent, + boolean asVGame, boolean isSubscribe, String entrance, String location) { if (BrowserInstallHelper.shouldAutoSwitchAssistantInstall(gameEntity)) { ToastUtils.toast(context.getString(R.string.unsupported_browser_install_hint)); } - String str = progressBar.getText().toString(); - String method; - if (str.contains("更新")) { - method = "更新"; - } else if (str.contains("插件化")) { - method = "插件化"; - } else { - method = progressBar.getContext().getString(R.string.download); - } + String buttonText = progressBar.getText(); ApkEntity apkEntity = gameEntity.getApk().get(0); String msg = FileUtils.isCanDownload(progressBar.getContext(), apkEntity.getSize()); if (TextUtils.isEmpty(msg)) { DownloadManager.createDownload(progressBar.getContext(), apkEntity, gameEntity, - method, + asVGame, + gameEntity.isDualBtnModeEnabled(), entrance, location + gameEntity.getName(), isSubscribe, traceEvent); progressBar.setProgress(0); - progressBar.setButtonStyle("插件化".equals(method) ? + progressBar.setButtonStyle(buttonText.contains("插件化") ? DownloadButton.ButtonStyle.DOWNLOADING_PLUGIN : DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); } else { Utils.toast(progressBar.getContext(), msg); } } - public static void setGameLabelList(LinearLayout layout, List tagStyle) { - GameViewUtils.setLabelList(layout.getContext(), layout, tagStyle); - } - // 包含测试开服标签 public static void setGameTags(LinearLayout layout, GameEntity gameEntity) { try { @@ -809,12 +540,6 @@ public class BindingAdapters { } } - public static void isRefreshing(SwipeRefreshLayout layout, LoadStatus status) { - if (status != LoadStatus.INIT_LOADING && status != LoadStatus.LIST_LOADING) { - layout.setRefreshing(false); - } - } - public static void setGameName(TextView view, GameEntity game, boolean isShowPlatform, @Nullable Boolean isShowSuffix) { if (isShowSuffix == null) isShowSuffix = true; // 默认显示 String gameName; @@ -836,30 +561,6 @@ public class BindingAdapters { } - public static void setCommunityImage(SimpleDraweeView imageView, List images, List videos) { - if (videos.size() > 0) { - CommunityVideoEntity videoEntity = videos.get(0); - ImageUtils.display(imageView, videoEntity.getPoster()); - imageView.setVisibility(View.VISIBLE); - } else if (images.size() > 0) { - imageView.setVisibility(View.VISIBLE); - ImageUtils.display(imageView, images.get(0)); - } else { - imageView.setVisibility(View.GONE); - } - } - - public static void setCommunityVideoDuration(TextView mVideoDuration, List videos) { - if (videos != null && videos.size() > 0) { - CommunityVideoEntity videoEntity = videos.get(0); - mVideoDuration.setBackground(DrawableView.getOvalDrawable(R.color.black_alpha_50, 999F)); - mVideoDuration.setText(videoEntity.getDuration()); - mVideoDuration.setVisibility(View.VISIBLE); - } else { - mVideoDuration.setVisibility(View.GONE); - } - } - public static void setGameTags(TextView view, List tags, int maxTags) { if (tags == null) { view.setText(""); @@ -887,16 +588,4 @@ public class BindingAdapters { } view.setText(span); } - - public static void setVideoData(TextView view, int count) { - if (count > 0) { - ExtensionsKt.setDrawableStart(view, ContextCompat.getDrawable(view.getContext(), R.drawable.ic_video_data_up), null, null); - view.setTextColor(ContextCompat.getColor(view.getContext(), R.color.text_EA3333)); - view.setText(count + ""); - } else { - ExtensionsKt.removeDrawable(view); - view.setTextColor(ContextCompat.getColor(view.getContext(), R.color.text_subtitleDesc)); - view.setText("-"); - } - } } diff --git a/app/src/main/java/com/gh/common/exposure/ExposureUtils.kt b/app/src/main/java/com/gh/common/exposure/ExposureUtils.kt index d955f119c6..c1bb42cdf7 100644 --- a/app/src/main/java/com/gh/common/exposure/ExposureUtils.kt +++ b/app/src/main/java/com/gh/common/exposure/ExposureUtils.kt @@ -96,9 +96,9 @@ object ExposureUtils { } @JvmStatic - fun getDownloadType(apkEntity: ApkEntity, gameId: String, isVGame: Boolean): DownloadType { + fun getDownloadType(apkEntity: ApkEntity, gameId: String, asVGame: Boolean): DownloadType { return when { - isVGame -> getVGameDownloadType(apkEntity, gameId) + asVGame -> getVGameDownloadType(apkEntity, gameId) PackageUtils.isInstalled( HaloApp.getInstance().application, apkEntity.packageName @@ -109,7 +109,7 @@ object ExposureUtils { private fun getVGameDownloadType(apkEntity: ApkEntity, gameId: String): DownloadType { return when { - PackagesManager.isCanUpdate(gameId, apkEntity.packageName) -> DownloadType.FUN_UPDATE + PackagesManager.isCanUpdate(gameId, apkEntity.packageName, asVGame = true) -> DownloadType.FUN_UPDATE else -> DownloadType.FUN_DOWNLOAD } } diff --git a/app/src/main/java/com/gh/common/provider/DownloadButtonClickedProviderImpl.kt b/app/src/main/java/com/gh/common/provider/DownloadButtonClickedProviderImpl.kt index 4fdde3167f..4a67de59ee 100644 --- a/app/src/main/java/com/gh/common/provider/DownloadButtonClickedProviderImpl.kt +++ b/app/src/main/java/com/gh/common/provider/DownloadButtonClickedProviderImpl.kt @@ -3,6 +3,7 @@ package com.gh.common.provider import android.content.Context import com.alibaba.android.arouter.facade.annotation.Route import com.gh.common.util.NewFlatLogUtils +import com.gh.gamecenter.R import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.gamecenter.common.constant.RouteConsts import com.gh.gamecenter.common.exposure.ExposureSource @@ -39,13 +40,16 @@ class DownloadButtonClickedProviderImpl : IDownloadButtonClickedProvider { gameId = boundedObject.id gameName = boundedObject.name ?: "" gameCategory = boundedObject.category ?: "" - downloadStatus = if (boundedObject.isVGame()) { - "畅玩" - } else if (boundedObject.downloadStatus == "demo") { - "试玩" - } else { - "下载" - } + downloadStatus = + if (boundedObject.isVGamePreferred()) { + "畅玩" + } else { + if (boundedObject.downloadStatus == "demo") { + "试玩" + } else { + "下载" + } + } gameTypeInChinese = boundedObject.categoryChinese downloadStatusInChinese = boundedObject.downloadStatusChinese gameSchemaType = boundedObject.gameBitChinese @@ -68,7 +72,7 @@ class DownloadButtonClickedProviderImpl : IDownloadButtonClickedProvider { gameId = boundedObject.gameId gameName = boundedObject.name ?: "" gameCategory = boundedObject.getGameCategory() - downloadStatus = if (boundedObject.isVGame()) "畅玩" else "下载" + downloadStatus = if (boundedObject.asVGame()) "畅玩" else "下载" packageName = boundedObject.packageName exposureSourceList = boundedObject.exposureTrace?.toObject()?.source } @@ -93,9 +97,18 @@ class DownloadButtonClickedProviderImpl : IDownloadButtonClickedProvider { } // 预约状态不上报 - if (downloadButton.buttonStyle != DownloadButton.ButtonStyle.RESERVABLE - && downloadButton.buttonStyle != DownloadButton.ButtonStyle.RESERVED - ) { + if (downloadButton.buttonStyle == DownloadButton.ButtonStyle.NORMAL + || downloadButton.buttonStyle == DownloadButton.ButtonStyle.PLUGIN) { + + val text = downloadButton.text.ifEmpty { + downloadButton.getTag(R.string.download) ?: "" + }.toString() + + val downloadType = if (text.contains("畅玩")) { + "畅玩下载" + } else { + "本地下载" + } // 上报神策点击事件 SensorsBridge.trackEventWithExposureSource( @@ -107,6 +120,7 @@ class DownloadButtonClickedProviderImpl : IDownloadButtonClickedProvider { "download_status", downloadStatusInChinese, "button_name", downloadButton.text, "game_schema_type", gameSchemaType, + "download_type", downloadType, "page_name", GlobalActivityManager.getCurrentPageEntity().pageName, "page_id", GlobalActivityManager.getCurrentPageEntity().pageId, "page_business_id", GlobalActivityManager.getCurrentPageEntity().pageBusinessId, diff --git a/app/src/main/java/com/gh/common/provider/PackageInstallerProviderImpl.kt b/app/src/main/java/com/gh/common/provider/PackageInstallerProviderImpl.kt index aa8a3bf2b5..442ed57b4e 100644 --- a/app/src/main/java/com/gh/common/provider/PackageInstallerProviderImpl.kt +++ b/app/src/main/java/com/gh/common/provider/PackageInstallerProviderImpl.kt @@ -11,7 +11,7 @@ import com.lightgame.download.DownloadEntity class PackageInstallerProviderImpl : IPackageInstallerProvider { override fun install(context: Context, downloadEntity: DownloadEntity, showUnzipToast: Boolean) { - PackageInstaller.install(context, downloadEntity, showUnzipToast) + PackageInstaller.install(context, downloadEntity, showUnzipToast, false) } override fun uninstall(context: Context, path: String) { diff --git a/app/src/main/java/com/gh/common/provider/VHelperProviderImpl.kt b/app/src/main/java/com/gh/common/provider/VHelperProviderImpl.kt index 7d21de14bb..e490b1019f 100644 --- a/app/src/main/java/com/gh/common/provider/VHelperProviderImpl.kt +++ b/app/src/main/java/com/gh/common/provider/VHelperProviderImpl.kt @@ -8,14 +8,6 @@ import com.gh.vspace.VHelper @Route(path = RouteConsts.provider.vhelper, name = "VHelper暴露服务") class VHelperProviderImpl: IVHelperProvider { - override fun getPlatformV(): String { - return VHelper.PLATFORM_V - } - - override fun getVUrl(originUrl: String?): String { - return VHelper.getVUrl(originUrl) - } - override fun isVGameOn(): Boolean { return VHelper.isVGameOn() } diff --git a/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java b/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java index 03357c83fb..39dd76a6a9 100644 --- a/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java +++ b/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java @@ -1,16 +1,20 @@ package com.gh.common.util; +import android.content.Context; import android.text.TextUtils; import android.view.View; +import android.widget.TextView; import com.gh.common.constant.Config; import com.gh.common.filter.RegionSetting; import com.gh.common.filter.RegionSettingHelper; import com.gh.common.repository.ReservationRepository; import com.gh.common.simulator.SimulatorGameManager; -import com.gh.gamecenter.feature.view.DownloadButton; import com.gh.common.xapk.XapkInstaller; import com.gh.common.xapk.XapkUnzipStatus; +import com.gh.gamecenter.feature.entity.GameEntity; +import com.gh.gamecenter.feature.entity.PluginLocation; +import com.gh.gamecenter.feature.view.DownloadButton; import com.gh.download.DownloadManager; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.DetailViewHolder; @@ -18,7 +22,6 @@ import com.gh.gamecenter.common.constant.Constants; import com.gh.gamecenter.common.entity.LinkEntity; import com.gh.gamecenter.common.utils.ExtensionsKt; import com.gh.gamecenter.core.utils.SPUtils; -import com.gh.gamecenter.feature.entity.PluginLocation; import com.gh.gamecenter.manager.PackagesManager; import com.gh.vspace.VHelper; import com.lightgame.download.DownloadEntity; @@ -30,163 +33,125 @@ import java.util.Objects; * Created by khy on 27/06/17. * 详情下载工具类 */ - public class DetailDownloadUtils { - public static void detailInitDownload(DetailViewHolder viewHolder, boolean isCheck) { - String downloadAddWord = viewHolder.gameEntity.getDownloadAddWord(); + public static void updateViewHolder(DetailViewHolder viewHolder) { + updateViewHolder(viewHolder, false); + } + /** + * 更新底部下载区域 + * @param viewHolder 下载区域的包裹 + * @param ignoreDownloadEntity 忽略下载实体(往往用于下载异常时) + */ + public static void updateViewHolder(DetailViewHolder viewHolder, boolean ignoreDownloadEntity) { + GameEntity gameEntity = viewHolder.getGameEntity(); + String downloadAddWord = gameEntity.getDownloadAddWord(); + + // 隐藏下载按钮上的畅玩文案 if (viewHolder.getOverlayTv() != null) { viewHolder.getOverlayTv().setVisibility(View.GONE); } - if (viewHolder.mMultiVersionDownloadTv != null) { - viewHolder.mMultiVersionDownloadTv.setVisibility(View.GONE); + // 多版本下载箭头 + if (viewHolder.getMultiVersionDownloadTv() != null) { + viewHolder.getMultiVersionDownloadTv().setVisibility(View.GONE); } - if (viewHolder.gameEntity != null && Config.isShowDownload(viewHolder.gameEntity.getId()) && !"光环助手".equals(viewHolder.gameEntity.getName())) { - viewHolder.downloadBottom.setVisibility(View.VISIBLE); + // 根据预置的配置更新 ViewHolder 的状态 (譬如青少年模式、下载内容为空等) + if (updateViewHolderWithPredefinedConfig(viewHolder, gameEntity)) { + return; + } + + // 游戏只包含单 APK 的情况 + if (gameEntity.getApk().size() == 1) { + boolean showVGame = false; // 真下载按钮(DownloadButton)是否需要显示为畅玩,包括单按钮显示和双按钮显示 + boolean showDualDownloadButton = false; // 是否显示双下载按钮 + + int gameDownloadMode = gameEntity.getGameDownloadButtonMode(); // 获取游戏的下载按钮模式 + + DownloadEntity downloadEntity = null; + if (!ignoreDownloadEntity) { + downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity); + } + + // 不支持双下载按钮的情况时(新闻详情、礼包详情页),优选一个下载方式显示 + if (!viewHolder.isSupportDualButton()) { + boolean performAsVGame = GameUtils.shouldPerformAsVGame(gameEntity); + if (performAsVGame) { + gameDownloadMode = GameEntity.GAME_DOWNLOAD_BUTTON_MODE_VGAME; + } else { + gameDownloadMode = GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD; + } + } + + if (gameDownloadMode == GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD) { + showVGame = false; + if (viewHolder.getLocalDownloadContainer() != null) { + viewHolder.getLocalDownloadContainer().setVisibility(View.GONE); + } + } else if (gameDownloadMode == GameEntity.GAME_DOWNLOAD_BUTTON_MODE_VGAME) { + showVGame = true; + if (viewHolder.getLocalDownloadContainer() != null) { + viewHolder.getLocalDownloadContainer().setVisibility(View.GONE); + } + } else if (gameDownloadMode == GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DUAL) { + showVGame = true; + showDualDownloadButton = true; + if (viewHolder.getLocalDownloadContainer() != null) { + viewHolder.getLocalDownloadContainer().setVisibility(View.VISIBLE); + } + + // 畅玩未安装,且当前下载的默认类型为"普通下载",且用户未安装时,禁用双按钮,禁用畅玩 + if (!VHelper.isInstalled(gameEntity.getUniquePackageName()) + && !PackagesManager.isInstalled(gameEntity.getUniquePackageName()) + && downloadEntity != null + && ExtensionsKt.isLocalDownloadInDualDownloadMode(downloadEntity) + ) { + viewHolder.getDownloadPb().setVisibility(View.GONE); + if (viewHolder.getOverlayTv() != null) { + viewHolder.getOverlayTv().setVisibility(View.GONE); + } + } else { + viewHolder.getDownloadPb().setVisibility(View.VISIBLE); + } + } + + // 更新默认的下载按钮 + updateWithSingleApk( + gameEntity, + viewHolder, + viewHolder.getDownloadPb(), + downloadAddWord, + showVGame, + showDualDownloadButton, + downloadEntity + ); + + if (showDualDownloadButton) { + // 双下载按钮时更新占位的下载按钮 + updateWithSingleApk( + gameEntity, + viewHolder, + viewHolder.getLocalDownloadButton(), + downloadAddWord, + false, + true, + downloadEntity + ); + } } else { - viewHolder.downloadBottom.setVisibility(View.GONE); - return; - } - - if (SPUtils.getBoolean(Constants.SP_TEENAGER_MODE)) { - viewHolder.mDownloadPb.setText("查看"); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.TEENAGER_MODE); - return; - } - - if (viewHolder.gameEntity.isSpecialDownload()) { - viewHolder.mDownloadPb.setText("查看下载资源"); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.SPECIAL_DOWNLOAD); - return; - } - - if (viewHolder.gameEntity.isReservable()) { - if (!ReservationRepository.thisGameHasBeenReserved(viewHolder.gameEntity.getId())) { - if (TextUtils.isEmpty(downloadAddWord)) { - viewHolder.mDownloadPb.setText(String.format("预约" + "《%s》", viewHolder.gameEntity.getName())); - } else { - viewHolder.mDownloadPb.setText(String.format("预约" + "《%s》%s", viewHolder.gameEntity.getName(), downloadAddWord)); - } - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.RESERVABLE); - } else { - viewHolder.mDownloadPb.setText("已预约《" + viewHolder.gameEntity.getName() + "》"); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.RESERVED); - } - return; - } - - final RegionSetting.GameH5Download gameH5Download = RegionSettingHelper.getGameH5DownloadByGameId(viewHolder.gameEntity.getId()); - if (gameH5Download != null) { - viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.gameEntity.getDownloadOffText()) ? "查看详情" : viewHolder.gameEntity.getDownloadOffText()); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.NORMAL); - return; - } - - if (viewHolder.gameEntity.isVGame() && !viewHolder.gameEntity.getApk().isEmpty()) { - String status = GameUtils.getDownloadBtnText(viewHolder.context, viewHolder.gameEntity, PluginLocation.only_game); - if (viewHolder.context.getString(R.string.launch).equals(status)) { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN); - } else if (viewHolder.context.getString(R.string.install).equals(status)) { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); - } else { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.NORMAL); - } - - String downloadText; - if (viewHolder.context.getString(R.string.launch).equals(status) || viewHolder.context.getString(R.string.install).equals(status) || viewHolder.context.getString(R.string.download).equals(status)) { - downloadText = ""; - if (viewHolder.getOverlayTv() != null) { - viewHolder.getOverlayTv().setVisibility(View.VISIBLE); - } - } else if (viewHolder.context.getString(R.string.attempt).equals(status)) { - downloadText = status + getDownloadSizeText(viewHolder); - } else { - downloadText = status + (TextUtils.isEmpty(downloadAddWord) ? "" : downloadAddWord) + getDownloadSizeText(viewHolder); - } - viewHolder.mDownloadPb.setText(downloadText); - - DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(viewHolder.gameEntity); - - // 在下载管理找不到下载实体,到畅玩数据库里找 - if (downloadEntity == null && viewHolder.gameEntity.isVGame()) { - String packageName = viewHolder.gameEntity.getUniquePackageName(); - if (!TextUtils.isEmpty(packageName)) { - downloadEntity = VHelper.getVDownloadEntitySnapshot(viewHolder.gameEntity.getId(), packageName); - } - } - - if (downloadEntity != null) { - viewHolder.downloadEntity = downloadEntity; - detailInvalidate(viewHolder); - } - - return; - } - - if (viewHolder.gameEntity.getApk().isEmpty() || viewHolder.gameEntity.getDownloadOffStatus() != null) { - LinkEntity h5LinkEntity = viewHolder.gameEntity.getH5Link(); - - if (h5LinkEntity != null) { - if ("play".equals(h5LinkEntity.getType())) { - String defaultString = String.format("开始玩" + "《%s》", viewHolder.gameEntity.getName()); - viewHolder.mDownloadPb.setText(TextUtils.isEmpty(h5LinkEntity.getText()) ? defaultString : h5LinkEntity.getText()); - } else { - viewHolder.mDownloadPb.setText(TextUtils.isEmpty(h5LinkEntity.getText()) ? "查看" : h5LinkEntity.getText()); - } - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.H5_GAME); - } else { - if ("dialog".equals(viewHolder.gameEntity.getDownloadOffStatus())) { - viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.gameEntity.getDownloadOffText()) ? "查看详情" : viewHolder.gameEntity.getDownloadOffText()); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.NONE_WITH_HINT); - } else if ("updating".equals(viewHolder.gameEntity.getDownloadOffStatus())) { - viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.gameEntity.getDownloadOffText()) ? "更新中" : viewHolder.gameEntity.getDownloadOffText()); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.UPDATING); - } else { - viewHolder.mDownloadPb.setText(TextUtils.isEmpty(viewHolder.gameEntity.getDownloadOffText()) ? "暂无下载" : viewHolder.gameEntity.getDownloadOffText()); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.NONE); - } - } - } else if (viewHolder.gameEntity.getApk().size() == 1) { - String status = GameUtils.getDownloadBtnText(viewHolder.context, viewHolder.gameEntity, PluginLocation.only_game); - if (viewHolder.context.getString(R.string.pluggable).equals(status)) { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.PLUGIN); - } else if (viewHolder.context.getString(R.string.launch).equals(status)) { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN); - } else if (viewHolder.context.getString(R.string.install).equals(status)) { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); - } else { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.NORMAL); - } - - String downloadText; - if (viewHolder.isNewsDetail) { - downloadText = status; - } else if (viewHolder.context.getString(R.string.pluggable).equals(status)) { - downloadText = "升级" + (TextUtils.isEmpty(downloadAddWord) ? "" : "至" + downloadAddWord) + getDownloadSizeText(viewHolder); - } else if (viewHolder.context.getString(R.string.launch).equals(status)) { - downloadText = status + (TextUtils.isEmpty(downloadAddWord) ? "" : "-" + downloadAddWord); - } else if (viewHolder.context.getString(R.string.attempt).equals(status)) { - downloadText = status + getDownloadSizeText(viewHolder); - } else if (viewHolder.context.getString(R.string.install).equals(status)) { - downloadText = viewHolder.context.getString(R.string.install); - } else { - downloadText = status + (TextUtils.isEmpty(downloadAddWord) ? "" : downloadAddWord) + getDownloadSizeText(viewHolder); - } - viewHolder.mDownloadPb.setText(downloadText); - } else { - viewHolder.mMultiVersionDownloadTv.setText("选择下载你的版本" + (TextUtils.isEmpty(downloadAddWord) ? "" : "-" + downloadAddWord)); - viewHolder.mMultiVersionDownloadTv.setVisibility(View.VISIBLE); - viewHolder.mDownloadPb.setText(""); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.NORMAL); - DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(viewHolder.gameEntity); + // 游戏包含多 APK 的情况 + viewHolder.getMultiVersionDownloadTv().setText("选择下载你的版本" + (TextUtils.isEmpty(downloadAddWord) ? "" : "-" + downloadAddWord)); + viewHolder.getMultiVersionDownloadTv().setVisibility(View.VISIBLE); + viewHolder.getDownloadPb().setText(""); + viewHolder.getDownloadPb().setButtonStyle(DownloadButton.ButtonStyle.NORMAL); + DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity); if (downloadEntity != null) { switch (downloadEntity.getStatus()) { case downloading: - viewHolder.mDownloadTips.setVisibility(View.VISIBLE); - ExtensionsKt.setDownloadTipsAnimation(viewHolder.mDownloadTips, true); + viewHolder.getDownloadTips().setVisibility(View.VISIBLE); + ExtensionsKt.setDownloadTipsAnimation(viewHolder.getDownloadTips(), true); break; case done: case pause: @@ -195,73 +160,348 @@ public class DetailDownloadUtils { case subscribe: case neterror: case overflow: - viewHolder.mDownloadTips.setVisibility(View.VISIBLE); - ExtensionsKt.setDownloadTipsAnimation(viewHolder.mDownloadTips, false); + viewHolder.getDownloadTips().setVisibility(View.VISIBLE); + ExtensionsKt.setDownloadTipsAnimation(viewHolder.getDownloadTips(), false); break; default: - viewHolder.mDownloadTips.setVisibility(View.GONE); + viewHolder.getDownloadTips().setVisibility(View.GONE); break; } } else { - viewHolder.mDownloadTips.setVisibility(View.GONE); + viewHolder.getDownloadTips().setVisibility(View.GONE); } } + } - if (isCheck && viewHolder.gameEntity.getApk().size() == 1) { - DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(viewHolder.gameEntity); + /** + * 更新只有单个 APK 文件时候的下载按钮状态 + * + * @param downloadButton 下载按钮,可能是真的下载按钮也可能只是占位下载按钮 + * @param downloadAddWord 下载按钮的补充文案 + * @param showAsVGame 是否显示为畅玩游戏 + * @param showDualDownloadButton 是否正显示为双下载按钮 + */ - // 在下载管理找不到下载实体,到畅玩数据库里找 - if (downloadEntity == null && viewHolder.gameEntity.isVGame()) { - String packageName = viewHolder.gameEntity.getUniquePackageName(); - if (!TextUtils.isEmpty(packageName)) { - downloadEntity = VHelper.getVDownloadEntitySnapshot(viewHolder.gameEntity.getId(), packageName); + private static void updateWithSingleApk(GameEntity gameEntity, + DetailViewHolder viewHolder, + DownloadButton downloadButton, + String downloadAddWord, + boolean showAsVGame, + boolean showDualDownloadButton, + DownloadEntity downloadEntity) { + Context context = viewHolder.getContext(); + TextView overlayTv = viewHolder.getOverlayTv(); + + String status = GameUtils.getDownloadBtnText(context, gameEntity, false, showAsVGame, PluginLocation.only_game); + + if (showAsVGame) { + // 显示为畅玩游戏 + if (context.getString(R.string.launch).equals(status)) { + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN); + } else { + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.NORMAL); + } + + String btnText; + if (showDualDownloadButton + && (context.getString(R.string.launch).equals(status) || context.getString(R.string.install).equals(status) || context.getString(R.string.smooth).equals(status) || context.getString(R.string.update).equals(status))) { + if (context.getString(R.string.smooth).equals(status)) { + btnText = context.getString(R.string.download_v); + } else if (context.getString(R.string.update).equals(status)) { + btnText = context.getString(R.string.update_v); + } else { + btnText = context.getString(R.string.launch_v); + } + + if (overlayTv != null && downloadButton.getVisibility() != View.GONE) { + overlayTv.setVisibility(View.VISIBLE); + overlayTv.setText(btnText); + downloadButton.setText(""); + } + } else { + btnText = status + (TextUtils.isEmpty(downloadAddWord) ? "" : downloadAddWord) + getDownloadSizeText(viewHolder); + + if (overlayTv != null && downloadButton.getVisibility() != View.GONE) { + if (context.getString(R.string.launch).equals(status) + || context.getString(R.string.install).equals(status)) { + overlayTv.setVisibility(View.VISIBLE); + overlayTv.setText("启动(畅玩)"); + } else { + overlayTv.setVisibility(View.GONE); + downloadButton.setText(btnText); + } + } else { + if (overlayTv != null) { + overlayTv.setVisibility(View.GONE); + } + downloadButton.setText(btnText); } } - if (downloadEntity != null) { - viewHolder.downloadEntity = downloadEntity; - detailInvalidate(viewHolder); + // 在下载管理找不到下载实体,到畅玩数据库里找 + if (downloadEntity == null) { + String packageName = gameEntity.getUniquePackageName(); + if (!TextUtils.isEmpty(packageName)) { + downloadEntity = VHelper.getVDownloadEntitySnapshot(gameEntity.getId(), packageName); + } + } + } else { + // 非畅玩,显示为普通游戏 + if (context.getString(R.string.pluggable).equals(status)) { + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.PLUGIN); + } else if (context.getString(R.string.launch).equals(status)) { + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN); + } else if (context.getString(R.string.install).equals(status)) { + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); + } else { + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.NORMAL); + } + + if (showDualDownloadButton && viewHolder.getLocalDownloadSizeTv() != null) { + viewHolder.getLocalDownloadSizeTv().setVisibility(View.GONE); + String size = viewHolder.getGameEntity().getApk().get(0).getSize(); + if (size != null) { + String sizeWithoutDigit = size.replaceAll("(?<=\\d)\\.[0-9]+(?!\\d)", ""); + viewHolder.getLocalDownloadSizeTv().setText(sizeWithoutDigit); + } + + // 若双下载按钮时,下载的游戏是以畅玩游戏下载的,把 downloadEntity 置空,避免把按钮更新到错误的状态 + if (downloadEntity != null && ExtensionsKt.isVGameDownloadInDualDownloadMode(downloadEntity)) { + downloadEntity = null; + } + } + + String btnText; + String extraBtnText; + if (viewHolder.isNewsDetail()) { + btnText = status; + extraBtnText = status; + } else if (context.getString(R.string.pluggable).equals(status)) { + btnText = "升级" + (TextUtils.isEmpty(downloadAddWord) ? "" : "至" + downloadAddWord) + getDownloadSizeText(viewHolder); + extraBtnText = "升级" + (TextUtils.isEmpty(downloadAddWord) ? "" : "至" + downloadAddWord); + } else if (context.getString(R.string.launch).equals(status)) { + btnText = status + (TextUtils.isEmpty(downloadAddWord) ? "" : "-" + downloadAddWord); + extraBtnText = context.getString(R.string.launch_local); + } else if (context.getString(R.string.attempt).equals(status)) { + btnText = status + getDownloadSizeText(viewHolder); + extraBtnText = status; + if (showDualDownloadButton + && viewHolder.getLocalDownloadContainer() != null + && viewHolder.getLocalDownloadContainer().getVisibility() == View.VISIBLE) { + viewHolder.getLocalDownloadSizeTv().setVisibility(View.VISIBLE); + } + } else if (context.getString(R.string.install).equals(status)) { + btnText = context.getString(R.string.install); + extraBtnText = context.getString(R.string.install_local); + } else if (context.getString(R.string.update).equals(status)) { + btnText = context.getString(R.string.update); + extraBtnText = context.getString(R.string.update_local); + if (showDualDownloadButton + && viewHolder.getLocalDownloadContainer() != null + && viewHolder.getLocalDownloadContainer().getVisibility() == View.VISIBLE) { + viewHolder.getLocalDownloadSizeTv().setVisibility(View.VISIBLE); + } + } else { + btnText = status + (TextUtils.isEmpty(downloadAddWord) ? "" : downloadAddWord) + getDownloadSizeText(viewHolder); + extraBtnText = context.getString(R.string.download_local); + if (showDualDownloadButton + && viewHolder.getLocalDownloadContainer() != null + && viewHolder.getLocalDownloadContainer().getVisibility() == View.VISIBLE) { + viewHolder.getLocalDownloadSizeTv().setVisibility(View.VISIBLE); + } + } + downloadButton.setText(btnText); + if (viewHolder.getLocalDownloadTitleTv() != null) { + viewHolder.getLocalDownloadTitleTv().setText(extraBtnText); } } + + if (overlayTv != null && overlayTv.getVisibility() == View.VISIBLE) { + downloadButton.setTag(R.string.download, overlayTv.getText()); + } else { + downloadButton.setTag(R.string.download, downloadButton.getText()); + } + + if (downloadEntity == null) return; + + if (handleDownloadButtonAsXapk(downloadEntity, downloadButton)) { + return; + } + + // 非完成状态显示下载按钮 + if (downloadEntity.getStatus() != DownloadStatus.done) { + viewHolder.getDownloadPb().setVisibility(View.VISIBLE); + } + + // 存在未完成的下载任务或不显示双按钮时,隐藏本地下载按钮 + if (viewHolder.getLocalDownloadContainer() != null) { + if (downloadEntity.getStatus() != DownloadStatus.done) { + viewHolder.getLocalDownloadContainer().setVisibility(View.GONE); + } else if (showDualDownloadButton) { + viewHolder.getLocalDownloadContainer().setVisibility(View.VISIBLE); + } else { + viewHolder.getLocalDownloadContainer().setVisibility(View.GONE); + } + } + + downloadButton.setProgress((int) (downloadEntity.getPercent() * 10)); + + if (overlayTv != null + && downloadEntity.getStatus() != DownloadStatus.done) { + overlayTv.setVisibility(View.GONE); + } + + if (showAsVGame) { + updateVStyleDownloadButton(viewHolder, downloadButton, downloadEntity, status); + } else { + updateDefaultStyleDownloadButton(context, viewHolder, downloadButton, gameEntity, downloadEntity); + } + } + + /** + * 根据预置的配置更新 ViewHolder 的状态 + * + * @return 是否已经是最终状态,返回 true 表示已应用当前配置,返回 false 表示不应用当前配置 + */ + private static boolean updateViewHolderWithPredefinedConfig(DetailViewHolder viewHolder, GameEntity gameEntity) { + String downloadAddWord = gameEntity.getDownloadAddWord(); + + // 不满足条件的部分游戏隐藏下载按钮 + if (Config.isShowDownload(gameEntity.getId()) + && !"光环助手".equals(gameEntity.getName())) { + viewHolder.getDownloadBottom().setVisibility(View.VISIBLE); + } else { + viewHolder.getDownloadBottom().setVisibility(View.GONE); + return true; + } + + // 青少年模式显示为查看 + if (SPUtils.getBoolean(Constants.SP_TEENAGER_MODE)) { + viewHolder.getDownloadPb().setText("查看"); + viewHolder.getDownloadPb().setButtonStyle(DownloadButton.ButtonStyle.TEENAGER_MODE); + return true; + } + + // 预约 + if (gameEntity.isReservable()) { + if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.getId())) { + if (TextUtils.isEmpty(downloadAddWord)) { + viewHolder.getDownloadPb().setText(String.format("预约" + "《%s》", gameEntity.getName())); + } else { + viewHolder.getDownloadPb().setText(String.format("预约" + "《%s》%s", gameEntity.getName(), downloadAddWord)); + } + viewHolder.getDownloadPb().setButtonStyle(DownloadButton.ButtonStyle.RESERVABLE); + } else { + viewHolder.getDownloadPb().setText("已预约《" + gameEntity.getName() + "》"); + viewHolder.getDownloadPb().setButtonStyle(DownloadButton.ButtonStyle.RESERVED); + } + return true; + } + + // 国际服 H5 弹窗 + final RegionSetting.GameH5Download gameH5Download = RegionSettingHelper.getGameH5DownloadByGameId(gameEntity.getId()); + if (gameH5Download != null) { + viewHolder.getDownloadPb().setText(TextUtils.isEmpty(gameEntity.getDownloadOffText()) ? "查看详情" : gameEntity.getDownloadOffText()); + viewHolder.getDownloadPb().setButtonStyle(DownloadButton.ButtonStyle.NORMAL); + return true; + } + + // 特殊下载 + if (gameEntity.isSpecialDownload()) { + viewHolder.getDownloadPb().setText("查看下载资源"); + viewHolder.getDownloadPb().setButtonStyle(DownloadButton.ButtonStyle.SPECIAL_DOWNLOAD); + return true; + } + + // 处理不存在 APK 文件或游戏状态为关闭时的情况 + if (gameEntity.getApk().isEmpty() || gameEntity.getDownloadOffStatus() != null) { + LinkEntity h5LinkEntity = gameEntity.getH5Link(); + + if (h5LinkEntity != null) { + if ("play".equals(h5LinkEntity.getType())) { + String defaultString = String.format("开始玩" + "《%s》", gameEntity.getName()); + viewHolder.getDownloadPb().setText(TextUtils.isEmpty(h5LinkEntity.getText()) ? defaultString : h5LinkEntity.getText()); + } else { + viewHolder.getDownloadPb().setText(TextUtils.isEmpty(h5LinkEntity.getText()) ? "查看" : h5LinkEntity.getText()); + } + viewHolder.getDownloadPb().setButtonStyle(DownloadButton.ButtonStyle.H5_GAME); + } else { + if ("dialog".equals(gameEntity.getDownloadOffStatus())) { + viewHolder.getDownloadPb().setText(TextUtils.isEmpty(gameEntity.getDownloadOffText()) ? "查看详情" : gameEntity.getDownloadOffText()); + viewHolder.getDownloadPb().setButtonStyle(DownloadButton.ButtonStyle.NONE_WITH_HINT); + } else if ("updating".equals(gameEntity.getDownloadOffStatus())) { + viewHolder.getDownloadPb().setText(TextUtils.isEmpty(gameEntity.getDownloadOffText()) ? "更新中" : gameEntity.getDownloadOffText()); + viewHolder.getDownloadPb().setButtonStyle(DownloadButton.ButtonStyle.UPDATING); + } else { + viewHolder.getDownloadPb().setText(TextUtils.isEmpty(gameEntity.getDownloadOffText()) ? "暂无下载" : gameEntity.getDownloadOffText()); + viewHolder.getDownloadPb().setButtonStyle(DownloadButton.ButtonStyle.NONE); + } + } + return true; + } + return false; } private static String getDownloadSizeText(DetailViewHolder viewHolder) { - return String.format("(%s)", viewHolder.gameEntity.getApk().get(0).getSize()); + return String.format("(%s)", viewHolder.getGameEntity().getApk().get(0).getSize()); } - public static void detailInvalidate(DetailViewHolder viewHolder) { - DownloadEntity downloadEntity = viewHolder.downloadEntity; - String xapkStatus = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS); + private static void updateVStyleDownloadButton(DetailViewHolder viewHolder, + DownloadButton downloadButton, + DownloadEntity downloadEntity, + String status) { + switch (downloadEntity.getStatus()) { + case redirected: + case downloading: + downloadButton.setText("游戏加载中 " + downloadEntity.getPercent() + "%"); + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); + break; + case waiting: + downloadButton.setText(R.string.waiting); + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); + downloadButton.setVisibility(View.GONE); + break; + case overflow: + case timeout: + case neterror: + case subscribe: + case diskisfull: + case diskioerror: + case pause: + downloadButton.setText("继续加载 " + downloadEntity.getPercent() + "%"); + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); + break; + case done: + if (!status.contains("更新")) { + if (VHelper.isInstalled(downloadEntity.getPackageName())) { + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN); + } else { + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); + } - if (XapkUnzipStatus.SUCCESS.name().equals(xapkStatus) && XapkInstaller.INSTANCE.isInstalling(downloadEntity.getPath())) { - viewHolder.mDownloadPb.setText("游戏安装中"); - viewHolder.mDownloadPb.setProgress(100); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); - return; - } - - if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { - String percent = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_PERCENT); - viewHolder.mDownloadPb.setText("游戏解压中 " + percent + "%"); - viewHolder.mDownloadPb.setProgress((int) (Float.valueOf(percent) * 10)); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.XAPK_UNZIPPING); - return; - } else if (XapkUnzipStatus.FAILURE.name().equals(xapkStatus)) { - viewHolder.mDownloadPb.setText(R.string.install); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.XAPK_FAILURE); - return; - } - - viewHolder.mDownloadPb.setProgress((int) (viewHolder.downloadEntity.getPercent() * 10)); - if (viewHolder.getOverlayTv() != null) { - viewHolder.getOverlayTv().setVisibility(View.GONE); - } - - if (viewHolder.gameEntity.isVGame()) { - updateVStyleButton(viewHolder); - return; + downloadButton.setText(""); + } + break; + case cancel: + case hijack: + case notfound: + case uncertificated: + case unqualified: + case unavailable: + case banned: + updateViewHolder(viewHolder, true); + break; + default: + break; } + } + private static void updateDefaultStyleDownloadButton( + Context context, + DetailViewHolder viewHolder, + DownloadButton downloadButton, + GameEntity gameEntity, + DownloadEntity downloadEntity) { switch (downloadEntity.getStatus()) { case timeout: case neterror: @@ -274,55 +514,37 @@ public class DetailDownloadUtils { case overflow: String downloadingText = "游戏加载中 " + downloadEntity.getPercent() + "%"; String resumeText = "继续加载 " + downloadEntity.getPercent() + "%"; - viewHolder.mDownloadPb.setText((downloadEntity.getStatus() == DownloadStatus.downloading || downloadEntity.getStatus() == DownloadStatus.redirected) ? downloadingText : resumeText); + downloadButton.setText((downloadEntity.getStatus() == DownloadStatus.downloading || downloadEntity.getStatus() == DownloadStatus.redirected) ? downloadingText : resumeText); if (downloadEntity.isPluggable() && PackagesManager.isInstalled(downloadEntity.getPackageName())) { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_PLUGIN); + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_PLUGIN); } else { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); } break; case waiting: - viewHolder.mDownloadPb.setText(R.string.waiting); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.WAITING); + downloadButton.setText(R.string.waiting); + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.WAITING); break; case done: - if (SimulatorGameManager.isSimulatorGame(viewHolder.gameEntity)) { - boolean isInstalled = PackageUtils.isInstalledFromAllPackage(viewHolder.context, viewHolder.gameEntity.getSimulator().getApk().getPackageName()); - boolean isInstalledNewSimulator = SimulatorGameManager.isNewSimulatorInstalled(viewHolder.context); + if (SimulatorGameManager.isSimulatorGame(gameEntity)) { + boolean isInstalled = PackageUtils.isInstalledFromAllPackage(context, gameEntity.getSimulator().getApk().getPackageName()); + boolean isInstalledNewSimulator = SimulatorGameManager.isNewSimulatorInstalled(context); if (isInstalled || isInstalledNewSimulator) { - viewHolder.mDownloadPb.setText(R.string.launch); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN); + downloadButton.setText(R.string.launch); + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN); } else { if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL) && !Objects.equals(Constants.XAPK_APKS_FORMAT, downloadEntity.getFormat())) { - viewHolder.mDownloadPb.setText(R.string.browser_install_install); + downloadButton.setText(R.string.browser_install_install); } else { - viewHolder.mDownloadPb.setText(R.string.install); - } - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); - } - } else if (viewHolder.gameEntity.isVGame()) { - if (!viewHolder.mDownloadPb.getText().toString().contains("更新")) { - if (VHelper.isInstalled(downloadEntity.getPackageName())) { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN); - } else { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); - } - - viewHolder.mDownloadPb.setText(""); - if (viewHolder.getOverlayTv() != null) { - viewHolder.getOverlayTv().setVisibility(View.VISIBLE); + downloadButton.setText(R.string.install); } + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); } } else { if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL) && !Objects.equals(Constants.XAPK_APKS_FORMAT, downloadEntity.getFormat())) { - viewHolder.mDownloadPb.setText(R.string.browser_install_install); + downloadButton.setText(R.string.browser_install_install); } else { - viewHolder.mDownloadPb.setText(R.string.install); - } - if (downloadEntity.isPluggable() && PackagesManager.isInstalled(downloadEntity.getPackageName())) { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_PLUGIN); - } else { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); + downloadButton.setText(R.string.install); } } @@ -334,50 +556,35 @@ public class DetailDownloadUtils { case unqualified: case unavailable: case banned: - detailInitDownload(viewHolder, false); + updateViewHolder(viewHolder, true); break; default: break; } } - private static void updateVStyleButton(DetailViewHolder viewHolder) { - switch (viewHolder.downloadEntity.getStatus()) { - case redirected: - case downloading: - viewHolder.mDownloadPb.setText("游戏加载中 " + viewHolder.downloadEntity.getPercent() + "%"); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); - break; - case waiting: - viewHolder.mDownloadPb.setText(R.string.waiting); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); - break; - case overflow: - case timeout: - case neterror: - case subscribe: - case diskisfull: - case diskioerror: - case pause: - viewHolder.mDownloadPb.setText("继续加载 " + viewHolder.downloadEntity.getPercent() + "%"); - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); - break; - case done: - if (!viewHolder.mDownloadPb.getText().toString().contains("更新")) { - if (VHelper.isInstalled(viewHolder.downloadEntity.getPackageName())) { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN); - } else { - viewHolder.mDownloadPb.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); - } + private static boolean handleDownloadButtonAsXapk(DownloadEntity downloadEntity, DownloadButton downloadButton) { + String xapkStatus = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS); - viewHolder.mDownloadPb.setText(""); - if (viewHolder.getOverlayTv() != null) { - viewHolder.getOverlayTv().setVisibility(View.VISIBLE); - } - } - break; - default: - break; + if (XapkUnzipStatus.SUCCESS.name().equals(xapkStatus) && XapkInstaller.INSTANCE.isInstalling(downloadEntity.getPath())) { + downloadButton.setText("游戏安装中"); + downloadButton.setProgress(100); + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); + return true; } + + if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { + String percent = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_PERCENT); + downloadButton.setText("游戏解压中 " + percent + "%"); + downloadButton.setProgress((int) (Float.valueOf(percent) * 10)); + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.XAPK_UNZIPPING); + return true; + } else if (XapkUnzipStatus.FAILURE.name().equals(xapkStatus)) { + downloadButton.setText(R.string.install); + downloadButton.setButtonStyle(DownloadButton.ButtonStyle.XAPK_FAILURE); + return true; + } + + return false; } } 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 760dced6b9..2f30221b19 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -841,27 +841,6 @@ object DirectUtils { jumpActivity(context, bundle) } - /** - * 跳转到下载管理器并开始下载 [gameId] 和 [packageName] 用于唯一确定一个下载文件 - */ - @JvmStatic - fun directToDownloadManagerAndStartDownload( - context: Context, - gameId: String? = "", - packageName: String? = "", - entrance: String? = null - ) { - DownloadHelper.createABrandNewDownloadTaskQuietly(gameId, packageName) { - val bundle = Bundle() - bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER) - bundle.putString(KEY_TO, DownloadManagerActivity.TAG) - bundle.putString(KEY_GAMEID, gameId) - bundle.putString(KEY_PACKAGENAME, packageName) - bundle.putBoolean(KEY_AUTO_DOWNLOAD, true) - jumpActivity(context, bundle) - } - } - @JvmStatic fun directToDownloadManagerAndStartUpdate( context: Context, diff --git a/app/src/main/java/com/gh/common/util/DownloadHelper.kt b/app/src/main/java/com/gh/common/util/DownloadHelper.kt deleted file mode 100644 index d32b58a675..0000000000 --- a/app/src/main/java/com/gh/common/util/DownloadHelper.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.gh.common.util - -import com.gh.common.filter.RegionSettingHelper -import com.gh.download.DownloadManager -import com.gh.gamecenter.common.constant.EntranceConsts -import com.gh.gamecenter.feature.entity.GameEntity -import com.gh.gamecenter.common.retrofit.Response -import com.gh.gamecenter.feature.utils.ApkActiveUtils -import com.gh.gamecenter.retrofit.RetrofitManager -import com.halo.assistant.HaloApp -import io.reactivex.schedulers.Schedulers -import retrofit2.HttpException - -/** - * 不想写这个类的,但是与其在一个糟糕的类里插入同样的代码,我想独立写一个类相较而已还没那么糟糕 - */ -object DownloadHelper { - - /** - * 根据 game_id 和 packageName 悄悄地开启一个下载任务,如果可以的话 - * @param block 成功添加下载任务后执行的代码块 - */ - fun createABrandNewDownloadTaskQuietly(gameId: String? = "", packageName: String? = "", block: () -> Unit) { - if (RegionSettingHelper.shouldThisGameBeFiltered(gameId)) { - return - } - - RetrofitManager.getInstance() - .api - .getGameDigest(gameId) - .map(ApkActiveUtils.filterMapper) - .subscribeOn(Schedulers.io()) - .subscribe(object : Response() { - override fun onResponse(response: GameEntity?) { - response?.let { - if (response.getApk().size > 1) { - for (apk in response.getApk()) { - if (packageName == apk.packageName) { - DownloadManager.createDownload( - HaloApp.getInstance().application, - apk, response, "", EntranceConsts.ENTRANCE_RECOMMEND, "", false, null - ) - block.invoke() - } - } - } else if (response.getApk().size == 1) { - DownloadManager.createDownload( - HaloApp.getInstance().application, - response, "", EntranceConsts.ENTRANCE_RECOMMEND, "", false, null - ) - block.invoke() - } - } - } - - override fun onFailure(e: HttpException?) { - e?.printStackTrace() - block.invoke() - } - }) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt b/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt index 1c75fef495..769e56e384 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt @@ -122,7 +122,7 @@ object DownloadItemUtils { fun updateItemWithReserveStatus(holder: GameViewHolder, gameEntity: GameEntity) { if ("download" == gameEntity.reserveStatus) { // 已上线 - updateItem(holder.gameDownloadBtn.context, gameEntity, holder, false) + updateItem(holder.gameDownloadBtn.context, gameEntity, holder) } else if ("appointment" == gameEntity.reserveStatus) { // 已预约 holder.gameDownloadBtn.text = "已预约" @@ -133,25 +133,35 @@ object DownloadItemUtils { } fun updateItem( - context: Context, gameEntity: GameEntity, holder: GameViewHolder, - isShowPlatform: Boolean, hideDownloadBtnIfNoAvailableContent: Boolean + context: Context, + gameEntity: GameEntity, + holder: GameViewHolder, + hideDownloadBtnIfNoAvailableContent: Boolean ) { updateItem( - context, - gameEntity, - holder, - isShowPlatform, - PluginLocation.only_game, - hideDownloadBtnIfNoAvailableContent, - null + context = context, + gameEntity = gameEntity, + holder = holder, + pluginLocation = PluginLocation.only_game, + hideDownloadBtnIfNoAvailableContent = hideDownloadBtnIfNoAvailableContent, + briefStyle = null ) } fun updateItem( - context: Context, gameEntity: GameEntity, holder: GameViewHolder, - isShowPlatform: Boolean, briefStyle: String? + context: Context, + gameEntity: GameEntity, + holder: GameViewHolder, + briefStyle: String? ) { - updateItem(context, gameEntity, holder, isShowPlatform, PluginLocation.only_game, false, briefStyle) + updateItem( + context = context, + gameEntity = gameEntity, + holder = holder, + pluginLocation = PluginLocation.only_game, + hideDownloadBtnIfNoAvailableContent = false, + briefStyle = briefStyle + ) } @JvmStatic @@ -160,7 +170,6 @@ object DownloadItemUtils { context: Context, gameEntity: GameEntity, holder: GameViewHolder, - isShowPlatform: Boolean, pluginLocation: PluginLocation? = PluginLocation.only_game, hideDownloadBtnIfNoAvailableContent: Boolean = false, briefStyle: String? = null, @@ -286,12 +295,54 @@ object DownloadItemUtils { } } } else if (gameEntity.getApk().size == 1) { - // 优先从下载管理获取 downloadEntity - var downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity) + // 来自于下载管理的实体快照 + val entityFromDownloadManager = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity) + // 是否正在下载中 + val isDownloading = entityFromDownloadManager != null && entityFromDownloadManager.status != DownloadStatus.done + // 是否已安装至本地 + val isInstalledLocally = PackagesManager.isInstalled(gameEntity.getUniquePackageName()) + // 来自于畅玩安装列表的实体快照,若存在,代表游戏已下载并成功安装 + val entityFromInstalledVGame = VHelper.getVDownloadEntitySnapshot(gameEntity.id, gameEntity.getUniquePackageName()) + // 是否已安装至畅玩 + val isInstalledToVSpace = entityFromInstalledVGame != null + // 是否处于待安装状态 (仅本地安装有这个状态) + val isPendingToInstall = if (entityFromDownloadManager?.status != DownloadStatus.done) { + false + } else { + entityFromDownloadManager.isLocalDownloadInDualDownloadMode() + && (!isInstalledLocally || entityFromDownloadManager.isUpdate) + } - // 找不到时,若类型为畅玩,尝试从畅玩数据库的快照中获取 downloadEntity。若存在,代表游戏已下载并成功安装 - if (downloadEntity == null && gameEntity.isVGame()) { - downloadEntity = VHelper.getVDownloadEntitySnapshot(gameEntity.id, gameEntity.getUniquePackageName()) +// 列表按钮显示的优先级 +// 1. 都未安装,且不存在下载任务,按后台配置显示的状态优先 +// 2. 存在未完成的下载任务时,下载任务优先 +// 3. 存在待安装任务时,待安装任务优先 +// 4. 存在一个已安装,已安装的显示优先 +// 5. 都已安装,按后台配置显示的状态优先 + val isVGamePreferred = if (!isInstalledLocally && !isInstalledToVSpace && entityFromDownloadManager == null) { + gameEntity.isVGamePreferred() + } else if (isDownloading || isPendingToInstall) { + entityFromDownloadManager?.isVGameDownloadInDualDownloadMode() == true + } else if (isInstalledLocally && isInstalledToVSpace) { + gameEntity.isVGamePreferred() + } else if (isInstalledLocally) { + false + } else if (isInstalledToVSpace) { + true + } else { + gameEntity.isVGamePreferred() + } + + val downloadEntity: DownloadEntity? = if (isDownloading) { + entityFromDownloadManager + } else if (isPendingToInstall) { + entityFromDownloadManager + } else { + if (isVGamePreferred) { + entityFromInstalledVGame ?: entityFromDownloadManager + } else { + entityFromDownloadManager + } } if (downloadEntity != null) { @@ -300,11 +351,12 @@ object DownloadItemUtils { DownloadStatus.done -> { if (downloadEntity.isSimulatorGame() && gameEntity.simulator != null) { GameUtils.setDownloadBtnStatus(context, gameEntity, downloadBtn, pluginLocation) - } else if (downloadEntity.isVGame()) { + } else if (isVGamePreferred) { buttonStyle = if (PackagesManager.isCanUpdate( downloadEntity.gameId, - downloadEntity.packageName + downloadEntity.packageName, + asVGame = true ) ) { setText(R.string.update) @@ -333,8 +385,19 @@ object DownloadItemUtils { return } - buttonStyle = DownloadButton.ButtonStyle.INSTALL_NORMAL - setText(R.string.install) + if (PackagesManager.isInstalled(downloadEntity.packageName) && !downloadEntity.isUpdate) { + // 双下载按钮快速安装时存在已下载的安装包过时,需要重新下载的情况 + if (PackagesManager.isCanUpdate(downloadEntity.gameId, downloadEntity.packageName)) { + buttonStyle = DownloadButton.ButtonStyle.NORMAL + setText(R.string.update) + } else { + buttonStyle = DownloadButton.ButtonStyle.LAUNCH_OR_OPEN + setText(R.string.launch) + } + } else { + buttonStyle = DownloadButton.ButtonStyle.INSTALL_NORMAL + setText(R.string.install) + } } buttonStyle = if (downloadEntity.isPluggable && PackagesManager.isInstalled(downloadEntity.packageName)) { @@ -836,17 +899,21 @@ object DownloadItemUtils { allStateClickCallback?.onCallback() clickCallback?.onCallback() - ChainBuilder().apply { + DownloadChainBuilder().apply { addHandler(GamePermissionHandler()) addHandler(CheckStoragePermissionHandler()) addHandler(CertificationHandler()) addHandler(VersionNumberHandler()) } - .setProcessEndCallback { + .setProcessEndCallback { _, _ -> DownloadDialog.showDownloadDialog(view.context, gameEntity, traceEvent, entrance, location) } .buildHandlerChain() - ?.handleRequest(context, gameEntity) + ?.handleRequest( + context, + gameEntity, + GameUtils.shouldPerformAsVGame(gameEntity) + ) } } } @@ -866,8 +933,11 @@ object DownloadItemUtils { val str = if (downloadBtn is DownloadButton) downloadBtn.text else context.getString(R.string.download) if (gameEntity.getApk().isEmpty()) return val apk = gameEntity.getApk().safelyGetInRelease(0) ?: return + + val shouldPerformAsVGame = GameUtils.shouldPerformAsVGame(gameEntity) + if (str == context.getString(R.string.download)) { - ChainBuilder().apply { + DownloadChainBuilder().apply { addHandler(UnsupportedFeatureHandler()) addHandler(UpdateNewSimulatorHandler()) addHandler(GamePermissionHandler()) @@ -879,14 +949,14 @@ object DownloadItemUtils { addHandler(LandPageAddressHandler()) addHandler(CheckDownloadHandler()) } - .setProcessEndCallback { - download(context, gameEntity, downloadBtn, entrance, location, it as Boolean, traceEvent) + .setProcessEndCallback { asVGame, isSubscribe -> + download(context, gameEntity, downloadBtn, entrance, location, asVGame, isSubscribe as Boolean, traceEvent) } .buildHandlerChain() - ?.handleRequest(context, gameEntity) + ?.handleRequest(context, gameEntity, shouldPerformAsVGame) DataLogUtils.uploadGameLog(context, gameEntity.id, gameEntity.name, entrance) } else if (str == context.getString(R.string.attempt)) { - ChainBuilder().apply { + DownloadChainBuilder().apply { addHandler(UnsupportedFeatureHandler()) addHandler(UpdateNewSimulatorHandler()) addHandler(GamePermissionHandler()) @@ -899,14 +969,14 @@ object DownloadItemUtils { addHandler(OverseaDownloadHandler()) addHandler(CheckDownloadHandler()) } - .setProcessEndCallback { - download(context, gameEntity, downloadBtn, entrance, location, it as Boolean, traceEvent) + .setProcessEndCallback { asVGame, isSubscribe -> + download(context, gameEntity, downloadBtn, entrance, location, asVGame, isSubscribe as Boolean, traceEvent) } .buildHandlerChain() - ?.handleRequest(context, gameEntity) + ?.handleRequest(context, gameEntity, shouldPerformAsVGame) DataLogUtils.uploadGameLog(context, gameEntity.id, gameEntity.name, entrance) } else if (str == context.getString(R.string.smooth)) { - ChainBuilder().apply { + DownloadChainBuilder().apply { addHandler(UnsupportedFeatureHandler()) addHandler(GamePermissionHandler()) addHandler(PackageCheckHandler()) @@ -919,25 +989,25 @@ object DownloadItemUtils { addHandler(ValidateVSpaceHandler()) addHandler(CheckDownloadHandler()) } - .setProcessEndCallback { - download(context, gameEntity, downloadBtn, entrance, location, it as Boolean, traceEvent) + .setProcessEndCallback { asVGame, isSubscribe -> + download(context, gameEntity, downloadBtn, entrance, location, asVGame, isSubscribe as Boolean, traceEvent) } .buildHandlerChain() - ?.handleRequest(context, gameEntity) + ?.handleRequest(context, gameEntity, shouldPerformAsVGame) } else if (str.contains("化")) { if (gameEntity.pluggableCollection != null) { DownloadDialog.showDownloadDialog(context, gameEntity, traceEvent, entrance, location) } else { - ChainBuilder().apply { + DownloadChainBuilder().apply { addHandler(DownloadDialogHelperHandler()) addHandler(CertificationHandler()) addHandler(CheckDownloadHandler()) } - .setProcessEndCallback { - plugin(context, gameEntity, downloadBtn, entrance, location, it as Boolean, traceEvent) + .setProcessEndCallback { _, isSubscribe -> + plugin(context, gameEntity, downloadBtn, entrance, location, isSubscribe as Boolean, traceEvent) } .buildHandlerChain() - ?.handleRequest(context, gameEntity) + ?.handleRequest(context, gameEntity, shouldPerformAsVGame) } } else if (str == context.getString(R.string.install)) { val downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(apk.url) @@ -978,11 +1048,7 @@ object DownloadItemUtils { } } - if (gameEntity.isVGame()) { - VHelper.installOrLaunch((context as AppCompatActivity), gameEntity) - } else { - install(context, gameEntity, position, adapter, refreshCallback) - } + install(context, gameEntity, position, adapter, refreshCallback) } else if (str == context.getString(R.string.launch)) { //启动模拟器游戏 if (SimulatorGameManager.isSimulatorGame(gameEntity)) { @@ -994,7 +1060,16 @@ object DownloadItemUtils { if (downloadEntity != null) { val file = File(downloadEntity.path) if (!file.exists()) { - download(context, gameEntity, downloadBtn, entrance, location, false, traceEvent) + download( + context = context, + gameEntity = gameEntity, + downloadBtn = downloadBtn, + entrance = entrance, + location = location, + asVGame = false, + isSubscribe = false, + traceEvent = traceEvent + ) return } NewFlatLogUtils.logSimulatorGameCardClick("启动") @@ -1003,21 +1078,17 @@ object DownloadItemUtils { return } - if (gameEntity.isVGame()) { - VHelper.installOrLaunch((context as AppCompatActivity), gameEntity) - return - } - PackageLauncher.launchApp(context, gameEntity, gameEntity.getApk()[0].packageName) + PackageLauncher.launch(context, gameEntity) } else if (str == context.getString(R.string.update)) { - if (gameEntity.isVGame()) { + if (shouldPerformAsVGame) { VHelper.updateOrReDownload(gameEntity) return } - ChainBuilder() + DownloadChainBuilder() .apply { addHandler(LandPageAddressHandler()) - }.setProcessEndCallback { + }.setProcessEndCallback { asVGame, _ -> DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk) { DialogUtils.checkDownload( context, @@ -1026,21 +1097,16 @@ object DownloadItemUtils { gameEntity.name, gameEntity.categoryChinese ) { isSubscribe: Boolean -> - update(context, gameEntity, entrance, location, isSubscribe, traceEvent) + update(context, gameEntity, entrance, location, asVGame, isSubscribe, traceEvent) } } } .buildHandlerChain() - ?.handleRequest(context, gameEntity) + ?.handleRequest(context, gameEntity, false) } else { var downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity) - // 找不到时,若类型为畅玩,尝试从畅玩数据库的快照中获取 downloadEntity。若存在,代表游戏已下载并成功安装 - if (downloadEntity == null && gameEntity.isVGame()) { - downloadEntity = VHelper.getVDownloadEntitySnapshot(gameEntity.id, gameEntity.getUniquePackageName()) - } - - // 还是找不到时,尝试从 gameEntity 里找已绑定的 downloadEntity + // 尝试从 gameEntity 里找已绑定的 downloadEntity if (downloadEntity == null) { downloadEntity = gameEntity.getEntryMap().getOrDefault(gameEntity.getUniquePlatform(), null) } @@ -1078,6 +1144,7 @@ object DownloadItemUtils { downloadBtn: View?, entrance: String, location: String, + asVGame: Boolean, isSubscribe: Boolean, traceEvent: ExposureEvent? ) { @@ -1088,7 +1155,7 @@ object DownloadItemUtils { DownloadManager.createDownload( context, gameEntity, - context.getString(R.string.download), + asVGame, entrance, location, isSubscribe, @@ -1123,7 +1190,7 @@ object DownloadItemUtils { ) { val msg = FileUtils.isCanDownload(context, gameEntity.getApk()[0].size ?: "") if (TextUtils.isEmpty(msg)) { - DownloadManager.createDownload(context, gameEntity, "插件化", entrance, location, isSubscribe, traceEvent) + DownloadManager.createDownload(context, gameEntity, false, entrance, location, isSubscribe, traceEvent) ToastUtils.toast(gameEntity.name + "已加入下载队列") if (BrowserInstallHelper.shouldAutoSwitchAssistantInstall(gameEntity)) { val toast = context.getString(R.string.unsupported_browser_install_hint) @@ -1187,9 +1254,19 @@ object DownloadItemUtils { gameEntity: GameEntity, entrance: String, location: String, + asVGame: Boolean, isSubscribe: Boolean, traceEvent: ExposureEvent? ) { - DownloadManager.createDownload(context, gameEntity, "更新", entrance, location, isSubscribe, traceEvent) + + // 执行更新操作前,先清理历史下载任务,避免冲突 + if (gameEntity.getApk().size == 1 && !asVGame) { + val downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity) + if (downloadEntity != null) { + DownloadManager.getInstance().cancel(downloadEntity.url) + } + } + + DownloadManager.createDownload(context, gameEntity, asVGame, entrance, location, isSubscribe, traceEvent) } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt b/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt index 20db877645..bec8135a10 100644 --- a/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt +++ b/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt @@ -15,7 +15,7 @@ import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.utils.getMetaExtra import com.gh.gamecenter.common.utils.isSimulatorGame -import com.gh.gamecenter.common.utils.isVGame +import com.gh.gamecenter.common.utils.asVGame import com.gh.gamecenter.common.utils.tryCatchInRelease import com.gh.gamecenter.core.AppExecutor import com.gh.gamecenter.core.utils.SpeedUtils @@ -57,7 +57,7 @@ object DownloadNotificationHelper { intent.putExtra(EntranceConsts.KEY_URL, entity.url) intent.putExtra(EntranceConsts.KEY_PATH, entity.path) intent.action = ACTION_INSTALL - } else if (entity.isVGame()) { + } else if (entity.asVGame()) { intent.action = ACTION_VDOWNLOAD } else { intent.action = ACTION_DOWNLOAD diff --git a/app/src/main/java/com/gh/common/util/DownloadObserver.kt b/app/src/main/java/com/gh/common/util/DownloadObserver.kt index 7926113472..02cc0bbc53 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -22,7 +22,6 @@ import com.gh.gamecenter.core.utils.MtaHelper import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.core.utils.ToastUtils import com.gh.gamecenter.common.utils.NewFlatLogUtils -import com.gh.gamecenter.core.utils.* import com.gh.gamecenter.eventbus.EBDownloadStatus import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.feature.entity.SimulatorEntity @@ -274,13 +273,13 @@ object DownloadObserver { ) else -> { - if (!downloadEntity.isVGame()) { + if (!downloadEntity.asVGame()) { Utils.toast(mApplication, downloadEntity.name + " - 下载完成") } } } } else { - if (!downloadEntity.isVGame()) { + if (!downloadEntity.asVGame()) { Utils.toast(mApplication, downloadEntity.name + " - 下载完成") } } @@ -315,11 +314,9 @@ object DownloadObserver { Utils.toast(mApplication, R.string.install_failure_hint) downloadManager.cancel(downloadEntity.url) } else { - if (PackageUtils.isCanLaunchSetup( - mApplication, - downloadEntity.path - ) || downloadType == Constants.SMOOTH_GAME - ) { + if (PackageUtils.isCanLaunchSetup(mApplication, downloadEntity.path) + || downloadType == Constants.VGAME + || downloadType == Constants.DUAL_DOWNLOAD_VGAME) { downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES" tryWithDefaultCatch { NewFlatLogUtils.logGameInstall( @@ -333,7 +330,7 @@ object DownloadObserver { gameName = downloadEntity.name, action = "自动安装" ) - PackageInstaller.install(mApplication, downloadEntity, false) + PackageInstaller.install(mApplication, downloadEntity, false, ignoreAsVGame = false) } } else { // 弹出卸载提示框 @@ -401,7 +398,7 @@ object DownloadObserver { private fun statDoneEvent(downloadEntity: DownloadEntity) { var type: ExposureUtils.DownloadType if (downloadEntity.isUpdate) { - if (downloadEntity.isVGame()) { + if (downloadEntity.asVGame()) { type = ExposureUtils.DownloadType.FUN_UPDATE } else { type = ExposureUtils.DownloadType.UPDATE @@ -410,7 +407,7 @@ object DownloadObserver { } } } else { - type = if (downloadEntity.isVGame()) { + type = if (downloadEntity.asVGame()) { ExposureUtils.DownloadType.FUN_DOWNLOAD } else { ExposureUtils.DownloadType.DOWNLOAD @@ -450,7 +447,7 @@ object DownloadObserver { type ) - if (downloadEntity.isVGame()) { + if (downloadEntity.asVGame()) { SensorsBridge.trackEventWithExposureSource( "HaloFunGameDownloadDone", exposureEvent?.source, @@ -481,7 +478,8 @@ object DownloadObserver { "page_business_id", getCurrentPageEntity().pageBusinessId, "last_page_name", getLastPageEntity().pageName, "last_page_id", getLastPageEntity().pageId, - "last_page_business_id", getLastPageEntity().pageBusinessId + "last_page_business_id", getLastPageEntity().pageBusinessId, + "download_type", if (downloadEntity.asVGame()) "畅玩下载" else "本地下载", ) } diff --git a/app/src/main/java/com/gh/common/util/GameActivityDownloadHelper.kt b/app/src/main/java/com/gh/common/util/GameActivityDownloadHelper.kt index a245591c64..7bf73d199b 100644 --- a/app/src/main/java/com/gh/common/util/GameActivityDownloadHelper.kt +++ b/app/src/main/java/com/gh/common/util/GameActivityDownloadHelper.kt @@ -28,7 +28,6 @@ import com.gh.gamecenter.common.view.dsbridge.CompletionHandler import com.gh.gamecenter.core.AppExecutor import com.gh.gamecenter.core.runOnUiThread import com.gh.gamecenter.core.utils.EmptyCallback -import com.gh.gamecenter.core.utils.MtaHelper import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.core.utils.ToastUtils import com.gh.gamecenter.feature.entity.ApkEntity @@ -204,10 +203,16 @@ object GameActivityDownloadHelper { ) { val apk = getApk(gameEntity, event, true) ?: return val downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity) - val str = GameUtils.getDownloadBtnText(context, gameEntity, PluginLocation.only_game) - if (downloadEntity != null && - str != context.getString(R.string.install) && - str != context.getString(R.string.launch) + val str = GameUtils.getDownloadBtnText( + context = context, + gameEntity = gameEntity, + isFromList = true, + fixedAsVGame = false, + pluginLocation = PluginLocation.only_game + ) + if (downloadEntity != null + && str != context.getString(R.string.install) + && str != context.getString(R.string.launch) ) { ToastUtils.toast("${gameEntity.name}已加入下载队列") if (BrowserInstallHelper.shouldAutoSwitchAssistantInstall(gameEntity)) { @@ -261,7 +266,7 @@ object GameActivityDownloadHelper { GamePermissionDialogFragment.show((context as AppCompatActivity), gameEntity, gameEntity.info) { CertificationDialog.showCertificationDialog(context, gameEntity) { DialogUtils.checkDownload(context, apk.size, gameEntity.id, gameEntity.name, gameEntity.categoryChinese) { isSubscribe: Boolean -> - download(context, gameEntity, apk, isSubscribe, entrance, location, traceEvent) + download(context, gameEntity, apk, false, isSubscribe, entrance, location, traceEvent) } } } @@ -287,7 +292,7 @@ object GameActivityDownloadHelper { gameEntity.name, gameEntity.categoryChinese ) { isSubscribe: Boolean -> - download(context, gameEntity, apk, isSubscribe, entrance, location, traceEvent) + download(context, gameEntity, apk, true, isSubscribe, entrance, location, traceEvent) } } } @@ -354,12 +359,10 @@ object GameActivityDownloadHelper { } } - if (gameEntity.isVGame()) { + if (downloadEntity?.isVGameDownloadInDualDownloadMode() == true) { VHelper.installOrLaunch((context as AppCompatActivity), gameEntity) } else { - downloadEntity?.run { - install(context, gameEntity, apk, this) - } + downloadEntity?.run { install(context, gameEntity, apk, this) } } } @@ -383,7 +386,16 @@ object GameActivityDownloadHelper { if (simulatorDownloadEntity != null) { val file = File(simulatorDownloadEntity.path) if (!file.exists()) { - download(context, gameEntity, apk, false, entrance, location, traceEvent) + download( + context = context, + gameEntity = gameEntity, + apk = apk, + asVGame = false, + isSubscribe = false, + entrance = entrance, + location = location, + traceEvent = traceEvent + ) return } NewFlatLogUtils.logSimulatorGameCardClick("启动") @@ -392,15 +404,7 @@ object GameActivityDownloadHelper { return } - if (gameEntity.isVGame()) { - VHelper.installOrLaunch((context as AppCompatActivity), gameEntity) - return - } - - if (entrance.contains("我的游戏")) { - MtaHelper.onEvent("我的游戏_启动", "启动", gameEntity.name) - } - PackageLauncher.launchApp(context, gameEntity, gameEntity.getApk()[0].packageName) + PackageLauncher.launch(context, gameEntity) } // 处理更新状态 @@ -463,6 +467,7 @@ object GameActivityDownloadHelper { context: Context, gameEntity: GameEntity, apk: ApkEntity, + asVGame: Boolean, isSubscribe: Boolean, entrance: String, location: String, @@ -470,11 +475,7 @@ object GameActivityDownloadHelper { ) { val msg = FileUtils.isCanDownload(context, apk.size) if (TextUtils.isEmpty(msg)) { - DownloadManager.createDownload( - context, apk, gameEntity, context.getString( - R.string.download - ), entrance, location, isSubscribe, traceEvent - ) + DownloadManager.createDownload(context, apk, gameEntity, asVGame, gameEntity.isDualBtnModeEnabled(), entrance, location, isSubscribe, traceEvent) ToastUtils.toast("${gameEntity.name}已加入下载队列") if (BrowserInstallHelper.shouldAutoSwitchAssistantInstall(gameEntity)) { val toast = context.getString(R.string.unsupported_browser_install_hint) @@ -499,7 +500,7 @@ object GameActivityDownloadHelper { ) { val msg = FileUtils.isCanDownload(context, apk.size) if (TextUtils.isEmpty(msg)) { - DownloadManager.createDownload(context, apk, gameEntity, "插件化", entrance, location, isSubscribe, traceEvent) + DownloadManager.createDownload(context, apk, gameEntity, false, false, entrance, location, isSubscribe, traceEvent) ToastUtils.toast("${gameEntity.name}已加入下载队列") if (BrowserInstallHelper.shouldAutoSwitchAssistantInstall(gameEntity)) { val toast = context.getString(R.string.unsupported_browser_install_hint) @@ -554,7 +555,7 @@ object GameActivityDownloadHelper { isSubscribe: Boolean, traceEvent: ExposureEvent? ) { - DownloadManager.createDownload(context, apk, gameEntity, "更新", entrance, location, isSubscribe, traceEvent) + DownloadManager.createDownload(context, apk, gameEntity, false, false, entrance, location, isSubscribe, traceEvent) ToastUtils.toast("${gameEntity.name}已加入下载队列") if (BrowserInstallHelper.shouldAutoSwitchAssistantInstall(gameEntity)) { val toast = context.getString(R.string.unsupported_browser_install_hint) diff --git a/app/src/main/java/com/gh/common/util/GameUtils.java b/app/src/main/java/com/gh/common/util/GameUtils.java deleted file mode 100644 index 4e2e4be2fc..0000000000 --- a/app/src/main/java/com/gh/common/util/GameUtils.java +++ /dev/null @@ -1,272 +0,0 @@ -package com.gh.common.util; - -import android.content.Context; -import android.text.TextUtils; - -import androidx.annotation.Nullable; -import androidx.annotation.WorkerThread; - -import com.gh.common.constant.Config; -import com.gh.common.simulator.SimulatorGameManager; -import com.gh.gamecenter.common.constant.Constants; -import com.gh.gamecenter.feature.view.DownloadButton; -import com.gh.download.DownloadManager; -import com.gh.gamecenter.R; -import com.gh.gamecenter.core.AppExecutor; -import com.gh.gamecenter.feature.entity.ApkEntity; -import com.gh.gamecenter.feature.entity.ApkLink; -import com.gh.gamecenter.feature.entity.GameCollectionEntity; -import com.gh.gamecenter.feature.entity.GameEntity; -import com.gh.gamecenter.entity.GameUpdateEntity; -import com.gh.gamecenter.feature.entity.PluginLocation; -import com.gh.gamecenter.feature.entity.SettingsEntity; -import com.gh.gamecenter.manager.PackagesManager; -import com.gh.vspace.VHelper; -import com.lightgame.download.DownloadEntity; -import com.lightgame.download.DownloadStatus; - -import java.util.ArrayList; -import java.util.List; - -public class GameUtils { - - /** - * 去除与重复sourceList相同的数据 - */ - public static List removeDuplicateData(List sourceList, List rawList) { - if (sourceList == null || sourceList.isEmpty() - || rawList == null || rawList.isEmpty()) { - return rawList; - } - String id; - for (int i = 0; i < rawList.size(); i++) { - id = rawList.get(i).getId(); - for (GameEntity gameEntity : sourceList) { - if (id.equals(gameEntity.getId())) { - rawList.remove(i); - i--; - break; - } - } - } - return rawList; - } - - /** - * 设置下载按钮状态 - */ - public static void setDownloadBtnStatus(Context context, GameEntity gameEntity, DownloadButton downloadBtn, PluginLocation pluginLocation) { - // getDownloadBtnText 里包括查询数据库、根据包名读取包体 meta 信息等 - AppExecutor.getLightWeightIoExecutor().execute(() -> { - String status = getDownloadBtnText(context, gameEntity, pluginLocation); - AppExecutor.getUiExecutor().execute(() -> { - downloadBtn.setText(status); - if (context.getString(R.string.pluggable).equals(status)) { - downloadBtn.setButtonStyle(DownloadButton.ButtonStyle.PLUGIN); - String pluginDesc = gameEntity.getPluginDesc(); - if (pluginDesc.length() > 3) pluginDesc = pluginDesc.substring(0, 3); - downloadBtn.setText((pluginDesc + "化")); - } else { - downloadBtn.setButtonStyle(DownloadButton.ButtonStyle.NORMAL); - } - }); - }); - } - - /** - * 获取下载按钮文案 (相对耗时,请优先在子线程调用) - */ - @WorkerThread - public static String getDownloadBtnText(Context context, GameEntity gameEntity, PluginLocation pluginLocation) { - if (gameEntity.getApk().size() > 1) { - return ""; - } - - int doneCount = 0; // 下载完成数量 - int pluginCount = 0; // 可插件化数量 - int updateCount = 0; // 可更新数量 - int installCount = 0; // 已安装数量 - - boolean isRelatedEmulatorInstalled = false; // 若该游戏是模拟器游戏时其对应的模拟器是否已经安装 - boolean isInstalledNewSimulator = false;// 是否安装新模拟器 - DownloadEntity downloadEntity = null; - Object gh_id; - apkFor: - for (ApkEntity apkEntity : gameEntity.getApk()) { - - // filter by packageName - SettingsEntity settings = Config.getSettings(); - if (settings != null && gameEntity.getApk().size() > 1) { - for (String pkgName : settings.getGameDownloadBlackList()) { - if (pkgName.equals(apkEntity.getPackageName())) { - continue apkFor; - } - } - } - - downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity); - - // 在下载管理找不到下载实体,并且为畅玩游戏的时候到畅玩数据库里找 - if (downloadEntity == null && gameEntity.isVGame()) { - downloadEntity = VHelper.getVDownloadEntitySnapshot(gameEntity.getId(), apkEntity.getPackageName()); - } - - if (downloadEntity != null) { - if (downloadEntity.getStatus().equals(DownloadStatus.done)) { - doneCount++; - } else if (downloadEntity.isPluggable()) { - pluginCount++; - } else if (downloadEntity.isUpdate()) { - updateCount++; - } - } - if (PackagesManager.INSTANCE.isCanUpdate(gameEntity.getId(), apkEntity.getPackageName())) { - updateCount++; - } - if (PackagesManager.isInstalled(apkEntity.getPackageName())) { - gh_id = PackageUtils.getMetaData(context, apkEntity.getPackageName(), "gh_id"); - if (!TextUtils.isEmpty(apkEntity.getGhVersion()) - && !PackageUtils.isSignedByGh(context, apkEntity.getPackageName()) - && apkEntity.isShowPlugin(pluginLocation)) { - pluginCount++; - } else if (gh_id == null - || gh_id.equals(gameEntity.getId()) - // 当使用镜像时,可能会存在镜像 gh_id 与当前游戏 id 不一样的情况,这时也让它通过,避免装完还是显示`下载` - || gameEntity.shouldUseMirrorInfo()) { - installCount++; - } - } - if (SimulatorGameManager.isSimulatorGame(gameEntity)) { - isInstalledNewSimulator = SimulatorGameManager.isNewSimulatorInstalled(context); - DownloadEntity simulatorDownloadEntity = SimulatorGameManager.findDownloadEntityByUrl(apkEntity.getUrl()); - if (simulatorDownloadEntity != null && gameEntity.getSimulator() != null) { - boolean isInstalled = PackageUtils.isInstalledFromAllPackage(context, gameEntity.getSimulator().getApk().getPackageName()); - if (isInstalled) { - installCount++; - isRelatedEmulatorInstalled = true; - } else { - doneCount++; - } - } - } - } - if ((isRelatedEmulatorInstalled || isInstalledNewSimulator) && doneCount != 0) { - return context.getString(R.string.launch); - } - - if (gameEntity.isVGame()) { - // 如果 doneCount 为 0 或者数据库为空 - // 表明本地并没有此游戏的数据库数据,需要重新下载 - if (doneCount == 0 - || downloadEntity == null - || !VHelper.isInstalled(downloadEntity.getPackageName())) { - installCount = 0; - } else { - doneCount = 0; - installCount = 1; - } - } - - if (doneCount != 0) { - return context.getString(R.string.install); - } else if (pluginCount != 0 && !SimulatorGameManager.isSimulatorGame(gameEntity)) { - return context.getString(R.string.pluggable); - } else if (updateCount != 0 && !SimulatorGameManager.isSimulatorGame(gameEntity)) { - return context.getString(R.string.update); - } else if (installCount != 0) { - return context.getString(R.string.launch); - } else if ("demo".equals(gameEntity.getDownloadStatus())) { - return context.getString(R.string.attempt); - } else { - if (gameEntity.isVGame()) { - return context.getString(R.string.smooth); - } else { - if (Constants.V_GAME.equals(gameEntity.getDownloadStatus()) - || Constants.V_GAME_32.equals(gameEntity.getDownloadStatus())) { - GameEntity.GameCategory gameCategory = gameEntity.getGameCategory(); - if (gameCategory.equals(GameEntity.GameCategory.ONLINE_GAME) - || gameCategory.equals(GameEntity.GameCategory.INTERNATIONAL_ONLINE_GAME)) { - return context.getString(R.string.download); - } else { - return context.getString(R.string.attempt); - } - } else { - return context.getString(R.string.download); - } - } - } - } - - /** - * 获取GameUpdateEntity(插件化) - */ - public static GameUpdateEntity getGameUpdateEntity(GameEntity gameEntity, ApkEntity apkEntity) { - GameUpdateEntity gameUpdateEntity = new GameUpdateEntity(); - gameUpdateEntity.setId(gameEntity.getId()); - gameUpdateEntity.setIcon(gameEntity.getIcon()); - gameUpdateEntity.setRawIcon(gameEntity.getRawIcon()); - gameUpdateEntity.setIconSubscript(gameEntity.getIconSubscript()); - gameUpdateEntity.setIconFloat(gameEntity.getIconFloat()); - gameUpdateEntity.setName(gameEntity.getName()); - gameUpdateEntity.setPackageName(apkEntity.getPackageName()); - gameUpdateEntity.setSize(apkEntity.getSize()); - gameUpdateEntity.setVersion(apkEntity.getVersion()); - gameUpdateEntity.setGhVersion(apkEntity.getGhVersion()); - gameUpdateEntity.setUrl(apkEntity.getUrl()); - gameUpdateEntity.setPlatform(apkEntity.getPlatform()); - gameUpdateEntity.setEtag(apkEntity.getEtag()); - gameUpdateEntity.setPluggable(true); - gameUpdateEntity.setTagStyle(gameEntity.getTagStyle()); - gameUpdateEntity.setBrief(gameEntity.getBrief()); - gameUpdateEntity.setPlugin(apkEntity.getPlugin()); - gameUpdateEntity.setDownload(gameEntity.getDownload()); - gameUpdateEntity.setIndexPlugin(gameEntity.getIndexPlugin()); - gameUpdateEntity.setPluginDesc(gameEntity.getPluginDesc()); - gameUpdateEntity.setFormat(apkEntity.getFormat()); - gameUpdateEntity.setCurrentVersion(PackageUtils.getVersionNameByPackageName(apkEntity.getPackageName())); - gameUpdateEntity.setCategory(gameEntity.getCategory()); - - GameCollectionEntity pluggableCollection = getPluggableCollectionFromGameEntity(gameEntity, apkEntity.getPackageName()); - if (pluggableCollection != null) { - gameUpdateEntity.setPluggableCollection(pluggableCollection); - } - return gameUpdateEntity; - } - - @Nullable - public static GameCollectionEntity getPluggableCollectionFromGameEntity(GameEntity gameEntity, String targetPkg) { - // 添加插件化包所在的合集 - for (GameCollectionEntity collectionEntity : gameEntity.getCollection()) { - if (collectionEntity.getPackages().contains(targetPkg)) { - ArrayList saveApkEntity = new ArrayList<>(); - for (String pkg : collectionEntity.getPackages()) { - for (ApkEntity apk : gameEntity.getApk()) { - if (pkg.equals(apk.getPackageName())) { - saveApkEntity.add(apk); - break; - } - } - } - - ArrayList apkLinks = gameEntity.getApkLink(); - if (apkLinks != null) { - for (ApkLink apkLink : apkLinks) { - if (apkLink.getCollection().equals(collectionEntity.getId())) { - ApkEntity element = new ApkEntity(); - element.setApkLink(apkLink); - if (saveApkEntity.size() > apkLink.getSort()) { - saveApkEntity.add(apkLink.getSort(), element); - } else { - saveApkEntity.add(element); - } - } - } - } - - collectionEntity.setSaveApkEntity(saveApkEntity); - return collectionEntity; - } - } - return null; - } -} diff --git a/app/src/main/java/com/gh/common/util/GameUtils.kt b/app/src/main/java/com/gh/common/util/GameUtils.kt new file mode 100644 index 0000000000..c5dc066e3c --- /dev/null +++ b/app/src/main/java/com/gh/common/util/GameUtils.kt @@ -0,0 +1,343 @@ +package com.gh.common.util + +import android.content.Context +import android.text.TextUtils +import androidx.annotation.WorkerThread +import com.gh.common.constant.Config +import com.gh.common.simulator.SimulatorGameManager.findDownloadEntityByUrl +import com.gh.common.simulator.SimulatorGameManager.isNewSimulatorInstalled +import com.gh.common.simulator.SimulatorGameManager.isSimulatorGame +import com.gh.download.DownloadManager +import com.gh.gamecenter.R +import com.gh.gamecenter.common.utils.isLocalDownloadInDualDownloadMode +import com.gh.gamecenter.common.utils.isVGameDownloadInDualDownloadMode +import com.gh.gamecenter.core.AppExecutor.lightWeightIoExecutor +import com.gh.gamecenter.core.AppExecutor.uiExecutor +import com.gh.gamecenter.entity.GameUpdateEntity +import com.gh.gamecenter.feature.entity.* +import com.gh.gamecenter.feature.view.DownloadButton +import com.gh.gamecenter.manager.PackagesManager +import com.gh.gamecenter.manager.PackagesManager.isCanUpdate +import com.gh.vspace.VHelper +import com.lightgame.download.DownloadEntity +import com.lightgame.download.DownloadStatus + +object GameUtils { + /** + * 去除与重复sourceList相同的数据 + */ + fun removeDuplicateData(sourceList: MutableList?, rawList: MutableList?): MutableList? { + if (sourceList.isNullOrEmpty() || rawList.isNullOrEmpty()) { + return rawList + } + var id: String + var i = 0 + while (i < rawList.size) { + id = rawList[i].id + for (gameEntity in sourceList) { + if (id == gameEntity.id) { + rawList.removeAt(i) + i-- + break + } + } + i++ + } + return rawList + } + + /** + * 设置下载按钮状态 + */ + fun setDownloadBtnStatus( + context: Context, + gameEntity: GameEntity, + downloadBtn: DownloadButton, + pluginLocation: PluginLocation? + ) { + // getDownloadBtnText 里包括查询数据库、根据包名读取包体 meta 信息等 + lightWeightIoExecutor.execute { + val status = getDownloadBtnText( + context = context, + gameEntity = gameEntity, + isFromList = true, + fixedAsVGame = false, + pluginLocation = pluginLocation + ) + uiExecutor.execute { + downloadBtn.text = status + if (context.getString(R.string.pluggable) == status) { + downloadBtn.buttonStyle = DownloadButton.ButtonStyle.PLUGIN + var pluginDesc = gameEntity.pluginDesc + if (pluginDesc.length > 3) pluginDesc = pluginDesc.substring(0, 3) + downloadBtn.text = pluginDesc + "化" + } else { + downloadBtn.buttonStyle = DownloadButton.ButtonStyle.NORMAL + } + } + } + } + + /** + * 获取下载按钮文案 (相对耗时,请优先在子线程调用) + * + * @param isFromList 调用方是否来源自普通列表 (普通列表根据优先级确定是显示成畅玩状态还是普通下载状态) + * @param fixedAsVGame 固定以畅玩游戏的类型来获取状态 + */ + @WorkerThread + @JvmStatic + fun getDownloadBtnText(context: Context, + gameEntity: GameEntity, + isFromList: Boolean, + fixedAsVGame: Boolean, + pluginLocation: PluginLocation?): String { + if (gameEntity.getApk().size > 1) { + return "" + } + var doneCount = 0 // 下载完成数量 + var pluginCount = 0 // 可插件化数量 + var updateCount = 0 // 可更新数量 + var installCount = 0 // 已安装数量 + var isRelatedEmulatorInstalled = false // 若该游戏是模拟器游戏时其对应的模拟器是否已经安装 + var isInstalledNewSimulator = false // 是否安装新模拟器 + var downloadEntity: DownloadEntity? = null + var performAsVGame = false // 是否使用了畅玩作为 downloadEntity + var gh_id: Any? + apkFor@ for (apkEntity in gameEntity.getApk()) { + + val isInstalledLocally = PackagesManager.isInstalled(apkEntity.packageName) + + // filter by packageName + val settings = Config.getSettings() + if (settings != null && gameEntity.getApk().size > 1) { + for (pkgName in settings.gameDownloadBlackList) { + if (pkgName == apkEntity.packageName) { + continue@apkFor + } + } + } + + downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity) + + // 已安装的畅玩游戏实体 + val vGameDownloadEntity = VHelper.getVDownloadEntitySnapshot(gameEntity.id, apkEntity.packageName) + performAsVGame = if (fixedAsVGame) { + true + } else if (isFromList) { + if (vGameDownloadEntity == null && isInstalledLocally) { + false + } else { + gameEntity.isVGamePreferred() + } + } else { + false + } + + // 畅玩状态优先,且畅玩实体不为空时将 downloadEntity 置为畅玩实体 + if (performAsVGame && vGameDownloadEntity != null) { + downloadEntity = vGameDownloadEntity + } else if (!performAsVGame && !isFromList && downloadEntity?.isVGameDownloadInDualDownloadMode() == true) { + // 下载的任务是由畅玩触发的,游戏详情页不需判定为需要安装 + downloadEntity = null + } else if (performAsVGame && !isFromList && downloadEntity?.isLocalDownloadInDualDownloadMode() == true) { + // 下载的任务是由下载安装触发的,游戏详情页不需判定为需要安装 + downloadEntity = null + } + + if (downloadEntity != null) { + if (downloadEntity.status == DownloadStatus.done) { + doneCount++ + } else if (downloadEntity.isPluggable) { + pluginCount++ + } else if (downloadEntity.isUpdate) { + updateCount++ + } + } + + if (isCanUpdate(gameEntity.id, apkEntity.packageName, performAsVGame)) { + updateCount++ + } + + if (isInstalledLocally) { + gh_id = PackageUtils.getMetaData(context, apkEntity.packageName, "gh_id") + if (!TextUtils.isEmpty(apkEntity.ghVersion) + && !PackageUtils.isSignedByGh(context, apkEntity.packageName) + && apkEntity.isShowPlugin(pluginLocation!!) + ) { + pluginCount++ + } else if (gh_id == null || gh_id == gameEntity.id || gameEntity.shouldUseMirrorInfo()) { + installCount++ + } + } + + if (isSimulatorGame(gameEntity)) { + isInstalledNewSimulator = isNewSimulatorInstalled(context) + val simulatorDownloadEntity = findDownloadEntityByUrl(apkEntity.url) + if (simulatorDownloadEntity != null && gameEntity.simulator != null) { + val isInstalled = + PackageUtils.isInstalledFromAllPackage(context, gameEntity.simulator!!.apk!!.packageName) + if (isInstalled) { + installCount++ + isRelatedEmulatorInstalled = true + } else { + doneCount++ + } + } + } + } + + if ((isRelatedEmulatorInstalled || isInstalledNewSimulator) && doneCount != 0) { + return context.getString(R.string.launch) + } + + if (performAsVGame) { + // 如果 doneCount 为 0 或者数据库为空 + // 表明本地并没有此游戏的数据库数据,需要重新下载 + if (doneCount == 0 || downloadEntity == null || !VHelper.isInstalled(downloadEntity.packageName)) { + installCount = 0 + } else { + doneCount = 0 + installCount = 1 + } + } else { + if (gameEntity.isDualBtnModeEnabled()) { + // 双下载按钮模式下,若非更新,排除已安装的情况来影响按钮状态 + if (installCount != 0 && doneCount != 0 && downloadEntity?.isUpdate == false) { + doneCount = 0 + } + } + } + + return if (doneCount != 0) { + context.getString(R.string.install) + } else if (pluginCount != 0 && !isSimulatorGame(gameEntity)) { + context.getString(R.string.pluggable) + } else if (updateCount != 0 && !isSimulatorGame(gameEntity)) { + context.getString(R.string.update) + } else if (installCount != 0) { + context.getString(R.string.launch) + } else if ("demo" == gameEntity.downloadStatus) { + context.getString(R.string.attempt) + } else { + if (performAsVGame) { + context.getString(R.string.smooth) + } else { +// if (Constants.V_GAME == gameEntity.downloadStatus || Constants.V_GAME_32 == gameEntity.downloadStatus) { +// val gameCategory = gameEntity.getGameCategory() +// if (gameCategory == GameEntity.GameCategory.ONLINE_GAME +// || gameCategory == GameEntity.GameCategory.INTERNATIONAL_ONLINE_GAME) { +// context.getString(R.string.download) +// } else { +// context.getString(R.string.attempt) +// } +// } else { + context.getString(R.string.download) +// } + } + } + } + + /** + * 获取GameUpdateEntity(插件化) + */ + fun getGameUpdateEntity(gameEntity: GameEntity, apkEntity: ApkEntity): GameUpdateEntity { + val gameUpdateEntity = GameUpdateEntity() + gameUpdateEntity.id = gameEntity.id + gameUpdateEntity.icon = gameEntity.icon + gameUpdateEntity.rawIcon = gameEntity.rawIcon + gameUpdateEntity.iconSubscript = gameEntity.iconSubscript + gameUpdateEntity.iconFloat = gameEntity.iconFloat + gameUpdateEntity.name = gameEntity.name + gameUpdateEntity.packageName = apkEntity.packageName + gameUpdateEntity.size = apkEntity.size + gameUpdateEntity.version = apkEntity.version + gameUpdateEntity.ghVersion = apkEntity.ghVersion + gameUpdateEntity.url = apkEntity.url + gameUpdateEntity.platform = apkEntity.getPlatform() + gameUpdateEntity.etag = apkEntity.etag + gameUpdateEntity.isPluggable = true + gameUpdateEntity.tagStyle = gameEntity.tagStyle + gameUpdateEntity.brief = gameEntity.brief + gameUpdateEntity.plugin = apkEntity.plugin + gameUpdateEntity.download = gameEntity.download + gameUpdateEntity.indexPlugin = gameEntity.indexPlugin + gameUpdateEntity.pluginDesc = gameEntity.pluginDesc + gameUpdateEntity.format = apkEntity.format + gameUpdateEntity.currentVersion = PackageUtils.getVersionNameByPackageName(apkEntity.packageName) + gameUpdateEntity.category = gameEntity.category + val pluggableCollection = getPluggableCollectionFromGameEntity(gameEntity, apkEntity.packageName) + if (pluggableCollection != null) { + gameUpdateEntity.pluggableCollection = pluggableCollection + } + return gameUpdateEntity + } + + @JvmStatic + fun getPluggableCollectionFromGameEntity(gameEntity: GameEntity, targetPkg: String?): GameCollectionEntity? { + // 添加插件化包所在的合集 + for (collectionEntity in gameEntity.collection) { + if (collectionEntity.packages.contains(targetPkg)) { + val saveApkEntity = ArrayList() + for (pkg in collectionEntity.packages) { + for (apk in gameEntity.getApk()) { + if (pkg == apk.packageName) { + saveApkEntity.add(apk) + break + } + } + } + val apkLinks = gameEntity.apkLink + if (apkLinks != null) { + for (apkLink in apkLinks) { + if (apkLink.collection == collectionEntity.id) { + val element = ApkEntity() + element.apkLink = apkLink + if (saveApkEntity.size > apkLink.sort) { + saveApkEntity.add(apkLink.sort, element) + } else { + saveApkEntity.add(element) + } + } + } + } + collectionEntity.saveApkEntity = saveApkEntity + return collectionEntity + } + } + return null + } + + /** + * 是否以畅玩游戏的形式来处理 + */ + @JvmStatic + fun shouldPerformAsVGame(gameEntity: GameEntity): Boolean { + var performActionAsVGame = false + + if (gameEntity.getApk().size != 1) { + performActionAsVGame = false + } else { + when (gameEntity.getGameDownloadButtonMode()) { + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_VGAME -> performActionAsVGame = true + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD -> performActionAsVGame = false + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DUAL -> { + val packageName = gameEntity.getApk().first().packageName + val isInstalledAtDevice = PackagesManager.isInstalled(packageName) + val isInstalledAtVSpace = VHelper.getVDownloadEntitySnapshot(gameEntity.id, packageName) != null + + performActionAsVGame = if (isInstalledAtDevice && isInstalledAtVSpace) { + gameEntity.isVGamePreferred() + } else if (isInstalledAtDevice) { + false + } else if (isInstalledAtVSpace) { + true + } else { + gameEntity.isVGamePreferred() + } + } + } + } + + return performActionAsVGame + } +} diff --git a/app/src/main/java/com/gh/common/util/PackageInstaller.kt b/app/src/main/java/com/gh/common/util/PackageInstaller.kt index ba59371274..22adc4f927 100644 --- a/app/src/main/java/com/gh/common/util/PackageInstaller.kt +++ b/app/src/main/java/com/gh/common/util/PackageInstaller.kt @@ -15,10 +15,7 @@ import com.gh.common.xapk.XapkInstaller import com.gh.download.server.BrowserInstallHelper import com.gh.gamecenter.BuildConfig import com.gh.gamecenter.common.constant.Constants -import com.gh.gamecenter.common.utils.DialogHelper -import com.gh.gamecenter.common.utils.categoryChinese -import com.gh.gamecenter.common.utils.getExtension -import com.gh.gamecenter.common.utils.getMetaExtra +import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.utils.CurrentActivityHolder import com.gh.gamecenter.core.utils.MD5Utils import com.gh.gamecenter.core.utils.ToastUtils @@ -37,7 +34,7 @@ object PackageInstaller { */ @JvmStatic fun install(context: Context, downloadEntity: DownloadEntity?) { - downloadEntity?.let { install(context, downloadEntity, true) } + downloadEntity?.let { install(context, downloadEntity, showUnzipToast = true, ignoreAsVGame = false) } } /** @@ -46,16 +43,25 @@ object PackageInstaller { * 兼容所有包安装(apk,xapk),后续可加上apks * * 主动点击安装如果是xapk则需要toast提示 + * + * @param ignoreAsVGame 是否不需要以畅玩形式安装 + * + * */ @JvmStatic - fun install(context: Context, downloadEntity: DownloadEntity, showUnzipToast: Boolean) { + fun install(context: Context, + downloadEntity: DownloadEntity, + showUnzipToast: Boolean, + ignoreAsVGame: Boolean, + ) { val pkgPath = downloadEntity.path val isXapk = XapkInstaller.XAPK_EXTENSION_NAME == pkgPath.getExtension() - val isVGame = downloadEntity.getMetaExtra(Constants.SMOOTH_GAME) == "true" + val isDownloadAsVGame = downloadEntity.getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) == Constants.VGAME + || downloadEntity.getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) == Constants.DUAL_DOWNLOAD_VGAME val currentActivity = CurrentActivityHolder.getCurrentActivity() ?: return - if (isVGame) { + if (!ignoreAsVGame && isDownloadAsVGame) { VHelper.install(currentActivity, downloadEntity) return } diff --git a/app/src/main/java/com/gh/common/util/PackageLauncher.kt b/app/src/main/java/com/gh/common/util/PackageLauncher.kt index 6c8ec527dd..20d0615b9d 100644 --- a/app/src/main/java/com/gh/common/util/PackageLauncher.kt +++ b/app/src/main/java/com/gh/common/util/PackageLauncher.kt @@ -1,13 +1,77 @@ package com.gh.common.util import android.content.Context +import androidx.appcompat.app.AppCompatActivity +import com.gh.download.DownloadManager +import com.gh.gamecenter.common.utils.isVGameDownloadInDualDownloadMode import com.gh.gamecenter.core.utils.ToastUtils -import com.gh.gamecenter.feature.entity.GameInstall import com.gh.gamecenter.feature.entity.GameEntity +import com.gh.gamecenter.feature.entity.GameInstall import com.gh.gamecenter.packagehelper.PackageRepository +import com.gh.vspace.VHelper object PackageLauncher { + /** + * 自动选择启动已安装的畅玩或本地已安装的游戏 + * 仅适用于 gameEntity 只有一个 apk 的情况 + */ + @JvmStatic + fun launch( + context: Context, + gameEntity: GameEntity, + location: String? = null + ) { + if (gameEntity.getApk().isEmpty() || gameEntity.getApk().size > 1) { + return + } + + val packageName = gameEntity.getApk().first().packageName + + // 根据下载按钮类型进行进行不一样的处理 + when (gameEntity.getGameDownloadButtonMode()) { + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD -> { + launchApp(context, gameEntity, packageName) + } + + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_VGAME -> { + VHelper.installOrLaunch(context as AppCompatActivity, gameEntity, location) + } + + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DUAL -> { + val vGameIsInstalled = VHelper.isInstalled(packageName) + val localGameIsInstalled = PackageUtils.isInstalled(context, packageName) + + when { + vGameIsInstalled && localGameIsInstalled -> { + if (gameEntity.isVGamePreferred()) { + VHelper.installOrLaunch(context as AppCompatActivity, gameEntity, location) + } else { + launchApp(context, gameEntity, packageName) + } + } + + vGameIsInstalled -> { + VHelper.installOrLaunch(context as AppCompatActivity, gameEntity, location) + } + + localGameIsInstalled -> { + launchApp(context, gameEntity, packageName) + } + + else -> { + val downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity) + if (downloadEntity?.isVGameDownloadInDualDownloadMode() == true) { + VHelper.installOrLaunch(context as AppCompatActivity, gameEntity, location) + } else { + ToastUtils.toast("下载异常,请重新下载") + } + } + } + } + } + } + /* * 启动应用 */ 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 350a6f0432..e7438802b0 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -41,7 +41,6 @@ import com.gh.gamecenter.manager.PackagesManager; import com.gh.vspace.VHelper; import com.gh.vspace.db.VGameEntity; import com.halo.assistant.HaloApp; -import com.lg.vspace.VirtualAppManager; import com.lightgame.utils.Utils; import net.dongliu.apk.parser.ApkFile; @@ -110,10 +109,12 @@ public class PackageUtils { return !(MD5Str.equals(MD5Utils.calculateMD5(file))); } - /* - * 判断是否可以更新,只判断gh_version的大小 + /** + * 判断是否可以更新 + * @param gameEntity 游戏摘要实体 + * @param isVGame 是否为畅玩游戏(走特殊的判断更新逻辑) */ - public static List getUpdateData(GameEntity gameEntity) { + public static List getUpdateData(GameEntity gameEntity, boolean isVGame) { List updateList = new ArrayList<>(); @@ -169,7 +170,7 @@ public class PackageUtils { boolean shouldShowUpdate = apkEntity.getForce(); // 普通游戏根据本地是否有安装来确定是否 qualified,畅玩游戏直接进判断 boolean isUpdateQualified = - gameEntity.isVGame() || (!TextUtils.isEmpty(versionFromRequest) && !TextUtils.isEmpty(versionFromInstalledApp)); + isVGame || (!TextUtils.isEmpty(versionFromRequest) && !TextUtils.isEmpty(versionFromInstalledApp)); if (shouldShowUpdate && isUpdateQualified) { @@ -182,12 +183,11 @@ public class PackageUtils { } // 畅玩游戏根据 md5 是否一致确定是否需要更新 - if (gameEntity.isVGame()) { + if (isVGame) { VGameEntity vGameEntity = VHelper.getVGameSnapshot(gameEntity.getId(), apkEntity.getPackageName()); if (vGameEntity != null) { String md5FromInstalledVGame = ExtensionsKt.getMetaExtra(vGameEntity.getDownloadEntity(), Constants.APK_MD5); String md5FromRequest = apkEntity.getMd5(); - apkEntity.setPlatform(VHelper.PLATFORM_V); shouldShowUpdate = md5FromRequest != null && !md5FromRequest.equals(md5FromInstalledVGame); } else { @@ -219,6 +219,7 @@ public class PackageUtils { updateEntity.setFormat(apkEntity.getFormat()); updateEntity.setSignature(apkEntity.getSignature()); updateEntity.setCategory(gameEntity.getCategory()); + updateEntity.setVGameUpdate(isVGame); updateEntity.setCurrentVersion(PackageUtils.getVersionNameByPackageName(apkEntity.getPackageName())); if (gameEntity.isLandPageAddressDialog()) { updateEntity.setLandPageAddressDialog(gameEntity.getLandPageAddressDialog()); 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 4b5463b09c..5c440f0b77 100644 --- a/app/src/main/java/com/gh/common/util/RecommendPopupHelper.kt +++ b/app/src/main/java/com/gh/common/util/RecommendPopupHelper.kt @@ -23,7 +23,13 @@ object RecommendPopupHelper { //判断是否为多版本游戏 if (gameEntity.getApk().isEmpty() || gameEntity.getApk().size > 1) return null - val downloadBtnText = GameUtils.getDownloadBtnText(HaloApp.getInstance(), gameEntity, PluginLocation.only_game) + val downloadBtnText = GameUtils.getDownloadBtnText( + context = HaloApp.getInstance(), + gameEntity = gameEntity, + isFromList = false, + fixedAsVGame = false, + pluginLocation = PluginLocation.only_game + ) val filterEntities = arrayListOf() loop@ for (entity in popups) { diff --git a/app/src/main/java/com/gh/download/DownloadDataHelper.kt b/app/src/main/java/com/gh/download/DownloadDataHelper.kt index 73f31a3bc7..2338ef19d0 100644 --- a/app/src/main/java/com/gh/download/DownloadDataHelper.kt +++ b/app/src/main/java/com/gh/download/DownloadDataHelper.kt @@ -123,6 +123,7 @@ object DownloadDataHelper { payloadObject.put("package", downloadEntity.packageName) payloadObject.put("certification", RealNameHelper.getCertificationStatus()) payloadObject.put("filename", getFileName(downloadEntity)) + payloadObject.put("download_type", if (downloadEntity.asVGame()) "畅玩下载" else "本地下载") payloadObject.put("task_num", NDataChanger.downloadingTaskUrlSet.size) jsonObject.put("payload", payloadObject) } catch (e: Exception) { @@ -250,6 +251,7 @@ object DownloadDataHelper { payloadObject.put("certification", RealNameHelper.getCertificationStatus()) payloadObject.put("filename", getFileName(downloadEntity)) payloadObject.put("total_size", sizeInMB) + payloadObject.put("download_type", if (downloadEntity.asVGame()) "畅玩下载" else "本地下载") if (parallel != null) { payloadObject.put("parallel", parallel) } @@ -353,6 +355,7 @@ object DownloadDataHelper { sheet.put("package", downloadEntity.packageName) sheet.put("certification", RealNameHelper.getCertificationStatus()) sheet.put("filename", getFileName(downloadEntity)) + sheet.put("download_type", if (downloadEntity.asVGame()) "畅玩下载" else "本地下载") sheet.put("total_size", downloadEntity.size / 1024 / 1024) sheet.put("current_progress_size", downloadEntity.progress / 1024) mDownloadHeartbeatSheet[downloadEntity.url] = sheet diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index fc8d833208..a499f43680 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -25,7 +25,6 @@ import com.gh.common.exposure.ExposureUtils; import com.gh.gamecenter.common.exposure.meta.MetaUtil; import com.gh.common.history.HistoryHelper; import com.gh.common.simulator.SimulatorGameManager; -import com.gh.gamecenter.core.utils.AppDebugConfig; import com.gh.common.util.DataCollectionUtils; import com.gh.gamecenter.common.utils.DeviceUtils; import com.gh.common.util.DialogUtils; @@ -233,7 +232,7 @@ public class DownloadManager implements DownloadStatusListener { * * @param context 上下文 * @param gameEntity 游戏实体 (取 apk 里的第一个来进行下载) - * @param method 下载类型 + * @param asVGame 是否以畅玩游戏的形式下载 * @param entrance 来源 (细节见 https://git.ghzs.com/halo/android/assistant-android/-/wikis/entrance) * @param location 跟来源是类似的东西,我也不知道具体规则是怎么样的 :C * @param isSubscribe 是否是订阅下载(在WiFi环境下才下载) @@ -241,30 +240,32 @@ public class DownloadManager implements DownloadStatusListener { */ public static void createDownload(Context context, GameEntity gameEntity, - String method, + boolean asVGame, String entrance, String location, boolean isSubscribe, @Nullable ExposureEvent traceEvent) { - createDownload(context, gameEntity.getApk().get(0), gameEntity, method, entrance, location, isSubscribe, traceEvent); + createDownload(context, gameEntity.getApk().get(0), gameEntity, asVGame, gameEntity.isDualBtnModeEnabled(), entrance, location, isSubscribe, traceEvent); } /** * 创建下载任务 * - * @param context 上下文 - * @param gameEntity 游戏实体 (信息用于) - * @param apkEntity 安装包实体,实际用于下载的信息文件 - * @param method 下载类型 - * @param entrance 来源 (细节见 https://git.ghzs.com/halo/android/assistant-android/-/wikis/entrance) - * @param location 跟来源是类似的东西,我也不知道具体规则是怎么样的 :C - * @param isSubscribe 是否是订阅下载(在WiFi环境下才下载) - * @param traceEvent 曝光来源实体,用于记录一些简单的下载路径 + * @param context 上下文 + * @param gameEntity 游戏实体 (信息用于) + * @param apkEntity 安装包实体,实际用于下载的信息文件 + * @param entrance 来源 (细节见 https://git.ghzs.com/halo/android/assistant-android/-/wikis/entrance) + * @param location 跟来源是类似的东西,我也不知道具体规则是怎么样的 :C + * @param isSubscribe 是否是订阅下载(在WiFi环境下才下载) + * @param traceEvent 曝光来源实体,用于记录一些简单的下载路径 + * @param asVGame 作为畅玩游戏下载 + * @param isDualDownloadTypeEnabled 双下载按钮模式是否启用 */ public static void createDownload(final Context context, ApkEntity apkEntity, GameEntity gameEntity, - String method, + boolean asVGame, + boolean isDualDownloadTypeEnabled, String entrance, String location, boolean isSubscribe, @@ -340,14 +341,22 @@ public class DownloadManager implements DownloadStatusListener { ExtensionsKt.addMetaExtra(downloadEntity, Constants.SIMULATOR, GsonUtils.toJson(gameEntity.getSimulator())); } - if (gameEntity.isVGame()) { - ExtensionsKt.addMetaExtra(downloadEntity, Constants.SMOOTH_GAME, "true"); - ExtensionsKt.addMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE, Constants.SMOOTH_GAME); + if (asVGame) { + ExtensionsKt.addMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE, Constants.VGAME); ExtensionsKt.addMetaExtra(downloadEntity, DownloadConfig.KEY_PROGRESS_CALLBACK_INTERVAL, "200"); ExtensionsKt.addMetaExtra(downloadEntity, VHelper.KEY_REQUIRED_G_APPS, gameEntity.getGAppsSwitch()); ExtensionsKt.addMetaExtra(downloadEntity, VHelper.KEY_BIT, apkEntity.getBit()); } + // 记录是否为双下载按钮模式 + if (isDualDownloadTypeEnabled) { + if (asVGame) { + ExtensionsKt.setVGameDownloadModeInDualDownloadMode(downloadEntity); + } else { + ExtensionsKt.setLocalDownloadModeInDualDownloadMode(downloadEntity); + } + } + HashMap map = PageSwitchDataHelper.popLastPageData(); if (map != null && map.containsKey(PageSwitchDataHelper.PAGE_GAME_DETAIL_RECOMMEND)) { ExtensionsKt.addMetaExtra(downloadEntity, PageSwitchDataHelper.PAGE_GAME_DETAIL_RECOMMEND, "true"); @@ -371,7 +380,7 @@ public class DownloadManager implements DownloadStatusListener { downloadEntity.setPlugin(!TextUtils.isEmpty(apkEntity.getGhVersion())); - ExposureUtils.DownloadType downloadType = ExposureUtils.getDownloadType(apkEntity, gameEntity.getId(), gameEntity.isVGame()); + ExposureUtils.DownloadType downloadType = ExposureUtils.getDownloadType(apkEntity, gameEntity.getId(), asVGame); gameEntity.setIsPlatformRecommend(apkEntity.getRecommend() != null); ExposureEvent downloadExposureEvent = ExposureUtils.logADownloadExposureEvent(gameEntity, apkEntity.getPlatform(), traceEvent, downloadType); @@ -385,11 +394,7 @@ public class DownloadManager implements DownloadStatusListener { DownloadManager.getInstance().add(downloadEntity); } - if (AppDebugConfig.IS_DEBUG) { - AppDebugConfig.logMethodWithParams(DownloadManager.class, apkEntity.getUrl(), downloadEntity.getUrl(), method, entrance, location); - } - - if (gameEntity.isVGame()) { + if (asVGame) { SensorsBridge.trackEventWithExposureSource("HaloFunGameDownloadClick", downloadExposureEvent.getSource(), "game_name", gameEntity.getName(), @@ -397,6 +402,13 @@ public class DownloadManager implements DownloadStatusListener { "game_schema_type", gameEntity.getGameBitChinese()); } + String trackDownloadType = ""; + if (asVGame) { + trackDownloadType = "畅玩下载"; + } else { + trackDownloadType = "本地下载"; + } + SensorsBridge.trackEventWithExposureSource("DownloadProcessBegin", downloadExposureEvent.getSource(), "game_id", gameEntity.getId(), @@ -408,7 +420,8 @@ public class DownloadManager implements DownloadStatusListener { "page_business_id", GlobalActivityManager.getCurrentPageEntity().getPageBusinessId(), "last_page_name", GlobalActivityManager.getLastPageEntity().getPageName(), "last_page_id", GlobalActivityManager.getLastPageEntity().getPageId(), - "last_page_business_id", GlobalActivityManager.getLastPageEntity().getPageBusinessId() + "last_page_business_id", GlobalActivityManager.getLastPageEntity().getPageBusinessId(), + "download_type", trackDownloadType ); //TODO remove @@ -435,7 +448,6 @@ public class DownloadManager implements DownloadStatusListener { SentryHelper.INSTANCE.onEvent("CLEAR_DELETED_TASK_ERROR", "exception_digest", e.getLocalizedMessage()); } } - /** * 添加一个下载任务 *

@@ -443,13 +455,25 @@ public class DownloadManager implements DownloadStatusListener { */ @Deprecated public void add(DownloadEntity downloadEntity) { + add(downloadEntity, false); + } + + /** + * 添加一个下载任务 + *

+ * 请优先使用 createDownload() + * + * @param ignoreDownloaded 忽略已经下载的内容 + */ + @Deprecated + public void add(DownloadEntity downloadEntity, boolean ignoreDownloaded) { updateDownloadMetaMap(); if (downloadEntity != null) { String url = downloadEntity.getUrl(); checkDownloadEntryRecordValidate(url); - if (isDownloadCompleted(url)) { + if (isDownloadCompleted(url) && !ignoreDownloaded) { downloadEntity.setStatus(DownloadStatus.done); NDataChanger.INSTANCE.notifyDataChanged(downloadEntity); } else if (!isTaskDownloading(url)) { @@ -608,24 +632,23 @@ public class DownloadManager implements DownloadStatusListener { @Nullable public DownloadEntity getDownloadEntitySnapshot(GameEntity gameEntity) { if (gameEntity == null || gameEntity.getApk().size() == 0) return null; - return getDownloadEntitySnapshot(gameEntity.getApk().get(0).getUrl(), gameEntity.getId(), gameEntity.isVGame()); + return getDownloadEntitySnapshot(gameEntity.getApk().get(0).getUrl(), gameEntity.getId()); } /** * 获取快照 *

- * 畅玩游戏优先根据游戏 ID 获取,非畅玩游戏根据 url 获取 + * 优先根据游戏 ID 获取,次选根据 url 获取 * - * @param url 下载链接 - * @param isVGame 是不是畅玩游戏 - * @param gameId 游戏 ID + * @param url 下载链接 + * @param gameId 游戏 ID * @return null表示下载列表中不存在该任务,否则返回下载任务 */ @Nullable - public DownloadEntity getDownloadEntitySnapshot(String url, String gameId, boolean isVGame) { + public DownloadEntity getDownloadEntitySnapshot(String url, String gameId) { DownloadEntity snapshot = null; - if (isVGame && !TextUtils.isEmpty(gameId)) { + if (!TextUtils.isEmpty(gameId)) { snapshot = mDownloadDao.getSnapshotByGameId(gameId); } @@ -753,7 +776,8 @@ public class DownloadManager implements DownloadStatusListener { ArrayList filteredDownloadEntityList = new ArrayList<>(); for (DownloadEntity downloadEntity : downloadList) { - if (Constants.SMOOTH_GAME.equals(ExtensionsKt.getMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE))) { + if (Constants.VGAME.equals(ExtensionsKt.getMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE)) + || Constants.DUAL_DOWNLOAD_VGAME.equals(ExtensionsKt.getMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE))) { filteredDownloadEntityList.add(downloadEntity); } } @@ -768,9 +792,11 @@ public class DownloadManager implements DownloadStatusListener { for (DownloadEntity downloadEntity : downloadEntityList) { if (!ExtensionsKt.isSimulatorGame(downloadEntity)) { - if (!Constants.SILENT_UPDATE.equals(ExtensionsKt.getMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE)) - && !Constants.SIMULATOR_DOWNLOAD.equals(ExtensionsKt.getMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE)) - && !Constants.SMOOTH_GAME.equals(ExtensionsKt.getMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE)) + String extraDownloadType = ExtensionsKt.getMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE); + if (!Constants.SILENT_UPDATE.equals(extraDownloadType) + && !Constants.SIMULATOR_DOWNLOAD.equals(extraDownloadType) + && !Constants.VGAME.equals(extraDownloadType) + && !Constants.DUAL_DOWNLOAD_VGAME.equals(extraDownloadType) ) { filteredDownloadEntityList.add(downloadEntity); } @@ -858,6 +884,8 @@ public class DownloadManager implements DownloadStatusListener { initGameMap(); + entry.setUpdate(false); + if (cancelSilently) { entry.setStatus(DownloadStatus.cancel); cancelAndNotify(entry, true); @@ -1290,7 +1318,7 @@ public class DownloadManager implements DownloadStatusListener { public void resumeAllInvisiblePendingTask() { for (DownloadEntity task : mInvisiblePendingTaskList) { if ("false".equals(task.getMeta().get("force_real_name"))) { - add(task); + add(task, false); } } mInvisiblePendingTaskList.clear(); diff --git a/app/src/main/java/com/gh/download/PackageObserver.kt b/app/src/main/java/com/gh/download/PackageObserver.kt index 8ac0856599..7fe136d5e5 100644 --- a/app/src/main/java/com/gh/download/PackageObserver.kt +++ b/app/src/main/java/com/gh/download/PackageObserver.kt @@ -2,19 +2,16 @@ package com.gh.download import android.annotation.SuppressLint import android.text.TextUtils +import com.gh.common.util.* import com.gh.gamecenter.feature.utils.ConcernUtils -import com.gh.common.util.DataCollectionUtils -import com.gh.common.util.PackageInstaller -import com.gh.common.util.PackageUtils import com.gh.common.xapk.XapkInstaller import com.gh.download.server.BrowserInstallHelper import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.loghub.LoghubUtils import com.gh.gamecenter.common.retrofit.EmptyResponse import com.gh.gamecenter.common.retrofit.Response +import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.common.utils.NewFlatLogUtils -import com.gh.gamecenter.common.utils.SensorsBridge -import com.gh.gamecenter.common.utils.isVGame import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.core.utils.ThirdPartyPackageHelper @@ -22,12 +19,13 @@ import com.gh.gamecenter.core.utils.UrlFilterUtils import com.gh.gamecenter.entity.GameDigestEntity import com.gh.gamecenter.eventbus.EBPackage import com.gh.gamecenter.login.user.UserManager +import com.gh.gamecenter.manager.PackagesManager import com.gh.gamecenter.packagehelper.PackageRepository import com.gh.gamecenter.packagehelper.PackageViewModel import com.gh.gamecenter.retrofit.RetrofitManager +import com.gh.vspace.VHelper import com.halo.assistant.HaloApp import com.lightgame.download.DownloadEntity -import com.lightgame.download.FileUtils import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers @@ -108,16 +106,24 @@ object PackageObserver { if (gh_id == null) { ThirdPartyPackageHelper.saveGameId(mDownloadEntity.packageName, mDownloadEntity.gameId) } - if (mDownloadEntity.isVGame()) { - // 畅玩游戏安装完成的同时直接删除文件 - runOnIoThread { FileUtils.deleteFile(mDownloadEntity.path) } - } if (mDownloadEntity.format == Constants.XAPK_FORMAT) { XapkInstaller.onInstalled(mDownloadEntity.path) } - DownloadManager.getInstance().cancel(mDownloadEntity.url, false, true, false) + // 双下载模式 + if (mDownloadEntity.isVGameDownloadInDualDownloadMode() || mDownloadEntity.isLocalDownloadInDualDownloadMode()) { + // 当双下载都完成或者是更新下载的时候清理任务 + // 畅玩下载不需要实名,如果用户没有本地实名信息,安装完成后也清理任务,避免可以免实名安装到本地 + if (mDownloadEntity.isUpdate + || (PackagesManager.isInstalled(packageName) && VHelper.isInstalled(packageName)) + || (busFour.isVGame && RealNameHelper.getCertificationStatus() != 2) + ) { + DownloadManager.getInstance().cancel(mDownloadEntity.url, true, true, false) + } + } else { + DownloadManager.getInstance().cancel(mDownloadEntity.url, true, true, false) + } if (SPUtils.getBoolean(Constants.SP_CONCERN_GAME, true)) { //设置页面控制是否安装后自动关注 // 安装后关注游戏 @@ -148,10 +154,10 @@ object PackageObserver { } if (EBPackage.TYPE_UNINSTALLED == busFour.type) { - mPackageViewModel.addUninstalledGame(packageName) + mPackageViewModel.addUninstalledGame(packageName, busFour.isVGame) mDownloadEntity?.let { - if (it.isVGame()) return@let + if (it.asVGame()) return@let if (it.isPluggable || (it.isUpdate && !PackageUtils.isInstalled(application, it.packageName))) { 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 8044d2e4b7..77209b1cd5 100644 --- a/app/src/main/java/com/gh/download/dialog/DownloadDialogItemViewHolder.kt +++ b/app/src/main/java/com/gh/download/dialog/DownloadDialogItemViewHolder.kt @@ -233,16 +233,12 @@ class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : Bas val gameEntity = viewModel.gameEntity itemView.setOnClickListener { - var mtaValue = "未知" when (itemView.getTag(DownloadDialogAdapter.ITEM_TAG_KEY)) { DownloadDialogItemStatus.DOWNLOAD -> { - createDownloadTask(it.context, apkEntity, gameEntity, "下载", traceEvent, entrance, location) - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_下载" + createDownloadTask(it.context, apkEntity, gameEntity, traceEvent, entrance, location) } DownloadDialogItemStatus.LAUNCH -> { PackageLauncher.launchApp(it.context, gameEntity, apkEntity.packageName) - - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_启动" } DownloadDialogItemStatus.DOWNLOADING -> { // 打开下载管理界面 @@ -256,18 +252,6 @@ class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : Bas if (AppManager.getInstance().currentActivity() is DownloadManagerActivity) { viewModel.dismissLiveData.postValue(Any()) } - - val downloadEntity = DownloadManager.getInstance().getDownloadEntityByUrl(apkEntity.url) - if (downloadEntity?.status == DownloadStatus.pause) { - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_暂停中" - } else if (downloadEntity?.status == DownloadStatus.waiting) { - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_等待中" - } else if (downloadEntity?.status == DownloadStatus.subscribe) { - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_排队中" - } else { - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_下载中" - } - } DownloadDialogItemStatus.INSTALL -> { val downloadEntity = DownloadManager.getInstance().getDownloadEntityByUrl(apkEntity.url) @@ -303,52 +287,34 @@ class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : Bas PackageInstaller.install(it.context, downloadEntity) } } - - if (downloadEntity.isPluggable) { - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_插件化安装" - } else { - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_安装" - } } DownloadDialogItemStatus.PLUGGABLE -> { - createDownloadTask(it.context, apkEntity, gameEntity, "插件化", traceEvent, entrance, location) - - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_插件化" + createDownloadTask(it.context, apkEntity, gameEntity, traceEvent, entrance, location) } DownloadDialogItemStatus.UPDATE -> { - createDownloadTask(it.context, apkEntity, gameEntity, "更新", traceEvent, entrance, location) - - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_更新" + createDownloadTask(it.context, apkEntity, gameEntity, traceEvent, entrance, location) } DownloadDialogItemStatus.COLLECTION -> { val apkCollection = apkEntity.apkCollection if (apkCollection != null) { viewModel.collectionLiveData.postValue(apkCollection) - - mtaValue = gameEntity.name + "_" + apkCollection.name + "_查看合集" } else if (apkEntity.downloadInstruction.isNotEmpty()) { val fakeCollection = GameCollectionEntity() fakeCollection.saveApkEntity = arrayListOf(apkEntity) fakeCollection.name = apkEntity.getPlatformName() fakeCollection.downloadInstruction = apkEntity.downloadInstruction viewModel.collectionLiveData.postValue(fakeCollection) - - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_查看详情" } else { throwExceptionInDebug("合集和下载说明至少一个不为空") } } DownloadDialogItemStatus.LINK -> { directToLinkPage(it.context, apkEntity.apkLink?.getLinkEntity()!!, entrance, path) - - mtaValue = gameEntity.name + "_" + apkEntity.apkLink?.name } DownloadDialogItemStatus.INSTALLED -> { - mtaValue = gameEntity.name + "_" + apkEntity.getPlatformName() + "_已安装" + // do nothing } } - throwExceptionInDebug("无法识别当前状态", mtaValue == "未知") -// MtaHelper.onEvent(DownloadDialog.MTA_KEY, "点击", mtaValue) } } @@ -356,7 +322,6 @@ class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : Bas context: Context, apkEntity: ApkEntity, gameEntity: GameEntity, - downloadMethod: String, traceEvent: ExposureEvent?, entrance: String, location: String @@ -367,7 +332,7 @@ class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : Bas BrowserInstallHelper.showBrowserInstallHintDialog( context, gameEntity, - gameEntity.isVGame() || gameEntity.isSplitXApk() + gameEntity.isSplitXApk() ) { DownloadDialogHelper.findAvailableDialogAndShow( context, @@ -393,7 +358,8 @@ class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : Bas context, apkEntity, gameEntity, - downloadMethod, + false, + false, entrance, location, isSubscribe, traceEvent diff --git a/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java b/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java index f50304d965..0ec8b03b37 100644 --- a/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java @@ -95,8 +95,6 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA private GameEntity mGameEntity; private boolean mIsScroll; - - private String mListStatus; // 记录列表领取状态(防止状态在详情改变导致列表状态改变) private String mName; private String mTitle; private boolean isClickReceiveBtnIn = false;//是否点击领取按钮进入 @@ -141,7 +139,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA if (!"pause".equals(DownloadManager.getInstance(). getStatus(downloadEntity.getUrl()))) { mDownloadEntity = downloadEntity; - DetailDownloadUtils.detailInvalidate(getDetailViewHolder()); + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); } } } @@ -156,8 +154,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA private DetailViewHolder getDetailViewHolder() { // 每次获取需要重新创建, 防止数据刷新 - return new DetailViewHolder(mContentView, mGameEntity, mDownloadEntity, - false, mEntrance, mName, mTitle, null); // 下载按钮ViewHolder + return new DetailViewHolder(mContentView, mGameEntity, false, mEntrance, mName, mTitle, null, false); // 下载按钮ViewHolder } public static Intent getIntent(Context context, LibaoEntity libaoEntity, boolean isClickReceiveBtnIn, String entrance) { @@ -262,7 +259,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA super.onResume(); if (mGameEntity != null && (mGameEntity.getApk().size() == 1 || mGameEntity.isReservable())) { - DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), true); + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); } DownloadManager.getInstance().addObserver(dataWatcher); } @@ -308,7 +305,6 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA if ((("linged").equals(status) || ("taoed").equals(status)) && ("ling".equals(beforeStatus) || "tao".equals(beforeStatus))) { //检查是否到了重复领取时间 - mListStatus = mLibaoEntity.getStatus(); if (isCanLing()) { mBaseHandler.sendEmptyMessage(1); } else { @@ -428,7 +424,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA mGameEntity.setWelcomeDialogInfoIfAvailable(); } - DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), true); + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); mAdapter.addLibaoDetail(LibaoDetailActivity.this, true); } @@ -449,19 +445,6 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA mIsScroll = isScroll; } - /*@Override - public boolean handleBackPressed() { - // 重置领取状态 - if (mLibaoEntity == null) { - return false; - } - String status = mLibaoEntity.getStatus(); - if (!TextUtils.isEmpty(status) && status.contains("repeat")) { - mLibaoEntity.setStatus(mListStatus); - } - return false; - }*/ - @Override public void loadDone() { if (mLlLoading != null) { @@ -549,7 +532,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA && mGameEntity.getApk().size() == 1) { String url = mGameEntity.getApk().get(0).getUrl(); if (url.equals(status.getUrl())) { - DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), false); + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); } } } @@ -563,7 +546,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA String packageName = apkEntity.getPackageName(); if (packageName.equals(busFour.getPackageName())) { ApkActiveUtils.filterHideApk(mGameEntity); - DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), false); + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); } } } @@ -583,7 +566,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA mDetailBottom.setBackgroundColor(ContextCompat.getColor(this, R.color.background)); mLibaoDetailRv.getRecycledViewPool().clear(); mAdapter.notifyItemRangeChanged(0, mAdapter.getItemCount()); - DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), false); + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); if (mLibaoDetailRv.getItemDecorationCount() > 0) { mLibaoDetailRv.removeItemDecorationAt(0); mLibaoDetailRv.addItemDecoration(getItemDecoration()); diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 05930ccc9d..a4908dea29 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -985,7 +985,7 @@ public class MainActivity extends BaseActivity { downloadEntity.getName(), "自动安装" ); - PackageInstaller.install(this, downloadEntity, false); + PackageInstaller.install(this, downloadEntity, false, false); } } SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, ""); diff --git a/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java b/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java index 464b691049..b90f92ef16 100644 --- a/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java @@ -129,7 +129,6 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli private GameEntity gameEntity; private NewsEntity mNewsEntity; - private DownloadEntity mDownloadEntity; private ExposureEvent mExposureEvent; @@ -143,32 +142,30 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli private RecyclerView.ItemDecoration mItemDecoration; - private DataWatcher dataWatcher = new DataWatcher() { + private final DataWatcher dataWatcher = new DataWatcher() { @Override public void onDataChanged(DownloadEntity downloadEntity) { if (gameEntity != null && gameEntity.getApk().size() == 1) { String url = gameEntity.getApk().get(0).getUrl(); if (url.equals(downloadEntity.getUrl())) { - if (!"pause".equals(DownloadManager.getInstance(). - getStatus(downloadEntity.getUrl()))) { - mDownloadEntity = downloadEntity; - DetailDownloadUtils.detailInvalidate(getDetailViewHolder()); + if (!"pause".equals(DownloadManager.getInstance().getStatus(downloadEntity.getUrl()))) { + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); } } } else if (gameEntity != null && gameEntity.getApk().size() > 1) { if (DownloadStatus.downloading.equals(downloadEntity.getStatus())) { - if (getDetailViewHolder().mDownloadTips.getVisibility() == View.GONE || !getDetailViewHolder().mDownloadTips.isAnimating()) { - getDetailViewHolder().mDownloadTips.setVisibility(View.VISIBLE); - ExtensionsKt.setDownloadTipsAnimation(getDetailViewHolder().mDownloadTips, true); + if (getDetailViewHolder().getDownloadTips().getVisibility() == View.GONE || !getDetailViewHolder().getDownloadTips().isAnimating()) { + getDetailViewHolder().getDownloadTips().setVisibility(View.VISIBLE); + ExtensionsKt.setDownloadTipsAnimation(getDetailViewHolder().getDownloadTips(), true); } } else if (DownloadStatus.waiting.equals(downloadEntity.getStatus()) || DownloadStatus.done.equals(downloadEntity.getStatus()) || DownloadStatus.pause.equals(downloadEntity.getStatus()) || DownloadStatus.timeout.equals(downloadEntity.getStatus()) || DownloadStatus.subscribe.equals(downloadEntity.getStatus()) || DownloadStatus.overflow.equals(downloadEntity.getStatus()) || DownloadStatus.neterror.equals(downloadEntity.getStatus())) { - getDetailViewHolder().mDownloadTips.setVisibility(View.VISIBLE); - ExtensionsKt.setDownloadTipsAnimation(getDetailViewHolder().mDownloadTips, false); + getDetailViewHolder().getDownloadTips().setVisibility(View.VISIBLE); + ExtensionsKt.setDownloadTipsAnimation(getDetailViewHolder().getDownloadTips(), false); } else { - getDetailViewHolder().mDownloadTips.setVisibility(View.GONE); + getDetailViewHolder().getDownloadTips().setVisibility(View.GONE); } } } @@ -199,8 +196,15 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli private DetailViewHolder getDetailViewHolder() { // 每次获取需要重新创建, 防止数据刷新 - return new DetailViewHolder(mContentView, gameEntity, mDownloadEntity, - true, mEntrance, "新闻详情", adapter.getTitle(), mExposureEvent); // 下载按钮ViewHolder + return new DetailViewHolder( + mContentView, + gameEntity, + true, + mEntrance, + "新闻详情", + adapter.getTitle(), + mExposureEvent, + false); // 下载按钮ViewHolder } /** @@ -464,7 +468,7 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli super.onResume(); if (gameEntity != null && (gameEntity.getApk().size() == 1 || gameEntity.isReservable())) { - DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), true); + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); } DownloadManager.getInstance().addObserver(dataWatcher); } @@ -713,7 +717,7 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli } } - DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), true); + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); } }); } @@ -772,7 +776,7 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli if ("delete".equals(status.getStatus()) && gameEntity != null && gameEntity.getApk().size() == 1) { String url = gameEntity.getApk().get(0).getUrl(); if (url.equals(status.getUrl())) { - DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), false); + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); } } } @@ -783,7 +787,7 @@ public class NewsDetailActivity extends DownloadToolbarActivity implements OnCli if (gameEntity != null && gameEntity.getApk().size() == 1) { String packageName = gameEntity.getApk().get(0).getPackageName(); if (packageName.equals(busFour.getPackageName())) { - DetailDownloadUtils.detailInitDownload(getDetailViewHolder(), false); + DetailDownloadUtils.updateViewHolder(getDetailViewHolder()); } } } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java index f6a511f712..e69de29bb2 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java @@ -1,569 +0,0 @@ -package com.gh.gamecenter.adapter.viewholder; - -import android.content.Context; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.FragmentActivity; - -import com.airbnb.lottie.LottieAnimationView; -import com.gh.common.chain.BrowserInstallHandler; -import com.gh.common.chain.CertificationHandler; -import com.gh.common.chain.ChainBuilder; -import com.gh.common.chain.ChainHandler; -import com.gh.common.chain.CheckDownloadHandler; -import com.gh.common.chain.CheckStoragePermissionHandler; -import com.gh.common.chain.DownloadDialogHelperHandler; -import com.gh.common.chain.GamePermissionHandler; -import com.gh.common.chain.LandPageAddressHandler; -import com.gh.common.chain.OverseaDownloadHandler; -import com.gh.common.chain.PackageCheckHandler; -import com.gh.common.chain.UnsupportedFeatureHandler; -import com.gh.common.chain.UpdateNewSimulatorHandler; -import com.gh.common.chain.ValidateVSpaceHandler; -import com.gh.common.chain.VersionNumberHandler; -import com.gh.common.constant.Config; -import com.gh.common.dialog.DeviceRemindDialog; -import com.gh.common.dialog.GameOffServiceDialogFragment; -import com.gh.common.filter.RegionSetting; -import com.gh.common.filter.RegionSettingHelper; -import com.gh.common.history.HistoryHelper; -import com.gh.common.simulator.NewSimulatorGameManager; -import com.gh.common.simulator.SimulatorDownloadManager; -import com.gh.common.simulator.SimulatorGameManager; -import com.gh.common.util.CheckLoginUtils; -import com.gh.common.util.DetailDownloadUtils; -import com.gh.common.util.DialogUtils; -import com.gh.common.util.DirectUtils; -import com.gh.common.util.LogUtils; -import com.gh.common.util.PackageInstaller; -import com.gh.common.util.PackageLauncher; -import com.gh.common.util.PackageUtils; -import com.gh.common.util.ReservationHelper; -import com.gh.common.xapk.XapkInstaller; -import com.gh.common.xapk.XapkUnzipStatus; -import com.gh.download.DownloadManager; -import com.gh.download.dialog.DownloadDialog; -import com.gh.gamecenter.DownloadManagerActivity; -import com.gh.gamecenter.R; -import com.gh.gamecenter.WebActivity; -import com.gh.gamecenter.common.constant.Constants; -import com.gh.gamecenter.common.constant.EntranceConsts; -import com.gh.gamecenter.common.entity.LinkEntity; -import com.gh.gamecenter.common.eventbus.EBReuse; -import com.gh.gamecenter.common.utils.DataLogUtils; -import com.gh.gamecenter.common.utils.DialogHelper; -import com.gh.gamecenter.common.utils.ExtensionsKt; -import com.gh.gamecenter.common.utils.NewFlatLogUtils; -import com.gh.gamecenter.common.utils.PermissionHelper; -import com.gh.gamecenter.common.utils.SensorsBridge; -import com.gh.gamecenter.core.utils.PageSwitchDataHelper; -import com.gh.gamecenter.core.utils.StringUtils; -import com.gh.gamecenter.eventbus.EBScroll; -import com.gh.gamecenter.feature.entity.ApkEntity; -import com.gh.gamecenter.feature.entity.GameEntity; -import com.gh.gamecenter.feature.entity.SimulatorEntity; -import com.gh.gamecenter.feature.exposure.ExposureEvent; -import com.gh.gamecenter.feature.view.DownloadButton; -import com.gh.gamecenter.gamedetail.GameDetailFragment; -import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment; -import com.gh.gamecenter.teenagermode.TeenagerModeActivity; -import com.gh.vspace.VDownloadManagerActivity; -import com.gh.vspace.VHelper; -import com.lightgame.download.DownloadEntity; -import com.lightgame.download.FileUtils; -import com.lightgame.utils.Utils; - -import org.greenrobot.eventbus.EventBus; - -import java.io.File; -import java.util.HashMap; - -/** - * Created by khy on 27/06/17. - * 详情页面下载ViewHolder - */ - -public class DetailViewHolder { - - public Context context; - - public GameEntity gameEntity; - public DownloadEntity downloadEntity; - public ExposureEvent traceEvent; - - public boolean isNewsDetail; // 新闻详情不显示下载的游戏名, 只显示下载状态 - - public View downloadBottom; - - public DownloadButton mDownloadPb; - public LottieAnimationView mDownloadTips; - public TextView mOverlayTv; // 额外的文字 (用于一些含图片的情况) - public TextView mMultiVersionDownloadTv; // 多版本下载文字 - - // 注意View的命名 - public DetailViewHolder(View view, GameEntity gameEntity, DownloadEntity downloadEntity, - boolean isNewsDetail, String entrance, String name, String title, @Nullable ExposureEvent traceEvent) { - downloadBottom = view.findViewById(R.id.detail_ll_bottom); - mDownloadPb = view.findViewById(R.id.detail_progressbar); - mDownloadTips = view.findViewById(R.id.downloadTipsLottie); - mOverlayTv = view.findViewById(R.id.overlayTv); - mMultiVersionDownloadTv = view.findViewById(R.id.multiVersionDownloadTv); - - this.gameEntity = gameEntity; - this.downloadEntity = downloadEntity; - this.traceEvent = traceEvent; - this.isNewsDetail = isNewsDetail; - this.context = view.getContext(); - - final OnDetailDownloadClickListener listener = new OnDetailDownloadClickListener(this, entrance, name, title, traceEvent); - mDownloadPb.setOnClickListener(listener); - ExtensionsKt.putWidgetBusinessName(mDownloadPb, "游戏详情页"); - ExtensionsKt.putObject(mDownloadPb, gameEntity); - - restoreDialogFragment(); - } - - public TextView getOverlayTv() { - return mOverlayTv; - } - - private void restoreDialogFragment() { - DialogFragment gamePermissionDialogFragment = - (DialogFragment) ((AppCompatActivity) context).getSupportFragmentManager().findFragmentByTag(GamePermissionDialogFragment.class.getName()); - if (gamePermissionDialogFragment != null) { - gamePermissionDialogFragment.dismissAllowingStateLoss(); - } - } - - static class OnDetailDownloadClickListener implements View.OnClickListener { - private final DetailViewHolder mViewHolder; - private final GameEntity mGameEntity; - private DownloadEntity mDownloadEntity; - private final String mEntrance; - private final String mName; - private final String mTitle; - private final ExposureEvent mTraceEvent; - - public OnDetailDownloadClickListener(DetailViewHolder viewHolder, String entrance, String name, String title, ExposureEvent traceEvent) { - mViewHolder = viewHolder; - mGameEntity = viewHolder.gameEntity; - mDownloadEntity = viewHolder.downloadEntity; - mEntrance = entrance; - mName = name; - mTitle = title; - mTraceEvent = traceEvent; - } - - @Override - public void onClick(View v) { - v.setTag(null); - if (mViewHolder.mDownloadPb.getButtonStyle() != DownloadButton.ButtonStyle.INSTALL_NORMAL - && mViewHolder.mDownloadPb.getButtonStyle() != DownloadButton.ButtonStyle.INSTALL_PLUGIN - && mViewHolder.mDownloadPb.getButtonStyle() != DownloadButton.ButtonStyle.LAUNCH_OR_OPEN) { - - if (mGameEntity.isVGame() && !VHelper.INSTANCE.shouldLaunchGameAfterInstallation()) { - // 畅玩游戏的非真实点击下载按钮下载不需要滚动到特定地方 - } else { - EventBus.getDefault().post(new EBScroll(Constants.EB_GAME_DETAIL, mGameEntity.getId())); - } - } - - if (mDownloadEntity == null) { - mDownloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(mGameEntity); - } - - if (mDownloadEntity != null) { - String xapkStatus = mDownloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS); - if (XapkUnzipStatus.SUCCESS.name().equals(xapkStatus) && XapkInstaller.INSTANCE.isInstalling(mDownloadEntity.getPath())) {// 安装过程中避免重复点击 - return; - } - if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { - XapkInstaller.cancelUnzipTask(mDownloadEntity); - return; - } else if (XapkUnzipStatus.FAILURE.name().equals(xapkStatus)) { - PermissionHelper.checkStoragePermissionBeforeAction( - mViewHolder.context, - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - mGameEntity.getCategoryChinese(), - () -> { - if (mDownloadEntity != null) { - final String path = mDownloadEntity.getPath(); - if (FileUtils.isEmptyFile(path)) { - Utils.toast(mViewHolder.context, R.string.install_failure_hint); - DownloadManager.getInstance().cancel(mDownloadEntity.getUrl()); - } else { - NewFlatLogUtils.INSTANCE.logGameInstall( - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - "主动安装" - ); - - SensorsBridge.trackInstallGameClick( - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - "主动安装" - ); - PackageInstaller.install(mViewHolder.context, mDownloadEntity); - } - } - }); - return; - } - } - - switch (mViewHolder.mDownloadPb.getButtonStyle()) { - case NONE_WITH_HINT: - case NONE: - String offStatus = mGameEntity.getDownloadOffStatus(); - if (offStatus != null && !"off".equals(offStatus)) { - if ("dialog".equals(offStatus)) { - showOffServiceDialog(mGameEntity.getDownloadOffDialog()); - } else if ("toast".equals(offStatus)) { - EventBus.getDefault().post(new EBReuse(GameDetailFragment.SKIP_RATING)); - Utils.toast(mViewHolder.context, "该游戏因故暂不提供下载,具体详情可在相关评论中查看,敬请谅解~"); - } - } else { - Utils.toast(mViewHolder.context, "该游戏已关闭下载"); - } - break; - case NORMAL: - final RegionSetting.GameH5Download gameH5Download = RegionSettingHelper.getGameH5DownloadByGameId(mGameEntity.getId()); - if (gameH5Download != null) { - DialogUtils.showGameH5DownloadDialog(mViewHolder.context, mGameEntity, gameH5Download); - break; - } else { - DataLogUtils.uploadGameLog(mViewHolder.context, mGameEntity.getId(), mGameEntity.getName(), mEntrance); - } - case PLUGIN: - ChainBuilder builder = new ChainBuilder(); - builder.addHandler(new UnsupportedFeatureHandler()); - builder.addHandler(new UpdateNewSimulatorHandler()); - builder.addHandler(new GamePermissionHandler()); - builder.addHandler(new CheckStoragePermissionHandler()); - builder.addHandler(new ValidateVSpaceHandler()); - - if (mGameEntity.getApk().size() == 1) { - builder.addHandler(new BrowserInstallHandler()); - builder.addHandler(new PackageCheckHandler()); - builder.addHandler(new DownloadDialogHelperHandler()); - builder.addHandler(new CertificationHandler()); - builder.addHandler(new VersionNumberHandler()); - builder.addHandler(new LandPageAddressHandler()); - builder.addHandler(new OverseaDownloadHandler()); - builder.addHandler(new CheckDownloadHandler()); - - builder.setProcessEndCallback(o -> { - download((boolean) o); - return null; - }); - final ChainHandler chainHandler = builder.buildHandlerChain(); - if (chainHandler != null) { - chainHandler.handleRequest(v.getContext(), mGameEntity); - } - } else { - builder.addHandler(new CertificationHandler()); - builder.addHandler(new VersionNumberHandler()); - builder.setProcessEndCallback(o -> { - DownloadDialog.showDownloadDialog( - mViewHolder.context, - mGameEntity, - mTraceEvent, - StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"), - mName + ":" + mTitle); - return null; - }); - final ChainHandler chainHandler = builder.buildHandlerChain(); - if (chainHandler != null) { - chainHandler.handleRequest(v.getContext(), mGameEntity); - } - } - - break; - case LAUNCH_OR_OPEN: - if (mGameEntity.getApk().size() == 1) { - //启动模拟器游戏 - if (SimulatorGameManager.isSimulatorGame(mGameEntity)) { - if (NewSimulatorGameManager.shouldShowUpdateNewSimulatorAlert(mViewHolder.context)) { - NewSimulatorGameManager.showUpdateNewsSimulator(mViewHolder.context, mGameEntity, null); - return; - } - DownloadEntity downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(mGameEntity.getApk().get(0).getUrl()); - if (downloadEntity != null) { - File file = new File(downloadEntity.getPath()); - if (!file.exists()) { - download(false); - return; - } - SimulatorGameManager.launchSimulatorGame(downloadEntity, mGameEntity); - } - return; - } - - if (mGameEntity.isVGame()) { - VHelper.installOrLaunch(mViewHolder.context, mGameEntity, null); - return; - } - - PackageLauncher.launchApp(mViewHolder.context, mGameEntity, mGameEntity.getApk().get(0).getPackageName()); - } else { - GamePermissionDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity, mGameEntity.getInfo(), () -> { - PermissionHelper.checkStoragePermissionBeforeAction( - mViewHolder.context, - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - mGameEntity.getCategoryChinese(), - () -> { - DownloadDialog.showDownloadDialog( - mViewHolder.context, - mGameEntity, - mTraceEvent, - StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"), - mName + ":" + mTitle); - }); - }); - } - break; - case INSTALL_PLUGIN: - case INSTALL_NORMAL: - if (mGameEntity.getApk().isEmpty()) return; - - NewFlatLogUtils.INSTANCE.logGameInstall( - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - "主动安装" - ); - - SensorsBridge.trackInstallGameClick( - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - "主动安装" - ); - - ApkEntity apk = mGameEntity.getApk().get(0); - DownloadEntity downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(apk.getUrl()); - if (mGameEntity.getSimulator() != null) { - boolean isInstalled = PackageUtils.isInstalledFromAllPackage(mViewHolder.context, mGameEntity.getSimulator().getApk().getPackageName()); - boolean isInstalledNewSimulator = SimulatorGameManager.isNewSimulatorInstalled(mViewHolder.context); - boolean isInstalledOldSimulator = SimulatorGameManager.isOldSimulatorInstalled(mViewHolder.context); - SimulatorEntity simulator = mGameEntity.getSimulator(); - SimulatorEntity newSimulator = Config.getNewSimulatorEntitySetting(); - if (!isInstalledOldSimulator && newSimulator != null && newSimulator.getActive()) { - simulator = newSimulator; - } - - if (downloadEntity != null && SimulatorGameManager.isSimulatorGame(mGameEntity) && !isInstalled && !isInstalledNewSimulator) { - SimulatorDownloadManager.getInstance().showDownloadDialog(mViewHolder.context, simulator, - SimulatorDownloadManager.SimulatorLocation.LAUNCH, mGameEntity.getId(), mGameEntity.getName(), mGameEntity.getCategoryChinese(), null); - return; - } - } - - if (mGameEntity.isVGame()) { - VHelper.installOrLaunch(v.getContext(), mGameEntity, null); - return; - } - - PermissionHelper.checkStoragePermissionBeforeAction( - mViewHolder.context, - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - mGameEntity.getCategoryChinese(), - () -> { - if (mDownloadEntity == null) { - mDownloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(mGameEntity); - } - - if (mDownloadEntity != null) { - final String path = mDownloadEntity.getPath(); - if (FileUtils.isEmptyFile(path)) { - Utils.toast(mViewHolder.context, R.string.install_failure_hint); - DownloadManager.getInstance().cancel(mDownloadEntity.getUrl()); - } else { - PackageInstaller.install(mViewHolder.context, mDownloadEntity); - } - } - }); - break; - case RESERVABLE: - GamePermissionDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity, mGameEntity.getInfo(), () -> { - SensorsBridge.trackEvent("AppointmentGame", "game_name", mGameEntity.getName(), "game_id", mGameEntity.getId()); - CheckLoginUtils.checkLogin(mViewHolder.context, mEntrance, () -> { - ReservationHelper.reserve(mViewHolder.context, mGameEntity.getId(), mGameEntity.getName(), () -> { - LogUtils.logReservation(mGameEntity, mTraceEvent); - DetailDownloadUtils.detailInitDownload(mViewHolder, false); - }); - }); - }); - break; - case RESERVED: - if ("download".equals(mGameEntity.getReserveStatus())) { - ReservationHelper.showDeleteReservationDialog(mViewHolder.context, () -> { - ReservationHelper.deleteReservation(mGameEntity, () -> { - DetailDownloadUtils.detailInitDownload(mViewHolder, false); - }); - }); - } else { - ReservationHelper.showCancelReservationDialog(mViewHolder.context, () -> { - ReservationHelper.cancelReservation(mGameEntity, () -> { - DetailDownloadUtils.detailInitDownload(mViewHolder, false); - }); - }); - } - break; - case H5_GAME: - LinkEntity linkEntity = mGameEntity.getH5Link(); - - boolean isPlay = "play".equals(linkEntity.getType()); // 是否为开始玩 - if (isPlay) { - HistoryHelper.insertGameEntity(mGameEntity); - } - - GamePermissionDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity, mGameEntity.getInfo(), () -> { - Intent i = new Intent(WebActivity.getIntentForWebGame(mViewHolder.context, linkEntity.getLink(), mGameEntity.getName(), isPlay, linkEntity.getCloseButton())); - mViewHolder.context.startActivity(i); - }); - break; - case UPDATING: - Utils.toast(mViewHolder.context, "正在加急更新版本,敬请后续留意"); - break; - case TEENAGER_MODE: - SensorsBridge.trackAdolescentModeDialogShow( - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - mGameEntity.getCategoryChinese() - ); - DialogHelper.showCenterDialog( - mViewHolder.context, - "提示", "当前处于儿童/青少年模式, \n暂不提供游戏下载", "退出青少年模式", "关闭", - () -> { - mViewHolder.context.startActivity(TeenagerModeActivity.getIntent(mViewHolder.context)); - SensorsBridge.trackAdolescentModeDialogClick( - "退出青少年模式", - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - mGameEntity.getCategoryChinese() - ); - }, - () -> { - SensorsBridge.trackAdolescentModeDialogClick( - "关闭", - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - mGameEntity.getCategoryChinese() - ); - }, - () -> { - SensorsBridge.trackAdolescentModeDialogClick( - "关闭弹窗", - mGameEntity.getId(), - mGameEntity.getName() != null ? mGameEntity.getName() : "", - mGameEntity.getCategoryChinese() - ); - } - ); - break; - case SPECIAL_DOWNLOAD: - RegionSetting.GameSpecialDownloadInfo info = RegionSettingHelper.getGameSpecialDownloadInfo(mGameEntity.getId()); - if (info != null && !TextUtils.isEmpty(info.getBbsId())) { - if (!TextUtils.isEmpty(info.getTopId())) { - HashMap map = new HashMap<>(); - map.put(EntranceConsts.KEY_TOP_ID, info.getTopId()); - PageSwitchDataHelper.pushCurrentPageData(map); - } - DirectUtils.directForumDetail(mViewHolder.context, info.getBbsId(), mEntrance); - } - break; - case WAITING: - Utils.toast(mViewHolder.context, "最多只能同时下载三个任务,请稍等"); - break; - case DOWNLOADING_NORMAL: - case DOWNLOADING_PLUGIN: - if (mDownloadEntity == null) { - mDownloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(mGameEntity); - } - - if (mDownloadEntity != null) { - if (mViewHolder.mDownloadPb.getText().contains("继续加载")) { - DownloadManager.getInstance().resume(mDownloadEntity, true); - } else { - DownloadManager.getInstance().pause(mDownloadEntity.getUrl()); - mViewHolder.mDownloadPb.setText("继续加载 " + mDownloadEntity.getPercent() + "%"); - } - } - break; - default: - if (mGameEntity.isVGame()) { - mViewHolder.context.startActivity(VDownloadManagerActivity.getIntent(mViewHolder.context, true)); - } else if (!mGameEntity.getApk().isEmpty()) { - Intent intent = DownloadManagerActivity.getDownloadMangerIntent(mViewHolder.context, - mGameEntity.getApk().get(0).getUrl(), - StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])")); - mViewHolder.context.startActivity(intent); - } - break; - } - } - - private void showOffServiceDialog(GameEntity.Dialog dialog) { - GameOffServiceDialogFragment dialogFragment = GameOffServiceDialogFragment.getInstance(dialog); - dialogFragment.show(((FragmentActivity) mViewHolder.context).getSupportFragmentManager(), "off_service_dialog"); - } - - private void download(boolean isSubscribe) { - String str = mViewHolder.mDownloadPb.getText().toString(); - String method; - if (str.contains("更新")) { - method = "更新"; - } else if (str.contains("插件化")) { - method = "插件化"; - } else { - method = mViewHolder.context.getString(R.string.download); - } - - if (mGameEntity.getApk().size() == 0) { - Utils.toast(mViewHolder.context, "暂时无法下载,请稍后再试"); - return; - } - - ApkEntity apkEntity = mGameEntity.getApk().get(0); - String msg = FileUtils.isCanDownload(mViewHolder.context, apkEntity.getSize()); - if (TextUtils.isEmpty(msg)) { - if (mGameEntity.isVGame() && "更新".equals(method)) { - VHelper.updateOrReDownload(mGameEntity); - } else { - DownloadManager.createDownload(mViewHolder.context, - apkEntity, - mGameEntity, - method, - StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"), - mName + ":" + mTitle, - isSubscribe, - mTraceEvent); - } - - mViewHolder.mDownloadPb.setProgress(0); - mViewHolder.mDownloadPb.setButtonStyle("插件化".equals(method) ? - DownloadButton.ButtonStyle.DOWNLOADING_PLUGIN : DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); - DeviceRemindDialog.Companion.showDeviceRemindDialog(mViewHolder.context, mGameEntity); - - //去掉游戏详情页启动畅玩游戏弹出加载框的行为 https://jira.shanqu.cc/browse/GHZS-2087 - /*if (mGameEntity.isVGame() - && mViewHolder.context.getString(R.string.download).equals(method) - && VHelper.INSTANCE.shouldLaunchGameAfterInstallation() - && !(VHelper.INSTANCE.isGAppsRequired(mGameEntity) && !VHelper.INSTANCE.isGAppsInstalled())) { - mViewHolder.context.startActivity(VSpaceLoadingActivity.getIntent(mViewHolder.context, mGameEntity, false)); - }*/ - } else { - Utils.toast(mViewHolder.context, msg); - } - } - } - -} diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt new file mode 100644 index 0000000000..ea78734866 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt @@ -0,0 +1,644 @@ +package com.gh.gamecenter.adapter.viewholder + +import android.content.Context +import android.content.Intent +import android.text.TextUtils +import android.view.View +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentActivity +import com.airbnb.lottie.LottieAnimationView +import com.gh.common.chain.* +import com.gh.common.constant.Config +import com.gh.common.dialog.DeviceRemindDialog +import com.gh.common.dialog.GameOffServiceDialogFragment +import com.gh.common.filter.RegionSettingHelper +import com.gh.common.history.HistoryHelper +import com.gh.common.simulator.NewSimulatorGameManager +import com.gh.common.simulator.SimulatorDownloadManager +import com.gh.common.simulator.SimulatorGameManager +import com.gh.common.util.* +import com.gh.common.util.LogUtils +import com.gh.common.xapk.XapkInstaller +import com.gh.common.xapk.XapkUnzipStatus +import com.gh.download.DownloadManager +import com.gh.download.dialog.DownloadDialog +import com.gh.gamecenter.DownloadManagerActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.WebActivity +import com.gh.gamecenter.common.constant.Constants +import com.gh.gamecenter.common.constant.EntranceConsts +import com.gh.gamecenter.common.eventbus.EBReuse +import com.gh.gamecenter.common.utils.* +import com.gh.gamecenter.common.utils.NewFlatLogUtils +import com.gh.gamecenter.core.runOnIoThread +import com.gh.gamecenter.core.utils.PageSwitchDataHelper +import com.gh.gamecenter.core.utils.StringUtils +import com.gh.gamecenter.core.utils.ToastUtils +import com.gh.gamecenter.eventbus.EBScroll +import com.gh.gamecenter.feature.entity.GameEntity +import com.gh.gamecenter.feature.exposure.ExposureEvent +import com.gh.gamecenter.feature.view.DownloadButton +import com.gh.gamecenter.feature.view.DownloadButton.ButtonStyle +import com.gh.gamecenter.gamedetail.GameDetailFragment +import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment +import com.gh.gamecenter.teenagermode.TeenagerModeActivity.Companion.getIntent +import com.gh.vspace.VHelper +import com.lightgame.download.DownloadEntity +import com.lightgame.download.DownloadStatus +import com.lightgame.download.FileUtils +import org.greenrobot.eventbus.EventBus +import java.io.File + +// 虽然叫 ViewHolder,但其实就是一个用来临时放 View 和相关操作的包裹类 +class DetailViewHolder( + view: View, + val gameEntity: GameEntity, + val isNewsDetail: Boolean, // 新闻详情不显示下载的游戏名, 只显示下载状态 + entrance: String?, + name: String, + title: String?, + val traceEvent: ExposureEvent?, + val isSupportDualButton: Boolean = false // 是否支持双下载按钮,不支持的时候跟普通列表意义选用优先级高的那个来显示 +) { + var context: Context + var downloadBottom: View + + // 本地下载的占位下载按钮 + val localDownloadButton: DownloadButton? + + // 本地下载的尺寸 TV + val localDownloadSizeTv: TextView? + + // 本地下载的标题 TV + val localDownloadTitleTv: TextView? + + // 本地下载的外层包裹 View + val localDownloadContainer: View? + + // 额外的文字 (用于一些含图片的情况) + val overlayTv: TextView? + var downloadPb: DownloadButton + var downloadTips: LottieAnimationView + + // 多版本下载文字 + var multiVersionDownloadTv: TextView? + + // 注意 View 的命名 + init { + downloadBottom = view.findViewById(R.id.detail_ll_bottom) + downloadPb = view.findViewById(R.id.detail_progressbar) + downloadTips = view.findViewById(R.id.downloadTipsLottie) + overlayTv = view.findViewById(R.id.overlayTv) + multiVersionDownloadTv = view.findViewById(R.id.multiVersionDownloadTv) + localDownloadContainer = view.findViewById(R.id.localDownloadContainer) + localDownloadSizeTv = view.findViewById(R.id.localDownloadSizeTv) + localDownloadTitleTv = view.findViewById(R.id.localDownloadTitleTv) + localDownloadButton = view.findViewById(R.id.localDownloadButton) + + context = view.context + + var gameDownloadMode = gameEntity.getGameDownloadButtonMode() + + val localDownloadListener = OnDetailDownloadClickListener( + mViewHolder = this, + mEntrance = entrance, + mName = name, + mTitle = title ?: "", + mAsVGame = false, + mShowDualDownloadButton = gameDownloadMode == GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DUAL, + mTraceEvent = traceEvent + ) + + val vGameDownloadListener = OnDetailDownloadClickListener( + mViewHolder = this, + mEntrance = entrance, + mName = name, + mTitle = title ?: "", + mAsVGame = true, + mShowDualDownloadButton = gameDownloadMode == GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DUAL, + mTraceEvent = traceEvent + ) + + // 不支持双下载按钮的情况时,优选一个下载方式显示 + if (!isSupportDualButton) { + val performAsVGame = GameUtils.shouldPerformAsVGame(gameEntity) + gameDownloadMode = if (performAsVGame) { + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_VGAME + } else { + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD + } + } + + when (gameDownloadMode) { + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD -> { + // 仅显示下载按钮 + downloadPb.setOnClickListener(localDownloadListener) + localDownloadButton?.setOnClickListener(null) + } + + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_VGAME -> { + // 仅显示畅玩按钮 + downloadPb.setOnClickListener(vGameDownloadListener) + localDownloadButton?.setOnClickListener(null) + } + + GameEntity.GAME_DOWNLOAD_BUTTON_MODE_DUAL -> { + // 显示双按钮 + downloadPb.setOnClickListener(vGameDownloadListener) + localDownloadButton?.setOnClickListener(localDownloadListener) + localDownloadButton?.putObject(gameEntity) + localDownloadButton?.setTag(R.string.download, context.getString(R.string.download_local)) + } + } + downloadPb.putWidgetBusinessName("游戏详情页") + downloadPb.putObject(gameEntity) + restoreDialogFragment() + } + + private fun restoreDialogFragment() { + val gamePermissionDialogFragment = (context as AppCompatActivity).supportFragmentManager.findFragmentByTag( + GamePermissionDialogFragment::class.java.name + ) as DialogFragment? + gamePermissionDialogFragment?.dismissAllowingStateLoss() + } + + internal class OnDetailDownloadClickListener( + private val mViewHolder: DetailViewHolder, + private val mEntrance: String?, + private val mName: String, + private val mTitle: String, + private val mAsVGame: Boolean, + private val mShowDualDownloadButton: Boolean, + private val mTraceEvent: ExposureEvent? + ) : View.OnClickListener { + + private val mGameEntity: GameEntity = mViewHolder.gameEntity + private var mDownloadEntity: DownloadEntity? = null + + override fun onClick(v: View) { + v.tag = null + + val downloadButton: DownloadButton = if (mAsVGame) { + mViewHolder.downloadPb + } else if (mShowDualDownloadButton) { + mViewHolder.localDownloadButton ?: mViewHolder.downloadPb + } else { + mViewHolder.downloadPb + } + + if (downloadButton.buttonStyle !== ButtonStyle.INSTALL_NORMAL && downloadButton.buttonStyle !== ButtonStyle.INSTALL_PLUGIN && downloadButton.buttonStyle !== ButtonStyle.LAUNCH_OR_OPEN && downloadButton.buttonStyle !== ButtonStyle.NONE && downloadButton.buttonStyle !== ButtonStyle.NONE_WITH_HINT) { + // 畅玩游戏的非真实点击下载按钮下载不需要滚动到特定地方 + if (!mAsVGame || VHelper.shouldLaunchGameAfterInstallation()) { + EventBus.getDefault().post(EBScroll(Constants.EB_GAME_DETAIL, mGameEntity.id)) + } + } + + if (mDownloadEntity == null) { + mDownloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(mGameEntity) + } + + if (mDownloadEntity != null) { + val xapkStatus = mDownloadEntity!!.meta[XapkInstaller.XAPK_UNZIP_STATUS] + // 安装过程中避免重复点击 + if (XapkUnzipStatus.SUCCESS.name == xapkStatus && XapkInstaller.isInstalling(mDownloadEntity!!.path)) { + return + } + if (XapkUnzipStatus.UNZIPPING.name == xapkStatus) { + XapkInstaller.cancelUnzipTask(mDownloadEntity!!) + return + } else if (XapkUnzipStatus.FAILURE.name == xapkStatus) { + PermissionHelper.checkStoragePermissionBeforeAction( + mViewHolder.context, + mGameEntity.id, + (if (mGameEntity.name != null) mGameEntity.name else "")!!, + mGameEntity.categoryChinese + ) { + if (mDownloadEntity != null) { + val path = mDownloadEntity!!.path + if (FileUtils.isEmptyFile(path)) { + ToastUtils.toast(mViewHolder.context.getString(R.string.install_failure_hint)) + DownloadManager.getInstance().cancel(mDownloadEntity!!.url) + } else { + NewFlatLogUtils.logGameInstall( + mGameEntity.id, + mGameEntity.name ?: "", + "主动安装" + ) + SensorsBridge.trackInstallGameClick( + mGameEntity.id, + mGameEntity.name ?: "", + "主动安装" + ) + PackageInstaller.install(mViewHolder.context, mDownloadEntity) + } + } + } + return + } + } + + when (downloadButton.buttonStyle) { + ButtonStyle.NONE_WITH_HINT, ButtonStyle.NONE -> { + val offStatus = mGameEntity.downloadOffStatus + if (offStatus != null && "off" != offStatus) { + if ("dialog" == offStatus) { + showOffServiceDialog(mGameEntity.downloadOffDialog) + } else if ("toast" == offStatus) { + EventBus.getDefault().post(EBReuse(GameDetailFragment.SKIP_RATING)) + ToastUtils.toast("该游戏因故暂不提供下载,具体详情可在相关评论中查看,敬请谅解~") + } + } else { + ToastUtils.toast("该游戏已关闭下载") + } + } + + ButtonStyle.NORMAL -> { + val gameH5Download = RegionSettingHelper.getGameH5DownloadByGameId(mGameEntity.id) + if (gameH5Download != null) { + DialogUtils.showGameH5DownloadDialog(mViewHolder.context, mGameEntity, gameH5Download) + return + } else { + DataLogUtils.uploadGameLog(mViewHolder.context, mGameEntity.id, mGameEntity.name, mEntrance) + } + + preDownload() + } + + ButtonStyle.PLUGIN -> { + preDownload() + } + + ButtonStyle.LAUNCH_OR_OPEN -> if (mGameEntity.getApk().size == 1) { + //启动模拟器游戏 + if (SimulatorGameManager.isSimulatorGame(mGameEntity)) { + if (NewSimulatorGameManager.shouldShowUpdateNewSimulatorAlert(mViewHolder.context)) { + NewSimulatorGameManager.showUpdateNewsSimulator(mViewHolder.context, mGameEntity, null) + return + } + val downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(mGameEntity.getApk()[0].url) + if (downloadEntity != null) { + val file = File(downloadEntity.path) + if (!file.exists()) { + download(asVGame = false, isSubscribe = false) + return + } + SimulatorGameManager.launchSimulatorGame(downloadEntity, mGameEntity) + } + return + } + if (mAsVGame) { + VHelper.installOrLaunch(mViewHolder.context, mGameEntity, null) + } else { + PackageLauncher.launchApp(mViewHolder.context, mGameEntity, mGameEntity.getUniquePackageName()) + } + } else { + GamePermissionDialogFragment.show( + activity = (mViewHolder.context as AppCompatActivity), + game = mGameEntity, + gameInfo = mGameEntity.info + ) { + PermissionHelper.checkStoragePermissionBeforeAction( + context = mViewHolder.context, + gameId = mGameEntity.id, + gameName = mGameEntity.name ?: "", + gameType = mGameEntity.categoryChinese + ) { + DownloadDialog.showDownloadDialog( + context = mViewHolder.context, + gameEntity = mGameEntity, + traceEvent = mTraceEvent, + entrance = StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"), + location = "$mName:$mTitle" + ) + } + } + } + + ButtonStyle.INSTALL_PLUGIN, ButtonStyle.INSTALL_NORMAL -> { + if (mGameEntity.getApk().isEmpty()) return + + NewFlatLogUtils.logGameInstall( + gameId = mGameEntity.id, + gameName = mGameEntity.name ?: "", + trigger = "主动安装" + ) + SensorsBridge.trackInstallGameClick( + gameId = mGameEntity.id, + gameName = mGameEntity.name ?: "", + action = "主动安装" + ) + val (_, _, _, url) = mGameEntity.getApk()[0] + val downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(url) + if (mGameEntity.simulator != null) { + val isInstalled = PackageUtils.isInstalledFromAllPackage( + mViewHolder.context, + mGameEntity.simulator!!.apk!!.packageName + ) + val isInstalledNewSimulator = SimulatorGameManager.isNewSimulatorInstalled(mViewHolder.context) + val isInstalledOldSimulator = SimulatorGameManager.isOldSimulatorInstalled(mViewHolder.context) + var simulator = mGameEntity.simulator + val newSimulator = Config.getNewSimulatorEntitySetting() + if (!isInstalledOldSimulator && newSimulator != null && newSimulator.active) { + simulator = newSimulator + } + if (downloadEntity != null && SimulatorGameManager.isSimulatorGame(mGameEntity) && !isInstalled && !isInstalledNewSimulator) { + SimulatorDownloadManager.getInstance().showDownloadDialog( + context = mViewHolder.context, + simulator = simulator, + location = SimulatorDownloadManager.SimulatorLocation.LAUNCH, + gameId = mGameEntity.id, + gameName = mGameEntity.name!!, + gameCategoryChinese = mGameEntity.categoryChinese, + cancelCallback = null + ) + return + } + } + if (mAsVGame) { + VHelper.installOrLaunch(v.context, mGameEntity, null) + return + } + PermissionHelper.checkStoragePermissionBeforeAction( + context = mViewHolder.context, + gameId = mGameEntity.id, + gameName = (if (mGameEntity.name != null) mGameEntity.name else "")!!, + gameType = mGameEntity.categoryChinese + ) { + if (mDownloadEntity == null) { + mDownloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(mGameEntity) + } + if (mDownloadEntity != null) { + val path = mDownloadEntity!!.path + if (FileUtils.isEmptyFile(path)) { + ToastUtils.toast(mViewHolder.context.getString(R.string.install_failure_hint)) + DownloadManager.getInstance().cancel(mDownloadEntity!!.url) + } else { + PackageInstaller.install( + context = mViewHolder.context, + downloadEntity = mDownloadEntity!!, + showUnzipToast = false, + ignoreAsVGame = true + ) + } + } + } + } + + ButtonStyle.RESERVABLE -> { + GamePermissionDialogFragment.show( + activity = (mViewHolder.context as AppCompatActivity), + game = mGameEntity, + gameInfo = mGameEntity.info + ) { + SensorsBridge.trackEvent( + "AppointmentGame", + "game_name", + mGameEntity.name!!, + "game_id", + mGameEntity.id + ) + CheckLoginUtils.checkLogin(mViewHolder.context, mEntrance) { + ReservationHelper.reserve(mViewHolder.context, mGameEntity.id, mGameEntity.name!!) { + LogUtils.logReservation(mGameEntity, mTraceEvent) + DetailDownloadUtils.updateViewHolder(mViewHolder) + } + } + } + } + + ButtonStyle.RESERVED -> { + if ("download" == mGameEntity.reserveStatus) { + ReservationHelper.showDeleteReservationDialog(mViewHolder.context) { + ReservationHelper.deleteReservation(mGameEntity) { + DetailDownloadUtils.updateViewHolder(mViewHolder) + } + } + } else { + ReservationHelper.showCancelReservationDialog(mViewHolder.context) { + ReservationHelper.cancelReservation(mGameEntity) { + DetailDownloadUtils.updateViewHolder(mViewHolder) + } + } + } + } + + ButtonStyle.H5_GAME -> { + val linkEntity = mGameEntity.h5Link + val isPlay = "play" == linkEntity!!.type // 是否为开始玩 + if (isPlay) { + HistoryHelper.insertGameEntity(mGameEntity) + } + GamePermissionDialogFragment.show( + (mViewHolder.context as AppCompatActivity), mGameEntity, mGameEntity.info + ) { + val i = Intent( + WebActivity.getIntentForWebGame( + mViewHolder.context, + linkEntity.link, + mGameEntity.name, + isPlay, + linkEntity.closeButton + ) + ) + mViewHolder.context.startActivity(i) + } + } + + ButtonStyle.UPDATING -> ToastUtils.toast("正在加急更新版本,敬请后续留意") + ButtonStyle.TEENAGER_MODE -> { + SensorsBridge.trackAdolescentModeDialogShow( + mGameEntity.id, + (if (mGameEntity.name != null) mGameEntity.name else "")!!, + mGameEntity.categoryChinese + ) + DialogHelper.showCenterDialog( + context = mViewHolder.context, + title = "提示", + content = "当前处于儿童/青少年模式, \n暂不提供游戏下载", + positiveText = "退出青少年模式", + negativeText = "关闭", + positiveClickCallback = { + mViewHolder.context.startActivity(getIntent(mViewHolder.context)) + SensorsBridge.trackAdolescentModeDialogClick( + "退出青少年模式", + mGameEntity.id, + (if (mGameEntity.name != null) mGameEntity.name else "")!!, + mGameEntity.categoryChinese + ) + }, + negativeClickCallback = { + SensorsBridge.trackAdolescentModeDialogClick( + "关闭弹窗", + mGameEntity.id, + (if (mGameEntity.name != null) mGameEntity.name else "")!!, + mGameEntity.categoryChinese + ) + } + ) { + SensorsBridge.trackAdolescentModeDialogClick( + "关闭", + mGameEntity.id, + (if (mGameEntity.name != null) mGameEntity.name else "")!!, + mGameEntity.categoryChinese + ) + } + } + + ButtonStyle.SPECIAL_DOWNLOAD -> { + val info = RegionSettingHelper.getGameSpecialDownloadInfo(mGameEntity.id) + if (info != null && !TextUtils.isEmpty(info.bbsId)) { + if (!TextUtils.isEmpty(info.topId)) { + val map = HashMap() + map[EntranceConsts.KEY_TOP_ID] = info.topId + PageSwitchDataHelper.pushCurrentPageData(map) + } + DirectUtils.directForumDetail(mViewHolder.context, info.bbsId, mEntrance) + } + } + + ButtonStyle.WAITING -> ToastUtils.toast("最多只能同时下载三个任务,请稍等") + ButtonStyle.DOWNLOADING_NORMAL, ButtonStyle.DOWNLOADING_PLUGIN -> { + if (mDownloadEntity == null) { + mDownloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(mGameEntity) + } + if (mDownloadEntity != null) { + if (downloadButton.text.contains("继续加载")) { + DownloadManager.getInstance().resume(mDownloadEntity, true) + } else { + DownloadManager.getInstance().pause(mDownloadEntity!!.url) + downloadButton.text = "继续加载 " + mDownloadEntity!!.percent + "%" + } + } + } + + else -> if (mGameEntity.getApk().isNotEmpty()) { + val intent = DownloadManagerActivity.getDownloadMangerIntent( + mViewHolder.context, + mGameEntity.getApk()[0].url, + StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])") + ) + mViewHolder.context.startActivity(intent) + } + } + } + + private fun showOffServiceDialog(dialog: GameEntity.Dialog?) { + val dialogFragment = GameOffServiceDialogFragment.getInstance(dialog!!) + dialogFragment.show((mViewHolder.context as FragmentActivity).supportFragmentManager, "off_service_dialog") + } + + private fun download(asVGame: Boolean, isSubscribe: Boolean) { + var buttonText = mViewHolder.downloadPb.text + + if (buttonText.isEmpty()) buttonText = mViewHolder.overlayTv?.text.toString() + + if (mGameEntity.getApk().size == 0) { + ToastUtils.toast("暂时无法下载,请稍后再试") + return + } + val apkEntity = mGameEntity.getApk()[0] + val msg = FileUtils.isCanDownload(mViewHolder.context, apkEntity.size) + if (TextUtils.isEmpty(msg)) { + if (asVGame && mViewHolder.context.getString(R.string.update_v) == buttonText) { + VHelper.updateOrReDownload(mGameEntity) + } else { + DownloadManager.createDownload( + mViewHolder.context, + apkEntity, + mGameEntity, + asVGame, + mGameEntity.isDualBtnModeEnabled(), + StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"), + "$mName:$mTitle", + isSubscribe, + mTraceEvent + ) + } + mViewHolder.downloadPb.progress = 0 + mViewHolder.downloadPb.buttonStyle = + if (buttonText.contains("插件化")) ButtonStyle.DOWNLOADING_PLUGIN else ButtonStyle.DOWNLOADING_NORMAL + DeviceRemindDialog.showDeviceRemindDialog(mViewHolder.context, mGameEntity) + } else { + ToastUtils.toast(msg) + } + } + + private fun preDownload() { + val builder = DownloadChainBuilder() + builder.addHandler(UnsupportedFeatureHandler()) + builder.addHandler(UpdateNewSimulatorHandler()) + builder.addHandler(GamePermissionHandler()) + builder.addHandler(CheckStoragePermissionHandler()) + builder.addHandler(ValidateVSpaceHandler()) + if (mGameEntity.getApk().size == 1) { + val downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(mGameEntity) + + // 双按钮下载,且是以另外一种状态进行下载完成的,那么更新它的下载触发源并直接唤起安装 + if (mShowDualDownloadButton + && downloadEntity != null + && downloadEntity.status == DownloadStatus.done + && !FileUtils.isEmptyFile(downloadEntity.path)) { + + if (downloadEntity.getMetaExtra(Constants.APK_MD5) != mGameEntity.getApk().firstOrNull()?.md5) { + // 已下载的 md5 与接口返回的不一样,不使用快速安装功能,重新下载安装 + DownloadManager.getInstance().cancel(downloadEntity.url) + } else if (mAsVGame && downloadEntity.isLocalDownloadInDualDownloadMode()) { + runOnIoThread { + // 由于不想执行上面的 builder 相关的判断,所以这里还是丑陋的修改 downloadEntity 实体并保存到数据库中 + downloadEntity.setVGameDownloadModeInDualDownloadMode() + DownloadManager.getInstance().updateDownloadEntity(downloadEntity) + PackageInstaller.install(mViewHolder.context, downloadEntity) + } + return + } else if (!mAsVGame && downloadEntity.isVGameDownloadInDualDownloadMode()) { + runOnIoThread { + downloadEntity.setLocalDownloadModeInDualDownloadMode() + DownloadManager.getInstance().updateDownloadEntity(downloadEntity) + PackageInstaller.install(mViewHolder.context, downloadEntity) + } + return + } + } + + builder.addHandler(BrowserInstallHandler()) + builder.addHandler(PackageCheckHandler()) + builder.addHandler(DownloadDialogHelperHandler()) + builder.addHandler(CertificationHandler()) + builder.addHandler(VersionNumberHandler()) + builder.addHandler(LandPageAddressHandler()) + builder.addHandler(OverseaDownloadHandler()) + builder.addHandler(CheckDownloadHandler()) + builder.setProcessEndCallback { asVGame: Boolean, isSubscribe: Any? -> + download(asVGame, isSubscribe as Boolean) + } + } else { + builder.addHandler(CertificationHandler()) + builder.addHandler(VersionNumberHandler()) + builder.setProcessEndCallback { _: Boolean?, _: Any? -> + DownloadDialog.showDownloadDialog( + mViewHolder.context, + mGameEntity, + mTraceEvent, + StringUtils.buildString( + mEntrance, + "+(", + mName, + "[", + mTitle, + "])" + ), + "$mName:$mTitle" + ) + } + } + val chainHandler = builder.buildHandlerChain() + chainHandler?.handleRequest( + mViewHolder.context, + mGameEntity, + mAsVGame + ) + } + } +} diff --git a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt index f04e8c2c81..7861080fd9 100644 --- a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt @@ -145,7 +145,7 @@ class NewCatalogListAdapter( event ) - DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), true, "star&brief") + DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), "star&brief") } else if (holder is FooterViewHolder) { holder.initItemPadding() holder.initFooterViewHolder(mViewModel, mIsLoading, mIsNetworkError, mIsOver) diff --git a/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt b/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt index 4c3fbd3cb7..a396373f03 100644 --- a/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt @@ -143,7 +143,7 @@ class NewCategoryListAdapter( event ) - DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), true) + DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding)) } else if (holder is FooterViewHolder) { holder.initItemPadding() holder.initFooterViewHolder(mViewModel, mIsLoading, mIsNetworkError, mIsOver) diff --git a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt index 79fc72142a..fe82e93446 100644 --- a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt @@ -190,7 +190,6 @@ class CategoryV2ListAdapter( mContext, gameEntity, CategoryGameViewHolder(holder.binding), - true, "star&brief" ) @@ -242,8 +241,8 @@ class CategoryV2ListAdapter( fun bindGameItem(gameEntity: GameEntity) { binding.run { gameIconView.displayGameIcon(gameEntity) + gameRating.textSize = if (gameEntity.commentCount > 3) 12F else 10F BindingAdapters.setGameName(gameName, gameEntity, false, null) - BindingAdapters.setTextSize(gameRating, if (gameEntity.commentCount > 3) 12 else 10) BindingAdapters.setGameTags(labelList, gameEntity) gameRating.setDrawableStart(if (gameEntity.commentCount > 3) R.drawable.game_horizontal_rating.toDrawable() else null) gameRating.text = if (gameEntity.commentCount > 3) { diff --git a/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerActivity.kt b/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerActivity.kt index 4cdfc5caa9..7bd74ec661 100644 --- a/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerActivity.kt @@ -325,7 +325,9 @@ class CloudArchiveManagerActivity : BaseActivity_TabLayout() { } DownloadStatus.done -> { if (PackagesManager.isCanUpdate( - gameEntity?.id, gameEntity?.getApk()?.firstOrNull()?.packageName + gameEntity?.id, + gameEntity?.getApk()?.firstOrNull()?.packageName, + true ) ) { btnText = getString(R.string.update) diff --git a/app/src/main/java/com/gh/gamecenter/discovery/DiscoveryAdapter.kt b/app/src/main/java/com/gh/gamecenter/discovery/DiscoveryAdapter.kt index 40c1f438b5..fce170102b 100644 --- a/app/src/main/java/com/gh/gamecenter/discovery/DiscoveryAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/discovery/DiscoveryAdapter.kt @@ -118,7 +118,7 @@ class DiscoveryAdapter( is DiscoveryGameViewHolder -> { val itemData = mEntityList[position] val gameEntity = itemData.gameEntity!! - DownloadItemUtils.updateItem(mContext, gameEntity, holder, true, "star") + DownloadItemUtils.updateItem(mContext, gameEntity, holder, "star") holder.bindGameItem(gameEntity) val type = when (gameEntity.type) { "recommend" -> "专题推荐" @@ -318,8 +318,8 @@ class DiscoveryAdapter( gameDes.setTextColor(R.color.text_subtitleDesc.toColor(root.context)) gameIconView.displayGameIcon(gameEntity) + gameRating.textSize = if (gameEntity.commentCount > 3) 12F else 10F BindingAdapters.setGameName(gameName, gameEntity, false, null) - BindingAdapters.setTextSize(gameRating, if (gameEntity.commentCount > 3) 12 else 10) gameRating.setDrawableStart(if (gameEntity.commentCount > 3) R.drawable.game_horizontal_rating.toDrawable() else null) gameRating.text = if (gameEntity.commentCount > 3) { if (gameEntity.star == 10.0F) "10" else gameEntity.star.toString() diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java index ecb9e415e6..7a0a482fd2 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java @@ -8,7 +8,6 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.DefaultItemAnimator; @@ -20,7 +19,6 @@ import com.gh.gamecenter.common.base.fragment.BaseFragment; import com.gh.gamecenter.common.utils.DialogHelper; import com.gh.gamecenter.common.constant.EntranceConsts; import com.gh.gamecenter.common.utils.NetworkUtils; -import com.gh.common.util.PackageUtils; import com.gh.common.xapk.XapkInstaller; import com.gh.common.xapk.XapkUnzipStatus; import com.gh.download.DownloadManager; @@ -35,10 +33,8 @@ import com.gh.gamecenter.common.eventbus.EBMiPush; import com.gh.gamecenter.eventbus.EBPackage; import com.gh.gamecenter.eventbus.EBUISwitch; import com.gh.gamecenter.fragment.MainWrapperFragment; -import com.halo.assistant.HaloApp; import com.lightgame.download.DataWatcher; import com.lightgame.download.DownloadConfig; -import com.lightgame.download.DownloadDao; import com.lightgame.download.DownloadEntity; import com.lightgame.download.DownloadStatus; @@ -176,7 +172,7 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi // 静默更新任务,下载模拟器任务,畅玩游戏不需要添加 if (ExtensionsKt.isSilentUpdate(downloadEntity) || ExtensionsKt.isSimulatorDownload(downloadEntity) - || ExtensionsKt.isVGame(downloadEntity)) { + || ExtensionsKt.asVGame(downloadEntity)) { return; } diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java index 6f1451eedc..9d977ed764 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java @@ -183,7 +183,14 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { viewHolder.binding.dmItemTvSpeed.setText("加载完成"); // 重置点击事件避免复用问题 viewHolder.binding.dmItemTvSpeed.setOnClickListener(null); - viewHolder.binding.dmItemTvStartorpause.setText(R.string.install); + // 双下载里的本地下载,已安装且不为更新下载的情况下,把下载文案改成启动 + if (PackagesManager.isInstalled(downloadEntity.getPackageName()) + && !downloadEntity.isUpdate() + && ExtensionsKt.isLocalDownloadInDualDownloadMode(downloadEntity)) { + viewHolder.binding.dmItemTvStartorpause.setText(R.string.launch); + } else { + viewHolder.binding.dmItemTvStartorpause.setText(R.string.install); + } if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { // XAPK状态有几率在SUCCESS后返回UNZIPPING, 此处对UNZIPPING之前的状态做一个判断 diff --git a/app/src/main/java/com/gh/gamecenter/download/InstalledGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/InstalledGameViewModel.kt index d3478b00dc..76070878c6 100644 --- a/app/src/main/java/com/gh/gamecenter/download/InstalledGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/download/InstalledGameViewModel.kt @@ -15,6 +15,7 @@ import com.gh.gamecenter.core.utils.ThirdPartyPackageHelper.getGameId import com.gh.gamecenter.feature.entity.ApkEntity import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.feature.entity.GameInstall +import com.gh.gamecenter.manager.PackagesManager import com.gh.gamecenter.retrofit.RetrofitManager import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers @@ -36,7 +37,7 @@ class InstalledGameViewModel(application: Application) : AndroidViewModel(applic } for (gameInstall in list) { // 畅玩游戏不出现在常规的下载管理里 - if (gameInstall.isSmoothGame) continue + if (gameInstall.isVGame) continue val ghId = PackageUtils.getMetaData(getApplication(), gameInstall.packageName, "gh_id") if (ghId != null && ghId != gameInstall.id) { @@ -135,10 +136,7 @@ class InstalledGameViewModel(application: Application) : AndroidViewModel(applic newEntity.dropOtherApk() if (PackageUtils.isCanPluggable(apkEntity)) { val pluggableCollection = - GameUtils.getPluggableCollectionFromGameEntity( - entity, - packageName - ) + GameUtils.getPluggableCollectionFromGameEntity(entity, packageName) if (pluggableCollection != null) { newEntity.pluggableCollection = pluggableCollection } @@ -147,6 +145,16 @@ class InstalledGameViewModel(application: Application) : AndroidViewModel(applic } } } + + if (newEntity.getApk().size == 1 && (newEntity.isDualBtnModeEnabled() || newEntity.isVGamePreferred())) { + // 双下载按钮或畅玩优先的游戏,仅本地已安装才显示 + if (!PackagesManager.isInstalled(newEntity.getUniquePackageName())) { + continue + } + + newEntity.forceToBeDownloadModeOnly() + } + newGameList.add(newEntity) break } diff --git a/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragment.kt b/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragment.kt index 47f78b6ae3..c5c3ca44b0 100644 --- a/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragment.kt @@ -153,14 +153,10 @@ class NewInstalledGameFragment : ToolbarFragment() { reuseNoneData.reuseNoneDataDescTv.text = " 及时获悉游戏最新的更新消息" reuseNoneData.reuseResetLoadTv.text = "去开启" reuseNoneData.reuseResetLoadTv.setOnClickListener { - PermissionHelper.checkGetInstalledAppsListBeforeAction( - requireActivity(), - object : EmptyCallback { - override fun onCallback() { - updateNoDataView() - PackageRepository.initData() - } - }) + PermissionHelper.checkGetInstalledAppsListBeforeAction(requireActivity()) { + updateNoDataView() + PackageRepository.initData() + } } } else { reuseNoneData.reuseNoneDataIv.visibility = View.VISIBLE diff --git a/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt index a15cbae8fb..8b732fd46f 100644 --- a/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt @@ -101,7 +101,7 @@ class NewInstalledGameFragmentAdapter(context: Context, private var mViewModel: gameEntity.exposureEvent ) binding.downloadBtn.putWidgetBusinessName("下载管理") - DownloadItemUtils.updateItem(binding.root.context, gameEntity, GameViewHolder(binding), !gameEntity.isPluggable) + DownloadItemUtils.updateItem(binding.root.context, gameEntity, GameViewHolder(binding)) holder.itemView.setOnClickListener { DataCollectionUtils.uploadClick(binding.root.context, "列表", "我的光环-我的游戏", gameEntity.name) GameDetailActivity.startGameDetailActivity( diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt index 0de76fb56e..7c81ff29b0 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt @@ -315,7 +315,7 @@ class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) : downloadManager: DownloadManager ) { if (downloadEntity == null) { - if (PackagesManager.isCanUpdate(update.id, update.packageName)) { + if (PackagesManager.isCanUpdate(update.id, update.packageName, false)) { updateBtn.setText(R.string.update) updateBtn.buttonStyle = DownloadButton.ButtonStyle.NORMAL } else if (update.isPluggable) { @@ -358,9 +358,20 @@ class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) : } DownloadStatus.done -> { - updateBtn.setText(R.string.install) - updateBtn.buttonStyle = - if (update.isPluggable) DownloadButton.ButtonStyle.INSTALL_PLUGIN else DownloadButton.ButtonStyle.INSTALL_NORMAL + val downloadIsVersionMatched = downloadEntity.versionName == update.version + + if (downloadIsVersionMatched) { + updateBtn.setText(R.string.install) + updateBtn.buttonStyle = + if (update.isPluggable) { + DownloadButton.ButtonStyle.INSTALL_PLUGIN + } else { + DownloadButton.ButtonStyle.INSTALL_NORMAL + } + } else { + updateBtn.setText(R.string.update) + updateBtn.buttonStyle = DownloadButton.ButtonStyle.NORMAL + } } else -> { @@ -416,6 +427,14 @@ class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) : updateBtn.progress = 0 } + // 如果历史下载 downloadEntity 不为空,且版本与当前需要更新的不一致,先移除旧任务再执行更新 + if ((downloadEntity?.isVGameDownloadInDualDownloadMode() == true + || downloadEntity?.isLocalDownloadInDualDownloadMode() == true) + && (update.version != downloadEntity.versionName) + ) { + DownloadManager.getInstance().cancel(downloadEntity.url ?: "") + } + mViewModel.update(update, isSubscribe) mViewModel.refreshList() EventBus.getDefault() diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt index 3f5e27cfa8..1d67d8d5dc 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt @@ -75,12 +75,9 @@ class UpdatableGameViewModel( for (update in updatableList) { // 有闪退日志说这个 update 实体可能为空,实在看不原因 :( - if (update == null) continue + if (update == null || update.isVGameUpdate) continue // 筛选仅下载管理出现的插件化更新 - if (update.isShowPlugin(PluginLocation.only_index) - && update.downloadStatus != Constants.V_GAME - && update.downloadStatus != Constants.V_GAME_32 - ) { + if (update.isShowPlugin(PluginLocation.only_index)) { val platform = PlatformUtils.getInstance(getApplication()).getPlatformName(update.platform) if (!platform.isNullOrEmpty() && "官方版" != platform) { @@ -249,7 +246,7 @@ class UpdatableGameViewModel( // 或者匹配版本与已安装版本相同,但不是插件化没有其它可更新版本的不需要添加进列表中 if (matchedVersionUpdate == null || (matchedVersionUpdate.version == installedVersionName - && !PackagesManager.isCanUpdate(installedGhId as? String, packageName) + && !PackagesManager.isCanUpdate(installedGhId as? String, packageName, false) && !isUpdatePluggableRelated(matchedVersionUpdate) && mismatchedVersionUpdateList.isEmpty()) ) { @@ -302,7 +299,7 @@ class UpdatableGameViewModel( } packageUpdate.matchedVersionUpdate.version == currentlyUpdatableVersion - && !PackagesManager.isCanUpdate(installedGhId, matchedPackageName) + && !PackagesManager.isCanUpdate(installedGhId, matchedPackageName, false) && !isUpdatePluggableRelated(packageUpdate.matchedVersionUpdate) && !packageUpdate.matchedVersionUpdate.isLandPageAddressDialog() -> { invalidPackageUpdateList.add(packageUpdate) @@ -509,17 +506,14 @@ class UpdatableGameViewModel( val retrofit = RetrofitManager.getInstance().api if (ghId == null) { - retrofit.loadGameDataByPackageName( - UrlFilterUtils.getFilterQuery("package", packageName) - ) + retrofit.loadGameDataByPackageName(UrlFilterUtils.getFilterQuery("package", packageName)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Response?>() { override fun onResponse(response: List?) { response?.let { for (game in response) { - val simpleUpdatableList: List = - PackageUtils.getUpdateData(game) + val simpleUpdatableList: List = PackageUtils.getUpdateData(game, false) if (simpleUpdatableList.isNotEmpty()) { mRawUpdatableList.addAll(simpleUpdatableList) @@ -536,8 +530,7 @@ class UpdatableGameViewModel( .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Response() { override fun onResponse(response: GameEntity?) { - val simpleUpdatableList: List = - PackageUtils.getUpdateData(response) + val simpleUpdatableList: List = PackageUtils.getUpdateData(response, false) mRawUpdatableList.addAll(simpleUpdatableList) @@ -699,6 +692,7 @@ class UpdatableGameViewModel( "last_page_name", getLastPageEntity().pageName, "last_page_id", getLastPageEntity().pageId, "last_page_business_id", getLastPageEntity().pageBusinessId, + "download_type", "畅玩下载", ) } 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 40cb1972a2..20641467e6 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt @@ -48,7 +48,9 @@ data class GameUpdateEntity( var category: String? = "", var md5: String? = "", var downloadStatus: String? = "", - var landPageAddressDialog: GameEntity.AddressDialog? = null // 第三方跳转落地页跳转链接 + var landPageAddressDialog: GameEntity.AddressDialog? = null, // 第三方跳转落地页跳转链接 + + var isVGameUpdate: Boolean = false ) { val categoryChinese: String get() = when (category) { diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt index 6561330753..d2c5ae50a1 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt @@ -403,7 +403,7 @@ class HomeSearchToolWrapperFragment : HomeTabWrapperFragment() { mBinding?.run { mHomePush?.game?.run { mGameViewHolder?.let { - DownloadItemUtils.updateItem(requireContext(), this, it, true) + DownloadItemUtils.updateItem(requireContext(), this, it) } DownloadItemUtils.setOnClickListener( requireContext(), 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 dbec5865f8..1012c0a803 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt @@ -1246,7 +1246,6 @@ class GameFragmentAdapter( mContext, gameEntity, GameViewHolder(holder.binding), - !gameEntity.isPluggable, subjectData.briefStyle ) diff --git a/app/src/main/java/com/gh/gamecenter/game/GameViewModel.kt b/app/src/main/java/com/gh/gamecenter/game/GameViewModel.kt index 727476fbf2..dc9d33566b 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/game/GameViewModel.kt @@ -427,7 +427,7 @@ class GameViewModel(application: Application, override var blockData: SubjectRec } // 随机产生专题数据(换一换) - private fun initRandomGame(subjectId: String, sourceList: List?) { + private fun initRandomGame(subjectId: String, sourceList: MutableList?) { var rawList: MutableList? = null for (entity in mSubjectList) { diff --git a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalAdapter.kt index c18fb60250..ab6d314a7a 100644 --- a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalAdapter.kt @@ -164,7 +164,6 @@ class GameHorizontalAdapter( gameDownloadTips = holder.binding.simpleGameContainer.downloadTipsLottie multiVersionDownloadTv = holder.binding.simpleGameContainer.multiVersionDownloadTv }, - true ) } } diff --git a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt index 2ae637b016..2988ae3c70 100644 --- a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt @@ -113,7 +113,6 @@ class GameHorizontalSlideAdapter( gameDownloadTips = holder.binding.simpleGameContainer.downloadTipsLottie multiVersionDownloadTv = holder.binding.simpleGameContainer.multiVersionDownloadTv }, - true ) holder.binding.simpleGameContainer.downloadBtn.putWidgetBusinessName("横向专题列表") diff --git a/app/src/main/java/com/gh/gamecenter/game/vertical/GameVerticalAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/vertical/GameVerticalAdapter.kt index c382b0cbe0..6d3671ffed 100644 --- a/app/src/main/java/com/gh/gamecenter/game/vertical/GameVerticalAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/vertical/GameVerticalAdapter.kt @@ -233,7 +233,6 @@ class GameVerticalAdapter( context, gameEntity, tempViewHolder, - !gameEntity.isPluggable, subjectData?.briefStyle ) diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt index 7c45d3da00..a38988e454 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt @@ -574,8 +574,8 @@ open class GameCollectionDetailAdapter( recommendStarPref.setTextColor(R.color.text_subtitleDesc.toColor(mContext)) gameIconView.displayGameIcon(gameEntity) + gameRating.textSize = if (gameEntity.commentCount > 3) 12F else 10F BindingAdapters.setGameName(gameName, gameEntity, false, null) - BindingAdapters.setTextSize(gameRating, if (gameEntity.commentCount > 3) 12 else 10) BindingAdapters.setGameTags(labelList, gameEntity) gameRating.setDrawableStart( if (gameEntity.commentCount > 3) R.drawable.game_horizontal_rating.toDrawable(mContext) else null @@ -658,7 +658,6 @@ open class GameCollectionDetailAdapter( mContext, gameEntity, GameViewHolder(binding.gameItemIncluded), - true, isShowRecommendStar = true ) } 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 77030a00a0..5faaf654d8 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -12,6 +12,7 @@ import android.text.SpannableStringBuilder import android.text.Spanned import android.text.TextUtils import android.view.* +import android.view.ViewGroup.LayoutParams import android.view.animation.AccelerateDecelerateInterpolator import android.widget.* import androidx.appcompat.app.AppCompatActivity @@ -20,9 +21,9 @@ import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat import androidx.core.view.children import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams import androidx.core.widget.TextViewCompat import androidx.fragment.app.Fragment -import androidx.lifecycle.Observer import androidx.viewpager2.widget.ViewPager2 import com.ethanhua.skeleton.Skeleton import com.ethanhua.skeleton.ViewSkeletonScreen @@ -61,11 +62,11 @@ import com.gh.gamecenter.entity.* import com.gh.gamecenter.eventbus.* import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.feature.entity.PluginLocation -import com.gh.gamecenter.feature.entity.SimpleGame import com.gh.gamecenter.feature.entity.TagStyleEntity import com.gh.gamecenter.feature.eventbus.EBConcernChanged import com.gh.gamecenter.feature.exposure.ExposureEvent import com.gh.gamecenter.common.exposure.ExposureSource +import com.gh.gamecenter.feature.entity.SimpleGame import com.gh.gamecenter.feature.utils.ApkActiveUtils import com.gh.gamecenter.forum.detail.ForumDetailActivity import com.gh.gamecenter.gamedetail.cloudarchive.CloudArchiveFragment @@ -172,7 +173,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { if (mGameEntity?.getApk()?.size == 1) { if ("pause" != DownloadManager.getInstance().getStatus(downloadEntity.url)?.status) { mDownloadEntity = downloadEntity - DetailDownloadUtils.detailInvalidate(detailViewHolder) + DetailDownloadUtils.updateViewHolder(detailViewHolder) } if (downloadEntity.meta[XapkInstaller.XAPK_UNZIP_STATUS] == XapkUnzipStatus.FAILURE.name) { @@ -213,9 +214,9 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { } else if ((mGameEntity?.getApk()?.size ?: 0) > 1) { when (downloadEntity.status) { DownloadStatus.downloading -> { - if (detailViewHolder.mDownloadTips.visibility == View.GONE || !detailViewHolder.mDownloadTips.isAnimating) { - detailViewHolder.mDownloadTips.visibility = View.VISIBLE - detailViewHolder.mDownloadTips.setDownloadTipsAnimation(true) + if (detailViewHolder.downloadTips.visibility == View.GONE || !detailViewHolder.downloadTips.isAnimating) { + detailViewHolder.downloadTips.visibility = View.VISIBLE + detailViewHolder.downloadTips.setDownloadTipsAnimation(true) } } @@ -226,11 +227,11 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { DownloadStatus.subscribe, DownloadStatus.overflow, DownloadStatus.neterror -> { - detailViewHolder.mDownloadTips.visibility = View.VISIBLE - detailViewHolder.mDownloadTips.setDownloadTipsAnimation(false) + detailViewHolder.downloadTips.visibility = View.VISIBLE + detailViewHolder.downloadTips.setDownloadTipsAnimation(false) } - else -> detailViewHolder.mDownloadTips.visibility = View.GONE + else -> detailViewHolder.downloadTips.visibility = View.GONE } } } @@ -246,14 +247,14 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { private val detailViewHolder: DetailViewHolder get() = DetailViewHolder( - mCachedView, - mGameEntity, - mDownloadEntity, - false, - mEntrance, - "游戏详情", - mGameEntity!!.name, - mTraceEvent + view = mCachedView, + gameEntity = mGameEntity!!, + isNewsDetail = false, + entrance = mEntrance, + name = "游戏详情", + title = mGameEntity!!.name ?: "", + traceEvent = mTraceEvent, + isSupportDualButton = true ) private val contentCardClick: (contentCard: ContentCardEntity, position: Int) -> Unit = @@ -714,6 +715,8 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { insets.consumeSystemWindowInsets() } + updateDivider() + mBodyBinding.toolbar.setNavigationOnClickListener { requireActivity().finish() } } @@ -781,7 +784,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { updateGameDetailTopArea() val viewHolder = detailViewHolder - DetailDownloadUtils.detailInitDownload(viewHolder, true) + DetailDownloadUtils.updateViewHolder(viewHolder) mDestinationTab = getTabPositionFromTabType(arguments?.getString(EntranceConsts.KEY_TARGET, TAB_DESC) ?: TAB_DESC) @@ -792,7 +795,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { } if (mAutoDownload || mIsOpenPlatformWindow && mGameEntity!!.getApk().size > 1) { - viewHolder.mDownloadPb.performClick() + viewHolder.downloadPb.performClick() mAutoDownload = false } @@ -918,14 +921,14 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { } } - mUserViewModel.loginObsUserinfo.observe(this, Observer { + mUserViewModel.loginObsUserinfo.observe(this) { if (it != null && mGameEntity != null) { postDelayedRunnable({ controlReserveBtn() - DetailDownloadUtils.detailInitDownload(detailViewHolder, true) + DetailDownloadUtils.updateViewHolder(detailViewHolder) }, 100) } - }) + } } @SuppressLint("ClickableViewAccessibility") @@ -1689,7 +1692,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { if ("delete" == status.status && mGameEntity != null && mGameEntity!!.getApk().size == 1) { val url = mGameEntity!!.getApk()[0].url if (status.url == url) { - DetailDownloadUtils.detailInitDownload(detailViewHolder, false) + DetailDownloadUtils.updateViewHolder(detailViewHolder) } } } @@ -1701,7 +1704,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { for (apk in mGameEntity!!.getApk()) { if (busFour.packageName == apk.packageName) { ApkActiveUtils.filterHideApk(mGameEntity) - DetailDownloadUtils.detailInitDownload(detailViewHolder, true) + DetailDownloadUtils.updateViewHolder(detailViewHolder) } } } @@ -1770,35 +1773,19 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { ) } else { if ("download" == mGameEntity?.reserveStatus) { - ReservationHelper.showDeleteReservationDialog( - requireContext(), - object : EmptyCallback { - override fun onCallback() { - ReservationHelper.deleteReservation( - mGameEntity!!, - object : EmptyCallback { - override fun onCallback() { - DetailDownloadUtils.detailInitDownload(detailViewHolder, false) - showReserveBtn(isShowReserveBtn()) - } - }) - } - }) + ReservationHelper.showDeleteReservationDialog(requireContext()) { + ReservationHelper.deleteReservation(mGameEntity!!) { + DetailDownloadUtils.updateViewHolder(detailViewHolder) + showReserveBtn(isShowReserveBtn()) + } + } } else { - ReservationHelper.showCancelReservationDialog( - requireContext(), - object : EmptyCallback { - override fun onCallback() { - ReservationHelper.cancelReservation( - mGameEntity!!, - object : EmptyCallback { - override fun onCallback() { - DetailDownloadUtils.detailInitDownload(detailViewHolder, false) - showReserveBtn(isShowReserveBtn()) - } - }) - } - }) + ReservationHelper.showCancelReservationDialog(requireContext()) { + ReservationHelper.cancelReservation(mGameEntity!!) { + DetailDownloadUtils.updateViewHolder(detailViewHolder) + showReserveBtn(isShowReserveBtn()) + } + } } } } @@ -2143,7 +2130,13 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { private fun controlInstallHint() { if (mGameEntity != null) { - val status = GameUtils.getDownloadBtnText(requireContext(), mGameEntity, PluginLocation.only_game) + val status = GameUtils.getDownloadBtnText( + context = requireContext(), + gameEntity = mGameEntity!!, + isFromList = false, + fixedAsVGame = false, + pluginLocation = PluginLocation.only_game + ) val isLaunch = (status == getString(R.string.launch) || status == getString(R.string.open)) if (SPUtils.getBoolean( Constants.SP_SHOULD_SHOW_GAME_DETAIL_INSTALL_GUIDE, @@ -2327,7 +2320,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { resumeVideo() } if (mGameEntity != null && (mGameEntity!!.getApk().size == 1 || mGameEntity!!.isReservable)) { - DetailDownloadUtils.detailInitDownload(detailViewHolder, true) + DetailDownloadUtils.updateViewHolder(detailViewHolder) } showBrowserInstallHintIfNeeded() @@ -2370,7 +2363,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { private fun getCallback(): EmptyCallback { return EmptyCallback { LogUtils.logReservation(mGameEntity, mTraceEvent) - DetailDownloadUtils.detailInitDownload(detailViewHolder, false) + DetailDownloadUtils.updateViewHolder(detailViewHolder) if (mDownloadBinding.ivReserve.visibility == View.VISIBLE) { showReserveBtn(isShowReserveBtn()) } @@ -2399,6 +2392,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { private fun showVModeIconAtBottomBarIfNeeded(simpleGame: SimpleGame?, gameEntity: GameEntity) { mDownloadBinding.groupVmode.goneIf( simpleGame == null + || gameEntity.isDualBtnModeEnabled() || !VHelper.isVGameOn() || RegionSettingHelper.shouldThisGameBeFiltered(simpleGame.id) ) { @@ -2428,6 +2422,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { } } + override fun onSaveInstanceState(outState: Bundle) { mBodyBinding.gamedetailVp.let { outState.putInt(LAST_SELECTED_POSITION, it.currentItem) } super.onSaveInstanceState(outState) @@ -2440,10 +2435,14 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { updateGameDetailTopArea() controlReserveBtn() - detailViewHolder.mDownloadPb.buttonStyle = detailViewHolder.mDownloadPb.buttonStyle - if (detailViewHolder.mDownloadTips.visibility == View.VISIBLE) { - detailViewHolder.mDownloadTips.setDownloadTipsAnimation(detailViewHolder.mDownloadTips.isAnimating) + detailViewHolder.downloadPb.buttonStyle = detailViewHolder.downloadPb.buttonStyle + if (detailViewHolder.downloadTips.visibility == View.VISIBLE) { + detailViewHolder.downloadTips.setDownloadTipsAnimation(detailViewHolder.downloadTips.isAnimating) } + + // 更新分割线样式 + updateDivider() + mBodyBinding.collapsingToolbar.setContentScrimColor(R.color.background_white.toColor(requireContext())) mBodyBinding.gamedetailAppbar.setBackgroundColor(R.color.background_white.toColor(requireContext())) mBodyBinding.toolbarGapView.setBackgroundColor(R.color.background.toColor(requireContext())) @@ -2479,6 +2478,23 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { } } + // 更新分割线样式 + private fun updateDivider() { + if (mIsDarkModeOn) { + mDownloadBinding.divider.background = R.color.divider.toDrawable(requireContext()) + mDownloadBinding.divider.updateLayoutParams { + height = 1 + width = LayoutParams.MATCH_PARENT + } + } else { + mDownloadBinding.divider.background = R.drawable.shadow.toDrawable(requireContext()) + mDownloadBinding.divider.updateLayoutParams { + height = 7F.dip2px() + width = LayoutParams.MATCH_PARENT + } + } + } + override fun scrollToTop() { val fragment = mFragmentsList.safelyGetInRelease(mBodyBinding.gamedetailVp.currentItem) if (fragment is IScrollable && fragment.isAdded) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt index 797b72343d..b01d78babc 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt @@ -1014,8 +1014,11 @@ class DescAdapter( } contentHintIv.display(customColumn.title?.icon, true) - - BindingAdapters.textColorFromString(contentHintTv, customColumn.title?.color) + customColumn.title?.color?.let { + tryWithDefaultCatch { + contentHintTv.setTextColor(Color.parseColor(it)) + } + } contentHintTv.text = customColumn.title?.value expandTagsHint.goneIf(customColumn.showExpandTagsHint == false) diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt index ac0bd511c9..1a22b6ff64 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt @@ -26,8 +26,6 @@ import com.gh.gamecenter.common.utils.viewModelProvider import com.gh.gamecenter.common.utils.viewModelProviderFromParent import com.gh.gamecenter.common.view.OffsetLinearLayoutManager import com.gh.gamecenter.core.AppExecutor -import com.gh.gamecenter.core.provider.IFloatingWindowProvider -import com.gh.gamecenter.core.provider.IQGameProvider import com.gh.gamecenter.core.provider.ICsjAdProvider import com.gh.gamecenter.core.utils.MD5Utils import com.gh.gamecenter.core.utils.MtaHelper @@ -37,7 +35,6 @@ import com.gh.gamecenter.eventbus.EBDiscoverChanged import com.gh.gamecenter.eventbus.EBDownloadStatus import com.gh.gamecenter.eventbus.EBPackage import com.gh.gamecenter.eventbus.EBUISwitch -import com.gh.gamecenter.feature.entity.WelcomeDialogEntity import com.gh.gamecenter.fragment.* import com.gh.gamecenter.game.gallery.GameGallerySlideViewHolder import com.gh.gamecenter.home.slide.HomeSlideListAdapter @@ -97,7 +94,7 @@ class HomeFragment : LazyFragment() { mViewModel.loadStatus.observeNonNull(this, callback = { val loadStatus = it mBinding.run { - BindingAdapters.isRefreshing(gameRefresh, LoadStatus.LIST_LOADED) + gameRefresh.isRefreshing = false gameRefresh.goneIf(loadStatus == LoadStatus.INIT_FAILED) gameList.goneIf(loadStatus == LoadStatus.INIT_LOADING) reuseNoConnection.root.goneIf(loadStatus != LoadStatus.INIT_FAILED) @@ -136,9 +133,8 @@ class HomeFragment : LazyFragment() { R.color.theme ) ) - mBinding.run { - BindingAdapters.isRefreshing(gameRefresh, LoadStatus.LIST_LOADED) - } + mBinding.gameRefresh.isRefreshing = false + mAutomaticLayoutManager = OffsetLinearLayoutManager(requireContext()) mLayoutManager = mAutomaticLayoutManager mListAdapter = HomeFragmentAdapter( diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt b/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt index a8d0886ec4..1da3ca4897 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt @@ -508,7 +508,7 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) { } // 随机产生专题数据(换一换) - private fun initRandomGame(subjectId: String, sourceList: List?) { + private fun initRandomGame(subjectId: String, sourceList: MutableList?) { var rawList: MutableList? = null for (entity in mHomeContents) { if (entity.linkColumn?.id == subjectId) rawList = entity.linkColumn.data diff --git a/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt b/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt index 295d3b8a7c..6b12c08a1e 100644 --- a/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt +++ b/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt @@ -651,7 +651,6 @@ class LegacyHomeFragmentAdapterAssistant( mContext, gameEntity, GameViewHolder(holder.binding), - !gameEntity.isPluggable, subjectData.briefStyle ) diff --git a/app/src/main/java/com/gh/gamecenter/home/discovercard/DiscoverCardGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/discovercard/DiscoverCardGameAdapter.kt index cf87f91b77..9bf22bd093 100644 --- a/app/src/main/java/com/gh/gamecenter/home/discovercard/DiscoverCardGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/discovercard/DiscoverCardGameAdapter.kt @@ -64,7 +64,7 @@ class DiscoverCardGameAdapter( holder.itemView.layoutParams = ViewGroup.LayoutParams(screenWidth - 44F.dip2px(), 76F.dip2px()) holder.itemView.setPadding(14F.dip2px(), 0, 14F.dip2px(), 0) } - DownloadItemUtils.updateItem(mContext, gameEntity, holder, true, "star") + DownloadItemUtils.updateItem(mContext, gameEntity, holder, "star") holder.bindGameItem(gameEntity) holder.itemView.setBackgroundColor(R.color.transparent.toColor(mContext)) holder.itemView.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/home/skip/PackageSkipAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/skip/PackageSkipAdapter.kt index b177413f41..5f290b526a 100644 --- a/app/src/main/java/com/gh/gamecenter/home/skip/PackageSkipAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/skip/PackageSkipAdapter.kt @@ -97,7 +97,6 @@ class PackageSkipAdapter( mContext, gameEntity, GameViewHolder(holder.binding), - !gameEntity.isPluggable, subjectData?.briefStyle ) holder.itemView.setOnClickListener { 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 0bc194be98..1b2f427fdd 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/PackagesManager.kt +++ b/app/src/main/java/com/gh/gamecenter/manager/PackagesManager.kt @@ -134,11 +134,19 @@ object PackagesManager { * 判断包名是否可以更新 * * @param packageName 包名 + * @param asVGame 以畅玩游戏的形态来判断是否可以更新 * @return true 可以更新 false 不可以更新 */ - fun isCanUpdate(gameId: String?, packageName: String?): Boolean { + fun isCanUpdate(gameId: String?, + packageName: String?, + asVGame: Boolean = false + ): Boolean { for (entity in mUpdateAndPluginList) { - if (!entity.isPluggable && entity.packageName == packageName && entity.id == gameId) { + if (!entity.isPluggable + && entity.packageName == packageName + && entity.id == gameId + && entity.isVGameUpdate == asVGame + ) { return true } } diff --git a/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameAdapter.kt index c06451872a..c3293aafe6 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameAdapter.kt @@ -79,8 +79,8 @@ class MyFollowedGameAdapter(context: Context, var mViewModel: MyFollowedGameView cardContainer.background = R.drawable.bg_shape_space_radius_8.toDrawable(root.context) gameIconView.displayGameIcon(gameEntity) + gameRating.textSize = if (gameEntity.commentCount > 3) 12F else 10F BindingAdapters.setGameName(gameName, gameEntity, false, null) - BindingAdapters.setTextSize(gameRating, if (gameEntity.commentCount > 3) 12 else 10) BindingAdapters.setGameTags(labelList, gameEntity) gameRating.setDrawableStart(if (gameEntity.commentCount > 3) R.drawable.game_horizontal_rating.toDrawable() else null) gameRating.setPadding(0, 0, if (gameEntity.commentCount > 3) 8F.dip2px() else 0, 0) diff --git a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt index 3c450c4b79..ac4cc785c1 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt @@ -85,8 +85,8 @@ class MyReservationAdapter(context: Context, var mViewModel: MyReservationViewMo recommendStarPref.setTextColor(R.color.text_subtitleDesc.toColor(root.context)) gameIconView.displayGameIcon(gameEntity) + gameRating.textSize = if (gameEntity.commentCount > 3) 12F else 10F BindingAdapters.setGameName(gameName, gameEntity, false, null) - BindingAdapters.setTextSize(gameRating, if (gameEntity.commentCount > 3) 12 else 10) BindingAdapters.setGameTags(labelList, gameEntity) gameRating.setDrawableStart( if (gameEntity.commentCount > 3) R.drawable.game_horizontal_rating.toDrawable(mContext) else null diff --git a/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt index 05a3959a7f..e0ba19d9fe 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt @@ -117,8 +117,8 @@ open class PlayedGameAdapter( height = 28F.dip2px() } gameIconView.displayGameIcon(gameEntity) + gameRating.textSize = if (gameEntity.commentCount > 3) 12F else 10F BindingAdapters.setGameName(gameName, gameEntity, false, null) - BindingAdapters.setTextSize(gameRating, if (gameEntity.commentCount > 3) 12 else 10) BindingAdapters.setGameTags(labelList, gameEntity) gameRating.setDrawableStart(if (gameEntity.commentCount > 3) R.drawable.game_horizontal_rating.toDrawable() else null) gameRating.setPadding(0, 0, if (gameEntity.commentCount > 3) 8F.dip2px() else 0, 0) @@ -193,7 +193,6 @@ open class PlayedGameAdapter( mContext, gameEntity, GameViewHolder(holder.binding.gameItemIncluded), - true, true ) 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 bdcf7abe17..53368a6f02 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt @@ -188,13 +188,13 @@ object PackageRepository { * * @param filteredList 已安装的游戏包名集合 (仅已收录部分) * @param onWorkerThreadOnly 是否在工作线程执行 - * @param matchVGameOnly 是否仅匹配畅玩游戏 + * @param isVGame 包名列表是否为畅玩游戏 */ @SuppressLint("CheckResult") private fun loadInstalledGameDigestAndNotifyData( filteredList: ArrayList, onWorkerThreadOnly: Boolean = false, - matchVGameOnly: Boolean = false, + isVGame: Boolean = false, ) { var isNotifyUpdate = false val maxPageCount = (filteredList.size / PAGE_SIZE) + 1 @@ -228,18 +228,13 @@ object PackageRepository { } for (game in validGames) { - // 仅匹配畅玩游戏时,非畅玩游戏直接跳过 - if (matchVGameOnly && !game.isVGame()) { - continue - } - if (gh_id == null || gh_id == game.id) { gameInstalled.add( - GameInstall.transformGameInstall(game, pkgName) + GameInstall.transformGameInstall(game, pkgName, isVGame) ) mInstalledGameList.add(game) val isCanPluggable = checkGamePlugin(game, pkgName) - val isCanUpdate = checkGameUpdate(game) + val isCanUpdate = checkGameUpdate(game, isVGame) addCurrentlyInstalledVersionIfValid(game) if (!isNotifyUpdate && isCanUpdate || isCanPluggable) { isNotifyUpdate = true @@ -264,16 +259,16 @@ object PackageRepository { * @param game * @return 该请求是否存在可更新的游戏 */ - private fun checkGameUpdate(game: GameEntity): Boolean { - val updateList = PackageUtils.getUpdateData(game) + private fun checkGameUpdate(game: GameEntity, isVGame: Boolean): Boolean { + val updateList = PackageUtils.getUpdateData(game, isVGame) if (updateList.size > 0) { for (updateEntity in updateList) { addUpdateOrPluggable(updateEntity) } return true - } else if (game.isVGame()) { + } else if (isVGame) { // 畅玩游戏移除更新,避免死循环更新 - removeUpdate(game.id, false) + removeVGameUpdate(game.id, false) return true } @@ -365,7 +360,9 @@ object PackageRepository { private fun addUpdateOrPluggable(data: GameUpdateEntity) { var isExist = false for (entity in gameUpdate) { - if (entity.packageName == data.packageName && entity.id == data.id) { + if (entity.packageName == data.packageName + && entity.id == data.id + && entity.isVGameUpdate == data.isVGameUpdate) { isExist = true } } @@ -373,11 +370,11 @@ object PackageRepository { } /** - * 移除更新 + * 移除畅玩更新 * @param gameId 游戏 ID */ - fun removeUpdate(gameId: String, notifyUpdate: Boolean) { - gameUpdate.removeAll { it.id == gameId } + fun removeVGameUpdate(gameId: String, notifyUpdate: Boolean) { + gameUpdate.removeAll { it.id == gameId && it.isVGameUpdate } if (notifyUpdate) { notifyGameUpdateData() } @@ -402,25 +399,28 @@ object PackageRepository { * 批量新增已安装的游戏数量 * @param pkgNameList 数组列表 */ - fun addInstalledGames(pkgNameList: ArrayList, isVGameOnly: Boolean = false) { + fun addInstalledGames(pkgNameList: ArrayList, isVGame: Boolean = false) { // 畅玩游戏不添加至本地的已安装包名列表中 - if (!isVGameOnly) { + if (!isVGame) { mInstalledPkgList.addAll(pkgNameList) } notifyInstallPkgData() updateFilterPackage(pkgNameList) { - loadInstalledGameDigestAndNotifyData(pkgNameList, true, isVGameOnly) + loadInstalledGameDigestAndNotifyData(pkgNameList, true, isVGame) } } /** * 新增卸载游戏 * @param pkgName 已安装的游戏包名 + * @param isVGame 是否来自于畅玩游戏 */ - fun addUninstalledGame(pkgName: String) { + fun addUninstalledGame(pkgName: String, isVGame: Boolean) { // TODO 检查为什么会有两个相同的包名添加到 mInstalledPkgList 里 - mInstalledPkgList.removeAll { it == pkgName } + if (!isVGame) { + mInstalledPkgList.removeAll { it == pkgName } + } // 尝试从临时的当前版本列表里移除已卸载的条目 tryCatchInRelease { val iterator = currentVersionList.iterator() @@ -436,7 +436,9 @@ object PackageRepository { var j = 0 while (j < gameUpdate.size) { val game = gameUpdate[j] - if (game.packageName == pkgName) { + // 仅类型一致时移除更新实体 + if (game.packageName == pkgName + && game.isVGameUpdate == isVGame) { gameUpdate.remove(game) notifyGameUpdateData() } else { diff --git a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt index b560f4ed01..3ddc53b083 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt @@ -67,8 +67,8 @@ class PackageViewModel( * 卸载一个已安装的游戏 * 只在收到卸载广播时调用,不建议手动调用 */ - fun addUninstalledGame(pkgName: String?) { - if (!TextUtils.isEmpty(pkgName)) mRepository.addUninstalledGame(pkgName!!) + fun addUninstalledGame(pkgName: String?, isVGame: Boolean) { + if (!TextUtils.isEmpty(pkgName)) mRepository.addUninstalledGame(pkgName!!, isVGame) } /** diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserPlayedGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserPlayedGameAdapter.kt index 447fff1d11..cb1b83497a 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserPlayedGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserPlayedGameAdapter.kt @@ -128,7 +128,7 @@ class UserPlayedGameAdapter( "(${mEntrance})", StringUtils.buildString(mEntrance, ":", gameEntity.name) ) - DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), true, true) + DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), true) holder.itemView.setOnClickListener { GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id, "(${mEntrance})") diff --git a/app/src/main/java/com/gh/gamecenter/qgame/QGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/qgame/QGameViewModel.kt index ce34ca4119..49c1dfdb07 100644 --- a/app/src/main/java/com/gh/gamecenter/qgame/QGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qgame/QGameViewModel.kt @@ -118,7 +118,7 @@ class QGameViewModel(application: Application, blockData: SubjectRecommendEntity } // 随机产生专题数据(换一换) - private fun initRandomGame(subjectId: String, sourceList: List?) { + private fun initRandomGame(subjectId: String, sourceList: MutableList?) { var rawList: MutableList? = null for (entity in mSubjectList) { diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt index 2fa072c162..dcfcfa53b6 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt @@ -128,8 +128,8 @@ class SearchGameIndexAdapter( val binding = holder.binding binding.gameItemIncluded.run { gameIconView.displayGameIcon(gameEntity) + gameRating.textSize = if (gameEntity.commentCount > 3) 12F else 10F BindingAdapters.setGameName(gameName, gameEntity, false, null) - BindingAdapters.setTextSize(gameRating, if (gameEntity.commentCount > 3) 12 else 10) BindingAdapters.setGameTags(labelList, gameEntity) gameRating.setDrawableStart(if (gameEntity.commentCount > 3) R.drawable.game_horizontal_rating.toDrawable() else null) gameRating.setPadding(0, 0, if (gameEntity.commentCount > 3) 8F.dip2px() else 0, 0) diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultAdapter.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultAdapter.kt index aab583444f..623f4256f2 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultAdapter.kt @@ -227,8 +227,8 @@ class SearchGameResultAdapter( val gameEntity = mEntityList[holder.adapterPosition].game!! binding.gameItemIncluded.run { gameIconView.displayGameIcon(gameEntity) + gameRating.textSize = if (gameEntity.commentCount > 3) 12F else 10F BindingAdapters.setGameName(gameName, gameEntity, false, null) - BindingAdapters.setTextSize(gameRating, if (gameEntity.commentCount > 3) 12 else 10) BindingAdapters.setGameTags(labelList, gameEntity) gameRating.setDrawableStart(if (gameEntity.commentCount > 3) R.drawable.game_horizontal_rating.toDrawable() else null) gameRating.setPadding(0, 0, if (gameEntity.commentCount > 3) 8F.dip2px() else 0, 0) diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt index cec4cec90f..e4f0a00e58 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt @@ -128,7 +128,6 @@ class GameServersTestAdapter( mContext, gameEntity, GameViewHolder(viewHolder.binding), - true, gameEntity.briefStyle ) viewHolder.itemView.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt index 5a1a64f370..ced08a0df3 100644 --- a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt @@ -183,8 +183,8 @@ class SimulatorGameListAdapter( } gameItemIncluded.run { gameIconView.displayGameIcon(gameEntity) + gameRating.textSize = if (gameEntity.commentCount > 3) 12F else 10F BindingAdapters.setGameName(gameName, gameEntity, false, null) - BindingAdapters.setTextSize(gameRating, if (gameEntity.commentCount > 3) 12 else 10) BindingAdapters.setGameTags(labelList, gameEntity) gameRating.setDrawableStart(if (gameEntity.commentCount > 3) R.drawable.game_horizontal_rating.toDrawable() else null) gameRating.setPadding(0, 0, if (gameEntity.commentCount > 3) 8F.dip2px() else 0, 0) diff --git a/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.kt b/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.kt index 94c5330930..bb61346264 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.kt @@ -261,7 +261,6 @@ class SubjectAdapter( mContext, gameEntity, GameViewHolder(holder.binding), - true, subjectData.briefStyle ) } else if (holder is GameImageViewHolder) { diff --git a/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt b/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt index c80980e5d9..d63f4cc013 100644 --- a/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt +++ b/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt @@ -1,5 +1,6 @@ package com.gh.ndownload +import android.net.Uri import android.text.TextUtils import androidx.annotation.WorkerThread import com.gh.common.util.PackageInstaller @@ -345,10 +346,18 @@ object NDownloadBridge : InnerDownloadListener, IErrorRetryHandler { } fun download(downloadEntity: DownloadEntity) { + val originUrl = downloadEntity.url + // 双下载为畅玩时添加额外 query 规避实名 + val modifiedUrl = if (downloadEntity.isVGameDownloadInDualDownloadMode()) { + Uri.parse(originUrl).buildUpon().appendQueryParameter("smooth", "true").build().toString() + } else { + originUrl + } + val config = DownloadConfigBuilder() - .setUniqueId(downloadEntity.url) + .setUniqueId(originUrl) .setFileName("") - .setUrl(downloadEntity.url) + .setUrl(modifiedUrl) .setPathToStore(downloadEntity.path) .setHttpClient(NHttpClient()) .setDownloadThreadSize(DEFAULT_DOWNLOAD_THREAD_SIZE) diff --git a/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt b/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt index 76e4ab1d02..b625f71704 100644 --- a/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt +++ b/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt @@ -179,8 +179,15 @@ class VDownloadManagerAdapter( } } - val downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity) - ?: VHelper.getVDownloadEntitySnapshot(gameEntity.id, gameEntity.getUniquePackageName()) + val entityFromDownloadManager = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity) + val entityFromVGame = VHelper.getVDownloadEntitySnapshot(gameEntity.id, gameEntity.getUniquePackageName()) + + val downloadEntity = + if (entityFromDownloadManager != null && entityFromDownloadManager.status != DownloadStatus.cancel) { + entityFromDownloadManager + } else { + entityFromVGame + } updateDownloadBtnAndDes( mContext, @@ -512,8 +519,9 @@ class VDownloadManagerAdapter( } DownloadStatus.done -> { if (PackagesManager.isCanUpdate( - gameEntity.id, - gameEntity.getApk().firstOrNull()?.packageName + gameId = gameEntity.id, + packageName = gameEntity.getApk().firstOrNull()?.packageName, + asVGame = true ) ) { btnText = context.getString(R.string.update) diff --git a/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt b/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt index 252bcf59ed..cc4baa7c59 100644 --- a/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt +++ b/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt @@ -112,7 +112,9 @@ class VDownloadManagerViewModel(application: Application) : VHelper.uninstall(packageName ?: "") runOnUiThread { - val event = EBPackage("卸载", packageName ?: "", "unknown") + val event = EBPackage("卸载", packageName ?: "", "unknown").also { + it.isVGame = true + } EventBus.getDefault().post(event) PackageObserver.onPackageChanged(event) @@ -138,7 +140,9 @@ class VDownloadManagerViewModel(application: Application) : runOnUiThread { for (packageName in packageList) { - val event = EBPackage("卸载", packageName, "unknown") + val event = EBPackage("卸载", packageName, "unknown").also { + it.isVGame = true + } EventBus.getDefault().post(event) PackageObserver.onPackageChanged(event) } diff --git a/app/src/main/java/com/gh/vspace/VGameItemData.kt b/app/src/main/java/com/gh/vspace/VGameItemData.kt index 2883da9175..fd92d4f310 100644 --- a/app/src/main/java/com/gh/vspace/VGameItemData.kt +++ b/app/src/main/java/com/gh/vspace/VGameItemData.kt @@ -22,8 +22,9 @@ data class VGameItemData( } if (PackagesManager.isCanUpdate( - downloadEntity.gameId, - downloadEntity.packageName + gameId = downloadEntity.gameId, + packageName = downloadEntity.packageName, + asVGame = true ) ) { shouldShowUpdate = true @@ -52,7 +53,6 @@ data class VGameItemData( controlText = "" } - DownloadStatus.cancel, DownloadStatus.timeout, DownloadStatus.neterror, DownloadStatus.diskioerror, diff --git a/app/src/main/java/com/gh/vspace/VHelper.kt b/app/src/main/java/com/gh/vspace/VHelper.kt index aa322f898b..957a8d4d5d 100644 --- a/app/src/main/java/com/gh/vspace/VHelper.kt +++ b/app/src/main/java/com/gh/vspace/VHelper.kt @@ -81,7 +81,6 @@ object VHelper { const val LOG_TAG = "VSPACE" const val DEFAULT_VSPACE_PACKAGENAME = "com.lg.vspace" const val VSPACE_32BIT_PACKAGENAME = "$DEFAULT_VSPACE_PACKAGENAME.addon" - const val PLATFORM_V = "畅玩版" private val mDelegateManager by lazy { VirtualAppManager.get() } private val mPackageInstalledLiveData by lazy { MutableLiveData() } @@ -451,7 +450,8 @@ object VHelper { // 有可能 mInstalledInfoList 获取异常,导致判断为未安装,手动调用 AIDL 再查一次 if (!isInstalled && mIsServiceConnected - && mDelegateManager.isConnectAidlInterface) { + && mDelegateManager.isConnectAidlInterface + ) { try { isInstalled = mDelegateManager.checkGameInstalled(packageName) Utils.log(LOG_TAG, "手动调用 AIDL 获取安装情况 -> $isInstalled") @@ -500,121 +500,116 @@ object VHelper { * 在执行 callback 前先检查组件是否已安装,是否可下载 */ fun validateVSpaceBeforeAction(context: Context, gameEntity: GameEntity?, callback: () -> Unit) { - // 仅下载类型为畅玩的类型才执行判断 - if (gameEntity == null || gameEntity.isVGame()) { - if (showDialogIfVSpaceIsNeeded( - context, - gameEntity?.id ?: "", - gameEntity?.name ?: "", - gameEntity?.categoryChinese ?: "", - gameEntity?.gameBit ?: "" - ) - ) { - mBit = gameEntity?.gameBit ?: "" - mPendingDownloadCallback = callback - return + if (showDialogIfVSpaceIsNeeded( + context, + gameEntity?.id ?: "", + gameEntity?.name ?: "", + gameEntity?.categoryChinese ?: "", + gameEntity?.gameBit ?: "" + ) + ) { + mBit = gameEntity?.gameBit ?: "" + mPendingDownloadCallback = callback + return + } + + val vaConfig64 = Config.getVSettingEntity()?.va?.arch64 + val vaConfig32 = Config.getVSettingEntity()?.va?.arch32 + val installed64SpaceVersionCode = PackageUtils.getVersionCodeByPackageName(vaConfig64?.packageName) + val installed32SpaceVersionCode = PackageUtils.getVersionCodeByPackageName(vaConfig32?.packageName) + + // 检查更新 + val contains64Update = shouldShowVSpaceUpdate(m64UpdateEntity, installed64SpaceVersionCode) + val contains32Update = if (gameEntity?.gameBit == "32") shouldShowVSpaceUpdate( + m32UpdateEntity, + installed32SpaceVersionCode + ) else false + + var containsRelated64Update = false + + if (contains32Update) { + // 检查关联64位是否需要更新 + if (m32UpdateEntity?.relation != null) { + containsRelated64Update = + shouldShowVSpaceUpdate(m32UpdateEntity?.relation, installed64SpaceVersionCode, true) } + } - val vaConfig64 = Config.getVSettingEntity()?.va?.arch64 - val vaConfig32 = Config.getVSettingEntity()?.va?.arch32 - val installed64SpaceVersionCode = PackageUtils.getVersionCodeByPackageName(vaConfig64?.packageName) - val installed32SpaceVersionCode = PackageUtils.getVersionCodeByPackageName(vaConfig32?.packageName) - - // 检查更新 - val contains64Update = shouldShowVSpaceUpdate(m64UpdateEntity, installed64SpaceVersionCode) - val contains32Update = if (gameEntity?.gameBit == "32") shouldShowVSpaceUpdate( - m32UpdateEntity, - installed32SpaceVersionCode - ) else false - - var containsRelated64Update = false - - if (contains32Update) { - // 检查关联64位是否需要更新 - if (m32UpdateEntity?.relation != null) { - containsRelated64Update = - shouldShowVSpaceUpdate(m32UpdateEntity?.relation, installed64SpaceVersionCode, true) - } - } - - if (contains32Update || contains64Update) { - val gameBit = gameEntity?.gameBit - val updateEntity = if (gameBit == "32" && contains32Update) m32UpdateEntity else m64UpdateEntity - val dialogType = if (updateEntity!!.isAlertEveryTime()) "强制更新" else "提示更新" - NewFlatLogUtils.logHaloFunUpdateDialogShow( - gameEntity?.id ?: "", - gameEntity?.name ?: "", - if (gameBit == "32") "32位" else "64位" - ) - SPUtils.setString( - if (updateEntity.category == "32-bit") KEY_LAST_ALERT_32_UPDATE_URL else KEY_LAST_ALERT_64_UPDATE_URL, - updateEntity.url + updateEntity.alert - ) - DialogHelper.showDialog( - context = context, - title = "服务工具更新提示", - content = updateEntity.content.toString(), - cancelText = "立即更新", - confirmText = "继续游戏", - cancelClickCallback = { - val appEntity64 = - if (gameBit == "32" && contains32Update && m32UpdateEntity?.relation != null) { - // 32位游戏且包含32位更新和32位关联64位更新 - // 存在64位单独更新时对比32位关联的64位更新与64位单独更新推送的版本号 - if (contains64Update && (m64UpdateEntity?.versionCode - ?: 0) > (m32UpdateEntity?.relation?.versionCode ?: 0) - ) { - // 64位单独更新版本号更高时使用64位单独更新 - m64UpdateEntity - } else if (containsRelated64Update) { - // 不存在64位单独更新或32位关联64位更新版本号更高 - // 对比已安装版本号和32位关联的64位更新版本号,32位关联的64位更新版本号更高时使用32位关联的64位更新 - m32UpdateEntity?.relation - } else { - null - } - } else if ((gameBit != "32" && contains64Update) || (gameBit == "32" && contains64Update && !contains32Update)) { - // 64位游戏且包含64位单独更新 / 32位游戏无32位更新且包含64位更新 + if (contains32Update || contains64Update) { + val gameBit = gameEntity?.gameBit + val updateEntity = if (gameBit == "32" && contains32Update) m32UpdateEntity else m64UpdateEntity + val dialogType = if (updateEntity!!.isAlertEveryTime()) "强制更新" else "提示更新" + NewFlatLogUtils.logHaloFunUpdateDialogShow( + gameEntity?.id ?: "", + gameEntity?.name ?: "", + if (gameBit == "32") "32位" else "64位" + ) + SPUtils.setString( + if (updateEntity.category == "32-bit") KEY_LAST_ALERT_32_UPDATE_URL else KEY_LAST_ALERT_64_UPDATE_URL, + updateEntity.url + updateEntity.alert + ) + DialogHelper.showDialog( + context = context, + title = "服务工具更新提示", + content = updateEntity.content.toString(), + cancelText = "立即更新", + confirmText = "继续游戏", + cancelClickCallback = { + val appEntity64 = + if (gameBit == "32" && contains32Update && m32UpdateEntity?.relation != null) { + // 32位游戏且包含32位更新和32位关联64位更新 + // 存在64位单独更新时对比32位关联的64位更新与64位单独更新推送的版本号 + if (contains64Update && (m64UpdateEntity?.versionCode + ?: 0) > (m32UpdateEntity?.relation?.versionCode ?: 0) + ) { + // 64位单独更新版本号更高时使用64位单独更新 m64UpdateEntity + } else if (containsRelated64Update) { + // 不存在64位单独更新或32位关联64位更新版本号更高 + // 对比已安装版本号和32位关联的64位更新版本号,32位关联的64位更新版本号更高时使用32位关联的64位更新 + m32UpdateEntity?.relation } else { null } - val appEntity32 = if (contains32Update) updateEntity else null - NewFlatLogUtils.logHaloFunUpdateDialogClick( - dialogType, - "立即更新", - if (appEntity64 != null && appEntity32 != null) "32位&64位" else if (appEntity64 != null) "64位" else "32位" - ) - VSpaceDialogFragment.showDownloadDialog( - context, - appEntity64, - appEntity32, - gameEntity, - autoDownload = true, - isUpdate = true - ) - }, - confirmClickCallback = { - NewFlatLogUtils.logHaloFunUpdateDialogClick(dialogType, "继续游戏", "") - callback.invoke() - }, - extraConfig = DialogHelper.Config(centerTitle = true), - uiModificationCallback = { - if (updateEntity.isAlertEveryTime()) { - it.confirmTv.visibility = View.GONE - it.cancelTv.setTextColor(R.color.theme_font.toColor(context)) + } else if ((gameBit != "32" && contains64Update) || (gameBit == "32" && contains64Update && !contains32Update)) { + // 64位游戏且包含64位单独更新 / 32位游戏无32位更新且包含64位更新 + m64UpdateEntity + } else { + null } - - it.confirmTv.setTextColor(R.color.text_subtitle.toColor(context)) + val appEntity32 = if (contains32Update) updateEntity else null + NewFlatLogUtils.logHaloFunUpdateDialogClick( + dialogType, + "立即更新", + if (appEntity64 != null && appEntity32 != null) "32位&64位" else if (appEntity64 != null) "64位" else "32位" + ) + VSpaceDialogFragment.showDownloadDialog( + context, + appEntity64, + appEntity32, + gameEntity, + autoDownload = true, + isUpdate = true + ) + }, + confirmClickCallback = { + NewFlatLogUtils.logHaloFunUpdateDialogClick(dialogType, "继续游戏", "") + callback.invoke() + }, + extraConfig = DialogHelper.Config(centerTitle = true), + uiModificationCallback = { + if (updateEntity.isAlertEveryTime()) { + it.confirmTv.visibility = View.GONE + it.cancelTv.setTextColor(R.color.theme_font.toColor(context)) } - ) - return - } - callback.invoke() - } else { - callback.invoke() + it.confirmTv.setTextColor(R.color.text_subtitle.toColor(context)) + } + ) + return } + + callback.invoke() } /** @@ -914,12 +909,13 @@ object VHelper { * 根据 gameId 找不到的时候,回落到用 packageName 在 DownloadManager 里再找匹配的且是畅玩的 */ private fun getVDownloadEntity(gameId: String, packageName: String): DownloadEntity? { - var matchedEntity = DownloadManager.getInstance().getDownloadEntitySnapshot("", gameId, true) + var matchedEntity = DownloadManager.getInstance().getDownloadEntitySnapshot("", gameId) ?: getVDownloadEntitySnapshot(gameId = gameId, packageName = packageName) if (matchedEntity == null) { - val packageNameMatchedEntity = DownloadManager.getInstance().getDownloadEntitySnapshotByPackageName(packageName) - if (packageNameMatchedEntity?.isVGame() == true) { + val packageNameMatchedEntity = + DownloadManager.getInstance().getDownloadEntitySnapshotByPackageName(packageName) + if (packageNameMatchedEntity?.asVGame() == true) { matchedEntity = packageNameMatchedEntity } } @@ -956,9 +952,11 @@ object VHelper { } } - fun installOrLaunch(context: Context, - downloadEntity: DownloadEntity, - location: String? = null) { + fun installOrLaunch( + context: Context, + downloadEntity: DownloadEntity, + location: String? = null + ) { Utils.log(LOG_TAG, "检测是需要安装还是启动 ${downloadEntity.gameId}") if (downloadEntity.name.isNullOrEmpty()) { @@ -983,9 +981,11 @@ object VHelper { } @JvmStatic - fun installOrLaunch(context: Context, - gameEntity: GameEntity, - location: String? = null) { + fun installOrLaunch( + context: Context, + gameEntity: GameEntity, + location: String? = null + ) { Utils.log(LOG_TAG, "检测是需要安装还是启动 ${gameEntity.id}") installOrLaunch( @@ -1056,10 +1056,12 @@ object VHelper { * @param ignoreGApps 忽略谷歌框架 */ @JvmStatic - fun launch(context: Context, - packageName: String, - ignoreGApps: Boolean = false, - showLoading: Boolean = true) { + fun launch( + context: Context, + packageName: String, + ignoreGApps: Boolean = false, + showLoading: Boolean = true + ) { Utils.log(LOG_TAG, "尝试打开应用 $packageName") // 置空下载挂起回调(能 launch 游戏说明畅玩组件已安装) @@ -1126,10 +1128,12 @@ object VHelper { /** * 记录启动事件 */ - private fun logLaunch(gameId: String, - gameName: String, - gameCategory: String, - packageName: String) { + private fun logLaunch( + gameId: String, + gameName: String, + gameCategory: String, + packageName: String + ) { val downloadEntity = getVDownloadEntity(gameId = "", packageName = packageName) @@ -1151,11 +1155,13 @@ object VHelper { /** * 记录启动按钮被点击 () */ - fun logLaunchButtonClicked(packageName: String, - gameId: String? = null, - gameName: String? = null, - gameCategory: String? = null, - location: String) { + fun logLaunchButtonClicked( + packageName: String, + gameId: String? = null, + gameName: String? = null, + gameCategory: String? = null, + location: String + ) { val downloadEntity = getVDownloadEntity(gameId = "", packageName = packageName) // boundedObject 里找不到游戏类型时,尝试从已安装列表中获取 @@ -1412,7 +1418,7 @@ object VHelper { Utils.log(LOG_TAG, "更新应用${originDownloadEntity.packageName}") if (updateEntity != null) { - originDownloadEntity.url = getVUrl(updateEntity.url) + originDownloadEntity.url = updateEntity.url originDownloadEntity.gameId = updateEntity.id originDownloadEntity.name = updateEntity.name originDownloadEntity.eTag = updateEntity.etag @@ -1443,7 +1449,7 @@ object VHelper { ) } - PackageRepository.removeUpdate(updateEntity.id, true) + PackageRepository.removeVGameUpdate(updateEntity.id, true) } originDownloadEntity.progress = 0 @@ -1464,9 +1470,10 @@ object VHelper { ) originDownloadEntity.exposureTrace = GsonUtils.toJson(event) + originDownloadEntity.setVGameDownloadModeInDualDownloadMode() HistoryHelper.insertGameEntity(gameEntity) - DownloadManager.getInstance().add(originDownloadEntity) + DownloadManager.getInstance().add(originDownloadEntity, true) // 收集下载数据 DataCollectionUtils.uploadDownload(HaloApp.getInstance(), originDownloadEntity, "开始") @@ -1600,23 +1607,10 @@ object VHelper { VBackupHelper.recoverValidData(HaloApp.getInstance()) } - /** - * 获取畅玩游戏的下载地址(为了区分测试时与普通游戏一样的下载地址) - */ - fun getVUrl(originUrl: String?): String { - if (originUrl?.endsWith("type=v") == false) { - return if (originUrl.contains("?")) { - "$originUrl&type=v" - } else { - "$originUrl?type=v" - } - } - return originUrl ?: "" - } - /** * 获取未经畅玩处理的原始下载地址 */ + @Deprecated("不再使用这个后缀来区分游戏,保留只是为了兼容旧数据") fun getOriginalUrl(vUrl: String?): String { if (vUrl?.endsWith("type=v") == true) { return vUrl.removeSuffix("&type=v").removeSuffix("?type=v") diff --git a/app/src/main/java/com/halo/assistant/fragment/game/GamePluginAdapter.java b/app/src/main/java/com/halo/assistant/fragment/game/GamePluginAdapter.java index 7188be2e35..d049d16926 100644 --- a/app/src/main/java/com/halo/assistant/fragment/game/GamePluginAdapter.java +++ b/app/src/main/java/com/halo/assistant/fragment/game/GamePluginAdapter.java @@ -108,8 +108,8 @@ public class GamePluginAdapter extends BaseRecyclerAdapter { holder.initServerType(gameEntity); GamePluggableItemBinding binding = holder.getBinding(); binding.gameItemIncluded.gameIconView.displayGameIcon(gameEntity); + binding.gameItemIncluded.gameRating.setTextSize(gameEntity.getCommentCount() > 3 ? 12 : 10); BindingAdapters.setGameName(binding.gameItemIncluded.gameName, gameEntity, true, null); - BindingAdapters.setTextSize(binding.gameItemIncluded.gameRating, gameEntity.getCommentCount() > 3 ? 12 : 10); BindingAdapters.setGameTags(binding.gameItemIncluded.labelList, gameEntity); ExtensionsKt.setDrawableStart(binding.gameItemIncluded.gameRating, gameEntity.getCommentCount() > 3 ? ExtensionsKt.toDrawable(R.drawable.game_horizontal_rating) : null, null, null); binding.gameItemIncluded.gameRating.setPadding(0, 0, gameEntity.getCommentCount() > 3 ? DisplayUtils.dip2px(8) : 0, 0); @@ -132,7 +132,7 @@ public class GamePluginAdapter extends BaseRecyclerAdapter { StringUtils.buildString("(游戏-专题:", "插件化", "-列表[", String.valueOf(1), "])"), StringUtils.buildString("游戏-专题-", "插件化", ":", gameEntity.getName()), gameEntity.getExposureEvent(), () -> MtaHelper.onEvent("首页_新", "点击", "插件化" + (position + 1) + "_" + gameEntity.getName() + "_" + binding.gameItemIncluded.downloadBtn.getText().toString())); - DownloadItemUtils.updateItem(mContext, gameEntity, new GameViewHolder(holder.getBinding().gameItemIncluded), !gameEntity.isPluggable(), PluginLocation.only_index, false, null); + DownloadItemUtils.updateItem(mContext, gameEntity, new GameViewHolder(holder.getBinding().gameItemIncluded), PluginLocation.only_index, false, null); holder.getBinding().neverRemind.setOnClickListener(v -> DialogUtils.showPluggableNeverRemindDialog(mContext, String.format("%s - %s", diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_data_up.png b/app/src/main/res/drawable-xxhdpi/ic_video_data_up.png deleted file mode 100644 index 7f774e10a7..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_video_data_up.png and /dev/null differ diff --git a/app/src/main/res/drawable/textview_server_tag.xml b/app/src/main/res/drawable/button_round_primary_light_al.xml similarity index 58% rename from app/src/main/res/drawable/textview_server_tag.xml rename to app/src/main/res/drawable/button_round_primary_light_al.xml index 684afb532e..253e76c396 100644 --- a/app/src/main/res/drawable/textview_server_tag.xml +++ b/app/src/main/res/drawable/button_round_primary_light_al.xml @@ -2,8 +2,8 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/game_item_btn_pause_style.xml b/app/src/main/res/drawable/game_item_btn_pause_style.xml deleted file mode 100644 index 0661a646a9..0000000000 --- a/app/src/main/res/drawable/game_item_btn_pause_style.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/detail_download_item.xml b/app/src/main/res/layout/detail_download_item.xml index 657de16bae..cd1180afe0 100644 --- a/app/src/main/res/layout/detail_download_item.xml +++ b/app/src/main/res/layout/detail_download_item.xml @@ -17,6 +17,7 @@ android:layout_height="wrap_content"> @@ -182,8 +183,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - tools:visibility="visible" - app:constraint_referenced_ids="iv_vmode,tv_vmode,iv_vmode_badge" /> + app:constraint_referenced_ids="iv_vmode,tv_vmode,iv_vmode_badge" + tools:visibility="visible" /> + + + + + + + + + + app:layout_constraintStart_toEndOf="@+id/localDownloadContainer" + app:layout_constraintTop_toTopOf="parent" + app:layout_goneMarginStart="24dp" /> + app:lottie_repeatMode="restart" /> + app:layout_constraintTop_toTopOf="@id/detail_progressbar" + tools:text="开始畅玩" /> - - - - - - - - - diff --git a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java index dd1aef11a8..8443077bc5 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java @@ -74,10 +74,14 @@ public class Constants { public static final String EXTRA_DOWNLOAD_TYPE = "extra_download_type"; public static final String SILENT_UPDATE = "静默更新"; + public static final String SILENT_DOWNLOAD = "silent_download"; // 静默下载(不需要显示在下载管理里) public static final String SIMULATOR_DOWNLOAD = "下载模拟器"; public static final String SIMULATOR_GAME = "simulator_game"; public static final String SIMULATOR = "simulator"; - public static final String SMOOTH_GAME = "smooth_game"; // 畅玩类型的游戏 + public static final String VGAME = "smooth_game"; // 畅玩类型的游戏 + + public static final String DUAL_DOWNLOAD_VGAME = "dual_download_vgame"; // 双下载模式,触发的时候是畅玩 + public static final String DUAL_DOWNLOAD_LOCAL = "dual_download_local"; // 双下载模式,触发的时候是普通游戏 public static final String VSPACE_32_DOWNLOAD_ONLY = "vspace_32_download_only"; // 仅下载32位畅玩助手,不跳转安装 public static final String GAME_NAME = "game_name"; public static final String GAME_CATEGORY = "game_category"; // 游戏类型 diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt index cce97bb952..b193cdac32 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt @@ -1061,8 +1061,37 @@ fun DownloadEntity.isSimulatorGame(): Boolean { return getMetaExtra(Constants.SIMULATOR_GAME).isNotEmpty() } -fun DownloadEntity.isVGame(): Boolean { - return Constants.SMOOTH_GAME == getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) +fun DownloadEntity.asVGame(): Boolean { + return Constants.VGAME == getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) + || Constants.DUAL_DOWNLOAD_VGAME == getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) +} + +/** + * 下载时触发的是双下载模式里的畅玩下载 + */ +fun DownloadEntity.isVGameDownloadInDualDownloadMode(): Boolean { + return Constants.DUAL_DOWNLOAD_VGAME == getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) +} + +/** + * 下载时触发的是双下载模式里的普通下载 + */ +fun DownloadEntity.isLocalDownloadInDualDownloadMode(): Boolean { + return Constants.DUAL_DOWNLOAD_LOCAL == getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) +} + +/** + * 设置触发时的下载模式为双下载模式里的普通下载 + */ +fun DownloadEntity.setLocalDownloadModeInDualDownloadMode() { + addMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE, Constants.DUAL_DOWNLOAD_LOCAL) +} + +/** + * 设置触发时的下载模式为双下载模式里的畅玩下载 + */ +fun DownloadEntity.setVGameDownloadModeInDualDownloadMode() { + addMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE, Constants.DUAL_DOWNLOAD_VGAME) } /** diff --git a/module_common/src/main/res/drawable-night/download_button_normal_style.xml b/module_common/src/main/res/drawable-night/download_button_normal_style.xml new file mode 100644 index 0000000000..4f6c3fcd06 --- /dev/null +++ b/module_common/src/main/res/drawable-night/download_button_normal_style.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/module_common/src/main/res/drawable/download_button_normal_style.xml b/module_common/src/main/res/drawable/download_button_normal_style.xml index f2c5af7f75..4f6c3fcd06 100644 --- a/module_common/src/main/res/drawable/download_button_normal_style.xml +++ b/module_common/src/main/res/drawable/download_button_normal_style.xml @@ -4,7 +4,7 @@ + android:startColor="@color/btn_download_gradient_start" /> diff --git a/module_common/src/main/res/values-night/colors.xml b/module_common/src/main/res/values-night/colors.xml index 7f9df9f8d0..522d20e635 100644 --- a/module_common/src/main/res/values-night/colors.xml +++ b/module_common/src/main/res/values-night/colors.xml @@ -88,6 +88,10 @@ #A7A8B2 #141383EB #0AFFFFFF + + @color/theme_alpha_8 + + #44AEEB #05C400 diff --git a/module_common/src/main/res/values/colors.xml b/module_common/src/main/res/values/colors.xml index 1416cb76a6..95a10bed8b 100644 --- a/module_common/src/main/res/values/colors.xml +++ b/module_common/src/main/res/values/colors.xml @@ -98,6 +98,10 @@ #A7A8B2 #EDF5FC #F5F5F5 + + @color/theme_alpha_10 + + @color/text_4BC7FF #05C400 diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/IVHelperProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/IVHelperProvider.kt index bcea158148..b6be1b3b41 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/IVHelperProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/IVHelperProvider.kt @@ -3,9 +3,5 @@ package com.gh.gamecenter.core.provider import com.alibaba.android.arouter.facade.template.IProvider interface IVHelperProvider : IProvider { - fun getPlatformV(): String - - fun getVUrl(originUrl: String?): String - - fun isVGameOn():Boolean + fun isVGameOn(): Boolean } \ No newline at end of file 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 cd15cbe06c..1bfa1ca558 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 @@ -114,6 +114,13 @@ data class GameEntity( @SerializedName("download_status") var downloadStatus: String? = "", + // 额外的下载方式,用于双下载类型时使用。可能的值为 "off/on/smooth/smooth_32",分别为关闭/畅玩64位/畅玩32位 + @SerializedName("download_extra_status") + private var mDownloadStatusExtra: String = "", + // 优先的下载方式,用于双下载类型时使用。可能的值为 "smooth/local",分别为 畅玩下载/普通下载 + @SerializedName("download_default") + private var mDefaultDownloadType: String = "", + var kaifuTimeHint: Long? = null, var subjectData: GameSubjectData? = null, @@ -406,6 +413,9 @@ data class GameEntity( @IgnoredOnParcel private var mIsVGame: Boolean = false + @IgnoredOnParcel + private var mGameDownloadButtonMode: Int = GAME_DOWNLOAD_BUTTON_MODE_UNKNOWN // 游戏下载按钮模式 (仅下载、仅畅玩、双下载) + @IgnoredOnParcel var name: String? get() = if (shouldUseMirrorInfo()) { @@ -651,15 +661,6 @@ data class GameEntity( rawApk = apkSearch!! } - if (isVGame()) { - val vHelperProvider = - ARouter.getInstance().build(RouteConsts.provider.vhelper).navigation() as? IVHelperProvider - rawApk.forEach { - it.setPlatform(vHelperProvider?.getPlatformV() ?: "") - it.url = vHelperProvider?.getVUrl(it.url) - } - } - mValidApkList = rawApk mLastMirrorUpdatedTime = System.currentTimeMillis() @@ -809,17 +810,97 @@ data class GameEntity( return provider?.getMirrorPosition(id) ?: -1 } + /** + * 获取游戏下载按钮模式,包括单按钮显示、双按钮显示等模式 + * + * 根据 download_status 和 download_extra_status 字段来确认模式 + * download_status download_extra_status 下载按钮 + * on off 本地 + * on smooth/smooth_32 本地 + 畅玩 + * smooth/smooth_32 on 本地 + 畅玩 + * smooth/smooth_32 off 畅玩 + * off/demo/link/appointment 本地 + * + * GAME_DOWNLOAD_BUTTON_TYPE_DOWNLOAD 仅本地 + * GAME_DOWNLOAD_BUTTON_TYPE_VGAME 仅畅玩 + * GAME_DOWNLOAD_BUTTON_TYPE_DUAL 本地 + 畅玩 + */ + fun getGameDownloadButtonMode(): Int { + if (mGameDownloadButtonMode == GAME_DOWNLOAD_BUTTON_MODE_UNKNOWN) { + val vHelperProvider = + ARouter.getInstance().build(RouteConsts.provider.vhelper).navigation() as? IVHelperProvider + mGameDownloadButtonMode = when { + vHelperProvider?.isVGameOn() == false + || downloadStatus == "off" + || downloadStatus == "demo" + || downloadStatus == "link" + || downloadStatus == "appointment" -> { + GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD + } + + downloadStatus == "on" && mDownloadStatusExtra.contains("smooth") -> { + GAME_DOWNLOAD_BUTTON_MODE_DUAL + } + + downloadStatus?.contains("smooth") == true && mDownloadStatusExtra == "on" -> { + GAME_DOWNLOAD_BUTTON_MODE_DUAL + } + + downloadStatus?.contains("smooth") == true + && (mDownloadStatusExtra == "off" || mDownloadStatusExtra == "") -> { + GAME_DOWNLOAD_BUTTON_MODE_VGAME + } + + else -> GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD + } + } + + return mGameDownloadButtonMode + } + + /** + * 畅玩是否优先级更高 + */ + fun isVGamePreferred(): Boolean { + return when (getGameDownloadButtonMode()) { + GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD -> false + GAME_DOWNLOAD_BUTTON_MODE_VGAME -> true + GAME_DOWNLOAD_BUTTON_MODE_DUAL -> mDefaultDownloadType.contains(Constants.V_GAME) + + else -> false + } + } + + /** + * 双下载按钮模式是否启用 + */ + fun isDualBtnModeEnabled(): Boolean { + return getGameDownloadButtonMode() == GAME_DOWNLOAD_BUTTON_MODE_DUAL + } + + /** + * 强制变成单下载按钮模式,且为本地下载 (谨慎使用!) + */ + fun forceToBeDownloadModeOnly() { + mGameDownloadButtonMode = GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD + downloadStatus = "on" + mDownloadStatusExtra = "off" + } + /** * 是否是畅玩游戏 (当且仅当畅玩开关打开,且游戏类型为畅玩才会返回 true) */ + @Deprecated("只用来兼容旧的数据,新的功能不要调用它") fun isVGame(): Boolean { if (!mIsVGame) { val vHelperProvider = ARouter.getInstance().build(RouteConsts.provider.vhelper).navigation() as? IVHelperProvider mIsVGame = if (vHelperProvider?.isVGameOn() == false) { false - } else { + } else if (mDownloadStatusExtra == "off") { downloadStatus == Constants.V_GAME || downloadStatus == Constants.V_GAME_32 + } else { + false } } @@ -926,6 +1007,11 @@ data class GameEntity( companion object { const val TAG: String = "GameEntity" const val CHECK_MIRROR_INFO_INTERVAL = 10 * 1000 // 检查镜像更新间隔 10s + + private const val GAME_DOWNLOAD_BUTTON_MODE_UNKNOWN = 0 + const val GAME_DOWNLOAD_BUTTON_MODE_DOWNLOAD = 1 + const val GAME_DOWNLOAD_BUTTON_MODE_VGAME = 2 + const val GAME_DOWNLOAD_BUTTON_MODE_DUAL = 3 } @Parcelize diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameInstall.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameInstall.kt index 3aeb9fd63d..ebbd12cc76 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameInstall.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameInstall.kt @@ -18,14 +18,17 @@ data class GameInstall( var isSignByGh: Boolean = false, var installTime: Long = 0, var version: String = "", - var isSmoothGame: Boolean = false, // 是否是畅玩游戏 + var isVGame: Boolean = false, // 是否是畅玩游戏 var downloadStatus: String? = "", // 下载状态,对应 GameEntity 的 downloadStatus var category: String? = "", // 类型,对应 GameEntity 的 category var tag: Any? = null ) { companion object { - fun transformGameInstall(game: GameEntity, installedPkgName: String): GameInstall { + fun transformGameInstall(game: GameEntity, + installedPkgName: String, + isVGame: Boolean = false + ): GameInstall { val gameInstall = GameInstall() val application = HaloApp.getInstance() val packageUtils = @@ -39,7 +42,7 @@ data class GameInstall( gameInstall.iconFloat = game.iconFloat gameInstall.version = packageUtils?.getVersionNameByPackageName(installedPkgName) ?: "unknown" gameInstall.packageName = installedPkgName - gameInstall.isSmoothGame = game.isVGame() + gameInstall.isVGame = isVGame gameInstall.downloadStatus = game.downloadStatus gameInstall.category = game.category return gameInstall diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/PlatformUtils.java b/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/PlatformUtils.java index 180f9a9b42..c08b8d34f1 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/PlatformUtils.java +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/PlatformUtils.java @@ -9,12 +9,9 @@ import android.text.TextUtils; import androidx.collection.ArrayMap; import androidx.core.content.ContextCompat; -import com.alibaba.android.arouter.launcher.ARouter; -import com.gh.gamecenter.common.constant.RouteConsts; import com.gh.gamecenter.common.eventbus.EBReuse; import com.gh.gamecenter.common.retrofit.Response; import com.gh.gamecenter.core.AppExecutor; -import com.gh.gamecenter.core.provider.IVHelperProvider; import com.gh.gamecenter.feature.HaloApp; import com.gh.gamecenter.feature.R; import com.gh.gamecenter.feature.entity.PlatformEntity; @@ -189,10 +186,6 @@ public class PlatformUtils { if ("".equals(platform) || "官方版".equals(platform)) { return "官方版"; } - IVHelperProvider vHelperProvider = (IVHelperProvider) ARouter.getInstance().build(RouteConsts.provider.vhelper).navigation(); - if (vHelperProvider.getPlatformV().equals(platform)) { - return vHelperProvider.getPlatformV(); - } String platformName = platformMap.get(platform); if (TextUtils.isEmpty(platformName)) { diff --git a/module_core_feature/src/main/res/values/strings.xml b/module_core_feature/src/main/res/values/strings.xml index 7e5d2c8a60..8907513ed1 100644 --- a/module_core_feature/src/main/res/values/strings.xml +++ b/module_core_feature/src/main/res/values/strings.xml @@ -9,6 +9,13 @@ 暂停 启动 更新 + 本地下载 + 本地更新 + 本地安装 + 本地启动 + 开始更新 + 开始畅玩 + 启动畅玩 更新中 等待中 打开