diff --git a/app/src/main/java/com/gh/common/constant/Constants.java b/app/src/main/java/com/gh/common/constant/Constants.java index 7b0e0f20a4..22129ca4e4 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -51,6 +51,7 @@ public class Constants { public static final String EXTRA_DOWNLOAD_TYPE = "extra_download_type"; public static final String SILENT_UPDATE = "静默更新"; + public static final String EMULATOR_DOWNLOAD = "下载模拟器"; public static final String LAST_GHZS_UPDATE_FILE_SIZE = "last_ghzs_update_file_size"; // 新用户首次启动光环的时间 diff --git a/app/src/main/java/com/gh/common/emulator/EmulatorDownloadManager.kt b/app/src/main/java/com/gh/common/emulator/EmulatorDownloadManager.kt index e941d437ce..2f432e1a87 100644 --- a/app/src/main/java/com/gh/common/emulator/EmulatorDownloadManager.kt +++ b/app/src/main/java/com/gh/common/emulator/EmulatorDownloadManager.kt @@ -1,5 +1,167 @@ package com.gh.common.emulator -class EmulatorDownloadManager { +import android.app.Dialog +import android.content.Context +import android.view.View +import android.view.ViewGroup +import android.view.Window +import android.widget.ProgressBar +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import com.gh.common.AppExecutor.uiExecutor +import com.gh.common.constant.Constants +import com.gh.common.util.* +import com.gh.common.util.PackageInstaller.getDownloadPath +import com.gh.download.DownloadManager +import com.gh.gamecenter.R +import com.gh.gamecenter.entity.GameEntity +import com.halo.assistant.HaloApp +import com.lightgame.download.DataWatcher +import com.lightgame.download.DownloadEntity +import com.lightgame.download.DownloadStatus +import com.lightgame.download.FileUtils +import com.lightgame.utils.Utils +import java.text.DecimalFormat +class EmulatorDownloadManager private constructor() { + + private var app_pb_progress: ProgressBar? = null + private var appProgressSize: TextView? = null + private var appProgressRemain: TextView? = null + private var appProgressPercent: TextView? = null + private var appProgressFilling: View? = null + private var appProgressAnchor: View? = null + + private var downloadDialog: Dialog? = null + + private val dataWatcher = object : DataWatcher() { + override fun onDataChanged(downloadEntity: DownloadEntity?) { + if (downloadEntity?.isEmulatorDownload() == true) { + val size = downloadEntity.progress.toFloat() / 1024 / 1024 + val df = DecimalFormat("0.00") + appProgressSize!!.text = "${df.format(size.toDouble())}MB" + appProgressRemain!!.text = String.format("剩余%s", SpeedUtils.getRemainSecondTime(downloadEntity.size, + downloadEntity.progress, downloadEntity.speed * 1024)) + app_pb_progress!!.progress = (downloadEntity.percent * 10).toInt() + + val width = app_pb_progress!!.width + val marLeft = (downloadEntity.percent / 100 * width).toInt() + val anchorLp = appProgressAnchor!!.layoutParams + if (anchorLp is ConstraintLayout.LayoutParams) { + anchorLp.leftMargin = marLeft + appProgressAnchor!!.layoutParams = anchorLp + } + + val fillingLp = appProgressFilling!!.layoutParams + fillingLp.width = marLeft + DisplayUtils.dip2px(5f) + appProgressFilling!!.layoutParams = fillingLp + + appProgressPercent?.text = if (downloadEntity.percent != 100.0) "${downloadEntity.percent}%" else "100%" + when { + DownloadStatus.done == downloadEntity.status -> { + DownloadManager.getInstance(HaloApp.getInstance().application).cancel(downloadEntity.url, false, true) +// downloadDialog?.dismiss() + + } + DownloadStatus.neterror == downloadEntity.status -> { + ToastUtils.showToast("网络错误,请稍后重试") + } + DownloadStatus.timeout == downloadEntity.status -> { + ToastUtils.showToast("网络错误,请稍后重试") + } + DownloadStatus.notfound == downloadEntity.status -> { + ToastUtils.showToast("下载链接异常,请稍后重试") + } + DownloadStatus.hijack == downloadEntity.status -> { + ToastUtils.showToast("网络劫持,请稍后重试") + } + } + } + } + } + + fun showDownloadDialog(context: Context, gameEntity: GameEntity) { + DialogUtils.showNewAlertDialog(context, "安装模拟器", "模拟器游戏需要先下载安装对应的模拟器,才可以运行", "取消", "下载(${gameEntity.getApk()[0].size})", null, { + showDownloadingDialog(context, gameEntity) + }) + } + + private fun showDownloadingDialog(context: Context, gameEntity: GameEntity) { + val msg = FileUtils.isCanDownload(context, gameEntity.getApk()[0].size) + if (!msg.isNullOrEmpty()) { + Utils.toast(context, msg) + return + } + if (NetworkUtils.isMobileConnected(context)) { + Utils.toast(context, "当前使用移动数据进行下载") + } + + downloadDialog = Dialog(context) + downloadDialog?.window?.setBackgroundDrawableResource(R.color.transparent) + + val view = View.inflate(context, R.layout.app_updating_dialog, null) + + app_pb_progress = view.findViewById(R.id.progress) + appProgressSize = view.findViewById(R.id.size) + appProgressRemain = view.findViewById(R.id.remain) + appProgressAnchor = view.findViewById(R.id.progress_anchor) + appProgressPercent = view.findViewById(R.id.percent) + appProgressFilling = view.findViewById(R.id.progress_filling) + + view.findViewById(R.id.title).text = "正在下载模拟器,请耐心等待" + + downloadDialog?.setOnDismissListener { + DownloadManager.getInstance(context).removeObserver(dataWatcher) + } + + val dialogWidth: Int = context.resources.displayMetrics.widthPixels - DisplayUtils.dip2px(60f) + downloadDialog?.setCanceledOnTouchOutside(false) + downloadDialog?.setCancelable(false) + downloadDialog?.closeOptionsMenu() + downloadDialog?.requestWindowFeature(Window.FEATURE_NO_TITLE) + downloadDialog?.setContentView(view, ViewGroup.LayoutParams(dialogWidth, ViewGroup.LayoutParams.WRAP_CONTENT)) + + createUpdate(context, gameEntity) + + downloadDialog?.show() + } + + fun showNoneEmulatorDialog() { + + } + + private fun createUpdate(context: Context, gameEntity: GameEntity) { + DownloadManager.getInstance(context).addObserver(dataWatcher) + val apkEntity = gameEntity.getApk()[0] + val downloadEntity = DownloadEntity() + downloadEntity.url = apkEntity.url + downloadEntity.name = gameEntity.name + downloadEntity.path = getDownloadPath(gameEntity.name, apkEntity.format) + downloadEntity.eTag = apkEntity.etag + downloadEntity.icon = gameEntity.icon + downloadEntity.platform = apkEntity.getPlatform() + downloadEntity.packageName = apkEntity.packageName + downloadEntity.gameId = gameEntity.id + downloadEntity.versionName = apkEntity.version + + downloadEntity.addMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE, Constants.EMULATOR_DOWNLOAD) + + DownloadManager.getInstance(context).cancel(downloadEntity.url, true, true) + DownloadManager.getInstance(context).pauseAll() + + uiExecutor.executeWithDelay(Runnable { DownloadManager.getInstance(context).add(downloadEntity) }, 200) + } + + + companion object { + @Volatile + private var instance: EmulatorDownloadManager? = null + + @JvmStatic + fun getInstance(): EmulatorDownloadManager { + return instance ?: synchronized(this) { + instance ?: EmulatorDownloadManager().also { instance = it } + } + } + } } \ 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 68b0520d0b..e089622236 100644 --- a/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt +++ b/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt @@ -45,6 +45,7 @@ object DownloadNotificationHelper { val xapkStatus = entity.meta[XapkInstaller.XAPK_UNZIP_STATUS] if (entity.getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) == Constants.SILENT_UPDATE) return + if (entity.getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) == Constants.EMULATOR_DOWNLOAD) return val intent = Intent() if (entity.status == DownloadStatus.done && xapkStatus != XapkUnzipStatus.FAILURE.name) { 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 c86d32ff23..86eff45d85 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -141,8 +141,10 @@ object DownloadObserver { return } + val downloadType = downloadEntity.getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) // 是否是自动安装 - if (PreferenceManager.getDefaultSharedPreferences(mApplication).getBoolean(SettingsFragment.AUTO_INSTALL_SP_KEY, true)) { + val isAutoInstall = PreferenceManager.getDefaultSharedPreferences(mApplication).getBoolean(SettingsFragment.AUTO_INSTALL_SP_KEY, true) + if (downloadType == Constants.EMULATOR_DOWNLOAD || isAutoInstall) { if (FileUtils.isEmptyFile(downloadEntity.path)) { Utils.toast(mApplication, R.string.install_failure_hint) downloadManager.cancel(downloadEntity.url) diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index d3dbd40de6..e188bf8232 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -661,6 +661,9 @@ fun DownloadEntity.getMetaExtra(key: String): String { fun DownloadEntity.isSilentUpdate(): Boolean { return Constants.SILENT_UPDATE == getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) } +fun DownloadEntity.isEmulatorDownload(): Boolean { + return Constants.EMULATOR_DOWNLOAD == getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) +} /** * Process related diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index 7ebca09824..867831af89 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -531,7 +531,8 @@ public class DownloadManager implements DownloadStatusListener { if (downloadEntityList == null) return filteredDownloadEntityList; for (DownloadEntity downloadEntity : downloadEntityList) { - if (!Constants.SILENT_UPDATE.equals(ExtensionsKt.getMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE))) { + if (!Constants.SILENT_UPDATE.equals(ExtensionsKt.getMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE))&& + !Constants.EMULATOR_DOWNLOAD.equals(ExtensionsKt.getMetaExtra(downloadEntity, Constants.EXTRA_DOWNLOAD_TYPE))) { filteredDownloadEntityList.add(downloadEntity); } } 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 c64fd192e1..0a3fa6c02c 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 @@ -9,6 +9,7 @@ import com.gh.common.dialog.CertificationDialog; import com.gh.common.dialog.DeviceRemindDialog; import com.gh.common.dialog.GameOffServiceDialogFragment; import com.gh.common.dialog.ReserveDialogFragment; +import com.gh.common.emulator.EmulatorDownloadManager; import com.gh.common.emulator.EmulatorGameManager; import com.gh.common.exposure.ExposureEvent; import com.gh.common.history.HistoryHelper; @@ -191,10 +192,11 @@ public class DetailViewHolder { case LAUNCH_OR_OPEN: if (mGameEntity.getApk().size() == 1) { //启动模拟器游戏 - if(EmulatorGameManager.formats.contains(mGameEntity.getApk().get(0).getFormat())){ + if (EmulatorGameManager.formats.contains(mGameEntity.getApk().get(0).getFormat())) { EmulatorGameEntity emulatorGameEntity = EmulatorGameManager.findGameByName(mGameEntity.getName()); if (emulatorGameEntity != null) { - ToastUtils.INSTANCE.showToast("启动模拟器游戏-"+emulatorGameEntity.getGameName()); + ToastUtils.INSTANCE.showToast("启动模拟器游戏-" + emulatorGameEntity.getGameName()); + EmulatorDownloadManager.getInstance().showDownloadDialog(mViewHolder.context, mGameEntity); } return; } 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 324cd2c851..4155098578 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java @@ -7,12 +7,6 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import com.gh.base.fragment.BaseFragment; import com.gh.common.util.DialogUtils; import com.gh.common.util.EntranceUtils; @@ -41,6 +35,11 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.OnClick; @@ -178,6 +177,10 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi if (ExtensionsKt.isSilentUpdate(downloadEntity)) { return; } + //下载模拟器任务不需要添加 + if (ExtensionsKt.isEmulatorDownload(downloadEntity)) { + return; + } if (adapter.getDownloadingList().isEmpty()) { adapter.getDownloadingList().add(0, downloadEntity);