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 a34c4f298f..b7c6fece4a 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -382,17 +382,15 @@ public class BindingAdapters { return; } } - VHelper.checkVSpaceBeforeAction(v.getContext(), gameEntity, () -> { - GamePermissionDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, gameEntity.getInfo(), () -> { - BrowserInstallHelper.showBrowserInstallHintDialog(v.getContext(), gameEntity.isVGame(), () -> { - PackageCheckDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, () -> { - DownloadDialogHelper.findAvailableDialogAndShow(v.getContext(), gameEntity, apk, () -> { - CertificationDialog.showCertificationDialog(v.getContext(), gameEntity, () -> { - DialogUtils.showVersionNumberDialog(v.getContext(), gameEntity, () -> { - DialogUtils.showOverseaDownloadDialog(v.getContext(), gameEntity, () -> { - DialogUtils.checkDownload(v.getContext(), apk.getSize(), - isSubscribe -> download(progressBar, gameEntity, traceEvent, isSubscribe, entrance, location)); - }); + GamePermissionDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, gameEntity.getInfo(), () -> { + BrowserInstallHelper.showBrowserInstallHintDialog(v.getContext(), gameEntity.isVGame(), () -> { + PackageCheckDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, () -> { + DownloadDialogHelper.findAvailableDialogAndShow(v.getContext(), gameEntity, apk, () -> { + CertificationDialog.showCertificationDialog(v.getContext(), gameEntity, () -> { + DialogUtils.showVersionNumberDialog(v.getContext(), gameEntity, () -> { + DialogUtils.showOverseaDownloadDialog(v.getContext(), gameEntity, () -> { + DialogUtils.checkDownload(v.getContext(), apk.getSize(), + isSubscribe -> download(progressBar, gameEntity, traceEvent, isSubscribe, entrance, location)); }); }); }); @@ -433,7 +431,7 @@ public class BindingAdapters { } if (gameEntity.isVGame()) { - VHelper.launch((AppCompatActivity) v.getContext(), gameEntity.getApk().get(0).getPackageName()); + VHelper.installOrLaunch((AppCompatActivity) v.getContext(), gameEntity.getApk().get(0).getPackageName()); return; } 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 d56fd3465c..286aa1a621 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt @@ -761,7 +761,7 @@ object DownloadItemUtils { } if (gameEntity.isVGame()) { - VHelper.launch((context as AppCompatActivity), gameEntity.getUniquePackageName() ?: "") + VHelper.installOrLaunch((context as AppCompatActivity), gameEntity.getUniquePackageName() ?: "") return } 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 4cba7b8c0f..f8417ed863 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 @@ -31,7 +31,6 @@ import com.gh.gamecenter.core.utils.MtaHelper; import com.gh.common.util.PackageInstaller; import com.gh.common.util.PackageUtils; import com.gh.gamecenter.common.utils.PermissionHelper; -import com.gh.common.util.RealNameHelper; import com.gh.common.util.ReservationHelper; import com.gh.gamecenter.core.utils.StringUtils; import com.gh.common.view.DownloadProgressBar; @@ -189,37 +188,35 @@ public class DetailViewHolder { case NORMAL: DataLogUtils.uploadGameLog(mViewHolder.context, mGameEntity.getId(), mGameEntity.getName(), mEntrance); case PLUGIN: - VHelper.checkVSpaceBeforeAction(mViewHolder.context, mGameEntity, () -> { - GamePermissionDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity, mGameEntity.getInfo(), () -> { - PermissionHelper.checkStoragePermissionBeforeAction(mViewHolder.context, () -> { - if (mGameEntity.getApk().size() == 1) { - ApkEntity apk = mGameEntity.getApk().get(0); - BrowserInstallHelper.showBrowserInstallHintDialog(mViewHolder.context, mGameEntity.isVGame(), () -> { - PackageCheckDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity, () -> { - DownloadDialogHelper.findAvailableDialogAndShow(mViewHolder.context, mGameEntity, apk, () -> { - CertificationDialog.showCertificationDialog(mViewHolder.context, mGameEntity, () -> { - DialogUtils.showVersionNumberDialog(mViewHolder.context, mGameEntity, () -> { - DialogUtils.showOverseaDownloadDialog(mViewHolder.context, mGameEntity, () -> { - DialogUtils.checkDownload(mViewHolder.context, apk.getSize(), this::download); - }); + GamePermissionDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity, mGameEntity.getInfo(), () -> { + PermissionHelper.checkStoragePermissionBeforeAction(mViewHolder.context, () -> { + if (mGameEntity.getApk().size() == 1) { + ApkEntity apk = mGameEntity.getApk().get(0); + BrowserInstallHelper.showBrowserInstallHintDialog(mViewHolder.context, mGameEntity.isVGame(), () -> { + PackageCheckDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity, () -> { + DownloadDialogHelper.findAvailableDialogAndShow(mViewHolder.context, mGameEntity, apk, () -> { + CertificationDialog.showCertificationDialog(mViewHolder.context, mGameEntity, () -> { + DialogUtils.showVersionNumberDialog(mViewHolder.context, mGameEntity, () -> { + DialogUtils.showOverseaDownloadDialog(mViewHolder.context, mGameEntity, () -> { + DialogUtils.checkDownload(mViewHolder.context, apk.getSize(), this::download); }); }); }); }); }); - } else { - CertificationDialog.showCertificationDialog(mViewHolder.context, mGameEntity, () -> { - DialogUtils.showVersionNumberDialog(mViewHolder.context, mGameEntity, () -> { - DownloadDialog.showDownloadDialog( - mViewHolder.context, - mGameEntity, - mTraceEvent, - StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"), - mName + ":" + mTitle); - }); + }); + } else { + CertificationDialog.showCertificationDialog(mViewHolder.context, mGameEntity, () -> { + DialogUtils.showVersionNumberDialog(mViewHolder.context, mGameEntity, () -> { + DownloadDialog.showDownloadDialog( + mViewHolder.context, + mGameEntity, + mTraceEvent, + StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])"), + mName + ":" + mTitle); }); - } - }); + }); + } }); }); break; @@ -240,7 +237,7 @@ public class DetailViewHolder { } if (mGameEntity.isVGame()) { - VHelper.launch((AppCompatActivity) mViewHolder.context, mGameEntity.getApk().get(0).getPackageName()); + VHelper.installOrLaunch((AppCompatActivity) mViewHolder.context, mGameEntity.getApk().get(0).getPackageName()); return; } diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt index 477050f79a..0827a7f402 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt @@ -268,6 +268,10 @@ data class GameEntity( // 本地字段,使用镜像信息 var useMirrorInfo: Boolean = false, + + // 本地字段,最后打开时间 + var lastPlayedTime: Long = 0, + // 本地字段,曝光用 var displayContent: String = "", var isPlatformRecommend: Boolean = false, diff --git a/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt b/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt index 757f1518b3..e40f8bbfe3 100644 --- a/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt +++ b/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt @@ -123,7 +123,7 @@ class HomeRecentVGameAdapter(context: Context) : DiffUtilAdapter(con when (downloadEntity.status) { DownloadStatus.done -> { binding.root.setOnClickListener { - VHelper.launch(binding.root.context, downloadEntity.packageName) + VHelper.installOrLaunch(binding.root.context, downloadEntity.packageName) } } DownloadStatus.pause, diff --git a/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt b/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt index 35d400c386..299bd32412 100644 --- a/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt +++ b/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt @@ -22,6 +22,7 @@ import com.gh.gamecenter.common.constant.ItemViewType import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.AppExecutor import com.gh.gamecenter.core.utils.CurrentActivityHolder +import com.gh.gamecenter.core.utils.NumberUtils import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.core.utils.ToastUtils import com.gh.gamecenter.databinding.ItemVgameDownloadManagerBinding @@ -97,10 +98,13 @@ class VDownloadManagerAdapter(context: Context, private val mViewModel: VDownloa when (holder) { is VGameItemViewHolder -> { val gameEntity = mEntityList[position] + val totalPlayedTimeString = NumberUtils.transSimpleUsageTime(gameEntity.playedTime) BindingAdapters.setGameName(holder.binding.nameTv, gameEntity, false, true) holder.binding.iconIv.displayGameIcon(gameEntity) - holder.binding.descTv.text = "已畅玩999分钟" + + holder.binding.descTv.goneIf(mViewModel.isTypeDownloaded()) + holder.binding.descTv.text = "已畅玩$totalPlayedTimeString" (holder.binding.selectIv.layoutParams as ConstraintLayout.LayoutParams).apply { width = 20F.dip2px() @@ -279,7 +283,7 @@ class VDownloadManagerAdapter(context: Context, private val mViewModel: VDownloa btnText = context.getString(R.string.launch) setOnClickListener { CurrentActivityHolder.getCurrentActivity()?.let { - VHelper.launch(it, downloadEntity.packageName) + VHelper.installOrLaunch(it, downloadEntity.packageName) } } } diff --git a/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt b/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt index 97d7fbc572..ff0a4012c8 100644 --- a/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt +++ b/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt @@ -72,6 +72,10 @@ class VDownloadManagerViewModel(application: Application) : } } + fun isTypeDownloaded() : Boolean { + return type == TYPE_DOWNLOADED + } + companion object { const val TYPE = "type" const val TYPE_DOWNLOADED = "type_downloaded" diff --git a/app/src/main/java/com/gh/vspace/VHelper.kt b/app/src/main/java/com/gh/vspace/VHelper.kt index 0ec094a0ee..da3c1388c8 100644 --- a/app/src/main/java/com/gh/vspace/VHelper.kt +++ b/app/src/main/java/com/gh/vspace/VHelper.kt @@ -1,7 +1,6 @@ package com.gh.vspace import android.Manifest -import android.app.Activity import android.content.Context import android.content.Intent import android.net.Uri @@ -201,7 +200,7 @@ object VHelper { return } - checkStoragePermissionBeforeAction(context, callback) + callback.invoke() } else { callback.invoke() } @@ -271,15 +270,15 @@ object VHelper { /** * 安装新应用 */ - fun install(activity: Activity, filePath: String) { - Utils.log(LOG_TAG, "尝试安装新应用") + fun install(context: Context, filePath: String) { + Utils.log(LOG_TAG, "尝试安装新应用 $filePath") - if (showDialogIfVSpaceIsNeeded(activity)) { + if (showDialogIfVSpaceIsNeeded(context)) { return } val installClosure: () -> Unit = { - checkStoragePermissionBeforeAction(activity) { + checkStoragePermissionBeforeAction(context) { // 安装过程会比较漫长,所以得放在工作线程运行 AppExecutor.ioExecutor.execute { try { @@ -315,16 +314,29 @@ object VHelper { } /** - * 启动应用 + * 安装或启动应用 */ @JvmStatic - fun launch(context: Context, packageName: String) { - Utils.log(LOG_TAG, "打开应用$packageName") + fun installOrLaunch(context: Context, packageName: String) { + Utils.log(LOG_TAG, "检测是需要安装还是启动 $packageName") - DownloadManager.getInstance().getDownloadEntitySnapshotByPackageName(packageName)?.let { - mLastSuccessfullyLaunchedGame = Pair(System.currentTimeMillis(), it.gameId) + if (showDialogIfVSpaceIsNeeded(context)) { + return } + if (isInstalled(packageName)) { + launch(context, packageName) + } else { + install(context, getDownloadEntitySnapshotByPackageName(packageName)?.path ?: "") + } + } + + /** + * 启动应用 + */ + fun launch(context: Context, packageName: String) { + Utils.log(LOG_TAG, "打开应用 $packageName") + if (showDialogIfVSpaceIsNeeded(context)) { return } @@ -335,6 +347,10 @@ object VHelper { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) context.startActivity(intent) + DownloadManager.getInstance().getDownloadEntitySnapshotByPackageName(packageName)?.let { + mLastSuccessfullyLaunchedGame = Pair(System.currentTimeMillis(), it.gameId) + } + updateLastPlayedTime(packageName) } catch (e: Exception) { ToastUtils.toast(e.localizedMessage ?: "") @@ -342,9 +358,11 @@ object VHelper { } if (mDelegateManager.isConnectAidlInterface) { - launchClosure.invoke() + checkStoragePermissionBeforeAction(context, launchClosure) } else { - connectService(launchClosure) + checkStoragePermissionBeforeAction(context) { + connectService(launchClosure) + } } } @@ -360,7 +378,7 @@ object VHelper { PackageObserver.onPackageChanged(EBPackage("卸载", packageName, "unknown")) } - Utils.log(LOG_TAG, "安装新应用结果 -> $result") + Utils.log(LOG_TAG, "卸载应用结果 -> $result") } catch (e: Exception) { ToastUtils.toast(e.localizedMessage ?: "") } @@ -387,7 +405,7 @@ object VHelper { } /** - * 根据包名获取 `下载实例` + * 根据包名获取下载快照 */ fun getDownloadEntitySnapshotByPackageName(packageName: String): DownloadEntity? { return DownloadManager.getInstance().getDownloadEntitySnapshotByPackageName(packageName) @@ -500,7 +518,8 @@ object VHelper { ) ) icon = downloadEntity.icon - playedTime = if (lastPlayedTimeString == "") 0L else lastPlayedTimeString.toLong() + lastPlayedTime = if (lastPlayedTimeString == "") 0L else lastPlayedTimeString.toLong() + playedTime = mInstalledInfoList.firstOrNull { it.packageName == getUniquePackageName() }?.appTotalPlayTime ?: 0 downloadStatus = "smooth" setEntryMap(DownloadManager.getInstance().getEntryMap(name)) } diff --git a/app/src/main/java/com/gh/vspace/VLoadCompleteWindowHelper.kt b/app/src/main/java/com/gh/vspace/VLoadCompleteWindowHelper.kt index ecc8044d32..48cb01fa16 100644 --- a/app/src/main/java/com/gh/vspace/VLoadCompleteWindowHelper.kt +++ b/app/src/main/java/com/gh/vspace/VLoadCompleteWindowHelper.kt @@ -144,7 +144,7 @@ object VLoadCompleteWindowHelper { } } mBinding.launchTv.setOnClickListener { - VHelper.launch(activity, mAdapter.gameEntityList[mBinding.viewPager.currentItem].getApk()[0].packageName) + VHelper.installOrLaunch(activity, mAdapter.gameEntityList[mBinding.viewPager.currentItem].getApk()[0].packageName) } } } diff --git a/app/src/main/java/com/gh/vspace/VSpaceLoadingFragment.kt b/app/src/main/java/com/gh/vspace/VSpaceLoadingFragment.kt index bf5b32d1d6..982bc49af8 100644 --- a/app/src/main/java/com/gh/vspace/VSpaceLoadingFragment.kt +++ b/app/src/main/java/com/gh/vspace/VSpaceLoadingFragment.kt @@ -78,7 +78,7 @@ class VSpaceLoadingFragment : BaseFragment() { VHelper.getInstallationLiveData().observe(viewLifecycleOwner) { val currentPackageName = mGame?.getApk()?.firstOrNull()?.packageName if (it == currentPackageName) { - VHelper.launch(requireActivity(), currentPackageName!!) + VHelper.installOrLaunch(requireActivity(), currentPackageName!!) requireActivity().finish() } } diff --git a/vspace-bridge b/vspace-bridge index 6d91ee7416..4ad237b602 160000 --- a/vspace-bridge +++ b/vspace-bridge @@ -1 +1 @@ -Subproject commit 6d91ee74165c98fa2e8d65e5d3f0589a95774137 +Subproject commit 4ad237b60276f1f9bc9d6e7e0eeb0f1e12ad0fe6