diff --git a/app/build.gradle b/app/build.gradle index 722f3eb769..846eb157b3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -344,6 +344,7 @@ dependencies { implementation "com.github.PhilJay:MPAndroidChart:${chart}" implementation "com.github.hsiafan:apk-parser:$apkParser" + implementation "org.nanohttpd:nanohttpd:$nanohttpd" implementation project(':libraries:LGLibrary') // implementation project(':libraries:MTA') 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 6c41de907c..0154ada354 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -146,6 +146,13 @@ public class Constants { public static final String SP_XAPK_UNZIP_ACTIVITY = "xapk_unzip_activity"; public static final String SP_XAPK_URL = "xapk_url"; + // 使用浏览器安装开关 + public static final String SP_USE_BROWSER_TO_INSTALL = "use_browser_to_install"; + // 游戏详情页底部使用浏览器安装提示 + public static final String SP_SHOULD_SHOW_GAMEDETAIL_USE_BROWSER_TO_INSTALL_HINT = "should_show_gamedetail_use_browser_to_install_hint"; + // 第一次普通安装推荐使用浏览器安装提示 + public static final String SP_SHOULD_SHOW_USE_BROWSER_TO_INSTALL_HINT = "should_show_use_browser_to_install_hint"; + //首页视频播放进度 public static final String SP_HOME_VIDEO_PLAY_RECORD = "home_video_play_record"; 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 5671d3a8ff..3be59ee53b 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -52,6 +52,7 @@ import com.gh.common.view.DrawableView; import com.gh.common.view.GameIconView; import com.gh.download.DownloadManager; import com.gh.download.dialog.DownloadDialog; +import com.gh.download.server.BrowserInstallHelper; import com.gh.gamecenter.DownloadManagerActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.WebActivity; @@ -456,13 +457,15 @@ public class BindingAdapters { return; } } - PackageCheckDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity.getPackageDialog(), () -> { - 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)); + BrowserInstallHelper.showBrowserInstallHintDialog(v.getContext(), () -> { + PackageCheckDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity.getPackageDialog(), () -> { + 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)); + }); }); }); }); diff --git a/app/src/main/java/com/gh/common/util/DialogHelper.kt b/app/src/main/java/com/gh/common/util/DialogHelper.kt index 35e9ed4484..c43b74061a 100644 --- a/app/src/main/java/com/gh/common/util/DialogHelper.kt +++ b/app/src/main/java/com/gh/common/util/DialogHelper.kt @@ -2,6 +2,8 @@ package com.gh.common.util import android.app.Dialog import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable import android.view.LayoutInflater import android.view.View import android.view.Window @@ -129,6 +131,7 @@ object DialogHelper { dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) dialog.setContentView(contentView) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) dialog.show() return dialog } diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index c205c7db67..4486f75335 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -28,6 +28,7 @@ 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.download.server.BrowserInstallHelper; import com.gh.gamecenter.DownloadManagerActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.WebActivity; @@ -586,12 +587,14 @@ public class DownloadItemUtils { if (str.equals(context.getString(R.string.download))) { // 先弹下载弹窗(如果需要的话) - PackageCheckDialogFragment.show((AppCompatActivity) context, gameEntity.getPackageDialog(), () -> { - DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk, () -> { - CertificationDialog.showCertificationDialog(context, gameEntity, () -> { - DialogUtils.showOverseaDownloadDialog(context, gameEntity, () -> { - DialogUtils.checkDownload(context, apk.getSize(), - isSubscribe -> download(context, gameEntity, downloadBtn, entrance, location, isSubscribe, traceEvent)); + BrowserInstallHelper.showBrowserInstallHintDialog(context, () -> { + PackageCheckDialogFragment.show((AppCompatActivity) context, gameEntity.getPackageDialog(), () -> { + DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk, () -> { + CertificationDialog.showCertificationDialog(context, gameEntity, () -> { + DialogUtils.showOverseaDownloadDialog(context, gameEntity, () -> { + DialogUtils.checkDownload(context, apk.getSize(), + isSubscribe -> download(context, gameEntity, downloadBtn, entrance, location, isSubscribe, traceEvent)); + }); }); }); }); @@ -599,13 +602,15 @@ public class DownloadItemUtils { DataLogUtils.uploadGameLog(context, gameEntity.getId(), gameEntity.getName(), entrance); } else if (str.equals(context.getString(R.string.attempt))) { - PackageCheckDialogFragment.show((AppCompatActivity) context, gameEntity.getPackageDialog(), () -> { - DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk, () -> { - CertificationDialog.showCertificationDialog(context, gameEntity, () -> { - DialogUtils.showVersionNumberDialog(context, gameEntity, () -> { - DialogUtils.showOverseaDownloadDialog(context, gameEntity, () -> { - DialogUtils.checkDownload(context, apk.getSize(), - isSubscribe -> download(context, gameEntity, downloadBtn, entrance, location, isSubscribe, traceEvent)); + BrowserInstallHelper.showBrowserInstallHintDialog(context, () -> { + PackageCheckDialogFragment.show((AppCompatActivity) context, gameEntity.getPackageDialog(), () -> { + DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apk, () -> { + CertificationDialog.showCertificationDialog(context, gameEntity, () -> { + DialogUtils.showVersionNumberDialog(context, gameEntity, () -> { + DialogUtils.showOverseaDownloadDialog(context, gameEntity, () -> { + DialogUtils.checkDownload(context, apk.getSize(), + isSubscribe -> download(context, gameEntity, downloadBtn, entrance, location, isSubscribe, traceEvent)); + }); }); }); }); 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 0e1c4b8ea4..0cc7246f90 100644 --- a/app/src/main/java/com/gh/common/util/PackageInstaller.kt +++ b/app/src/main/java/com/gh/common/util/PackageInstaller.kt @@ -11,6 +11,7 @@ import androidx.core.content.FileProvider import com.gh.common.constant.Constants import com.gh.common.dialog.InstallPermissionDialogFragment import com.gh.common.xapk.XapkInstaller +import com.gh.download.server.BrowserInstallHelper import com.gh.gamecenter.BuildConfig import com.halo.assistant.HaloApp import com.lightgame.download.DownloadEntity @@ -21,7 +22,6 @@ import java.io.File object PackageInstaller { - /** * 为了兼容java代码 */ @@ -70,6 +70,13 @@ object PackageInstaller { @JvmStatic fun install(context: Context, pkgPath: String) { try { + + // 判断是否需要使用浏览器来进行安装 + if (BrowserInstallHelper.shouldUseBrowserToInstall()) { + BrowserInstallHelper.downloadFile(pkgPath) + return + } + if (PackageUtils.isCanLaunchSetup(context, pkgPath)) { HaloApp.put(Constants.LAST_INSTALL_GAME, pkgPath) diff --git a/app/src/main/java/com/gh/download/PackageObserver.kt b/app/src/main/java/com/gh/download/PackageObserver.kt index d76589f915..1dd3df2530 100644 --- a/app/src/main/java/com/gh/download/PackageObserver.kt +++ b/app/src/main/java/com/gh/download/PackageObserver.kt @@ -7,6 +7,7 @@ import com.gh.common.constant.Constants import com.gh.common.loghub.LoghubUtils import com.gh.common.runOnIoThread import com.gh.common.util.* +import com.gh.download.server.BrowserInstallHelper import com.gh.gamecenter.entity.GameDigestEntity import com.gh.gamecenter.eventbus.EBPackage import com.gh.gamecenter.manager.UserManager @@ -74,6 +75,8 @@ object PackageObserver { if ("安装" == busFour.type) { mPackageViewModel.addInstalledGame(packageName) + BrowserInstallHelper.onApkInstalled(mDownloadEntity?.path) + if (mDownloadEntity != null) { if (mDownloadEntity.isPluggable) { val kv6: MutableMap = HashMap() 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 0e063b813a..acd056ec75 100644 --- a/app/src/main/java/com/gh/download/dialog/DownloadDialogItemViewHolder.kt +++ b/app/src/main/java/com/gh/download/dialog/DownloadDialogItemViewHolder.kt @@ -13,6 +13,7 @@ import com.gh.common.exposure.ExposureEvent import com.gh.common.util.* import com.gh.common.util.DirectUtils.directToLinkPage import com.gh.download.DownloadManager +import com.gh.download.server.BrowserInstallHelper import com.gh.gamecenter.DownloadManagerActivity import com.gh.gamecenter.R import com.gh.gamecenter.databinding.DownloadDialogItemBinding @@ -278,23 +279,27 @@ class DownloadDialogItemViewHolder(val binding: DownloadDialogItemBinding) : Bas // todo 有时间存储判断统一处理 val msg = FileUtils.isCanDownload(context, apkEntity.size) if (msg.isNullOrEmpty()) { - DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apkEntity, object : EmptyCallback { + BrowserInstallHelper.showBrowserInstallHintDialog(context, object : EmptyCallback { override fun onCallback() { - PackageCheckDialogFragment.show(context as AppCompatActivity, gameEntity.packageDialog, DialogUtils.ConfirmListener { - CertificationDialog.showCertificationDialog(context, gameEntity, DialogUtils.ConfirmListener { - DialogUtils.checkDownload(context, apkEntity.size) { isSubscribe -> - DownloadManager.createDownload( - context, - apkEntity, - gameEntity, - downloadMethod, - entrance, - location, - isSubscribe, traceEvent) + DownloadDialogHelper.findAvailableDialogAndShow(context, gameEntity, apkEntity, object : EmptyCallback { + override fun onCallback() { + PackageCheckDialogFragment.show(context as AppCompatActivity, gameEntity.packageDialog, DialogUtils.ConfirmListener { + CertificationDialog.showCertificationDialog(context, gameEntity, DialogUtils.ConfirmListener { + DialogUtils.checkDownload(context, apkEntity.size) { isSubscribe -> + DownloadManager.createDownload( + context, + apkEntity, + gameEntity, + downloadMethod, + entrance, + location, + isSubscribe, traceEvent) - DeviceRemindDialog.showDeviceRemindDialog(context, gameEntity) - } - }) + DeviceRemindDialog.showDeviceRemindDialog(context, gameEntity) + } + }) + }) + } }) } }) diff --git a/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt b/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt new file mode 100644 index 0000000000..587df04697 --- /dev/null +++ b/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt @@ -0,0 +1,125 @@ +package com.gh.download.server + +import android.content.Context +import com.gh.common.constant.Constants +import com.gh.common.util.DialogHelper +import com.gh.common.util.DirectUtils +import com.gh.common.util.EmptyCallback +import com.gh.common.util.SPUtils +import com.gh.gamecenter.ShellActivity +import com.halo.assistant.HaloApp +import com.lightgame.utils.Utils +import java.io.File + +object BrowserInstallHelper { + + private const val PORT = 32321 + + private val mServer by lazy { DownloadServer(PORT) } + private val mFileNameSet by lazy { hashSetOf() } + private val mContext by lazy { HaloApp.getInstance().application } + + fun downloadFile(filePath: String) { + val fileName = filePath.substringAfterLast(File.separator).removeSuffix(DownloadServer.APK_SUFFIX) + + if (!mServer.isAlive) startServer() + + mFileNameSet.add(fileName) + DirectUtils.directToExternalBrowser(mContext, "http://127.0.0.1:$PORT/$fileName") + } + + @JvmStatic + fun shouldUseBrowserToInstall(): Boolean { + if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) { + return true + } + + return false + } + + fun shouldShowUseBrowserToInstallHint(): Boolean { + return if (isUseBrowserToInstallEnabled()) { + if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) { + false + } else { + !SPUtils.getBoolean(Constants.SP_SHOULD_SHOW_USE_BROWSER_TO_INSTALL_HINT) + } + } else { + false + } + } + + fun shouldShowGameDetailUseBrowserToInstallHint(): Boolean { + return if (isUseBrowserToInstallEnabled()) { + if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) { + false + } else { + SPUtils.getBoolean(Constants.SP_SHOULD_SHOW_GAMEDETAIL_USE_BROWSER_TO_INSTALL_HINT, true) + } + } else { + false + } + } + + fun hideGameDetailUseBrowserToInstallHint() { + SPUtils.setBoolean(Constants.SP_SHOULD_SHOW_GAMEDETAIL_USE_BROWSER_TO_INSTALL_HINT, false) + } + + @JvmStatic + fun showBrowserInstallHintDialog(context: Context, callback: EmptyCallback) { + if (!shouldShowUseBrowserToInstallHint()) { + callback.onCallback() + return + } + SPUtils.setBoolean(Constants.SP_SHOULD_SHOW_USE_BROWSER_TO_INSTALL_HINT, false) + DialogHelper.showRoundedCornerDialog( + context, + "温馨提示", + "当前安装方式为助手安装,下载安装游戏需要验证账户密码或指纹。如需免密码安装,可选择切换安装方式为“浏览器安装”", + "修改路径:我的光环-设置-切换安装方式", + "切换安装方式", + "继续下载", + { + val intent = ShellActivity.getIntent(context, ShellActivity.Type.SWITCH_INSTALL_METHOD, null) + context.startActivity(intent) + }, + { + callback.onCallback() + } + ) + } + + /** + * 浏览器安装的后台开关 + */ + @JvmStatic + fun isUseBrowserToInstallEnabled(): Boolean { + return true + } + + fun onApkInstalled(path: String?) { + path?.let { + val fileName = path.substringAfterLast(File.separator).removeSuffix(DownloadServer.APK_SUFFIX) + // 更新下载名称 set,确定是否需要关闭下载服务 + mFileNameSet.remove(fileName) + stopServerIfNeeded() + } + } + + private fun startServer() { + try { + mServer.start() + } catch (e: Exception) { + e.printStackTrace() + Utils.toast(mContext, "浏览器下载服务开启失败") + } + } + + private fun stopServerIfNeeded() { + // 下载的文件都下载完了 + if (mFileNameSet.size == 0) { + mServer.stop() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/download/server/DownloadServer.kt b/app/src/main/java/com/gh/download/server/DownloadServer.kt new file mode 100644 index 0000000000..ebaafb41cc --- /dev/null +++ b/app/src/main/java/com/gh/download/server/DownloadServer.kt @@ -0,0 +1,31 @@ +package com.gh.download.server + +import com.halo.assistant.HaloApp +import com.lightgame.download.FileUtils +import fi.iki.elonen.NanoHTTPD +import java.io.File + +class DownloadServer(port: Int) : NanoHTTPD(port) { + + override fun serve(fileName: String?, + method: Method?, + headers: MutableMap?, + parms: MutableMap?, + files: MutableMap?): Response { + val filePath = FileUtils.getDownloadDir(HaloApp.getInstance()) + fileName + APK_SUFFIX + val file = File(filePath) + + return if (file.exists()) { + val fileType = FileUtils.getFileMimeType(HaloApp.getInstance().applicationContext, filePath) + ?: "application/vnd.android.package-archive" + newFixedLengthResponse(Response.Status.OK, fileType, file.inputStream(), file.length()) + } else { + newFixedLengthResponse("找不到文件") + } + } + + companion object { + const val APK_SUFFIX = ".apk" + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/ShellActivity.kt b/app/src/main/java/com/gh/gamecenter/ShellActivity.kt index f969c603d8..e78f1c75dd 100644 --- a/app/src/main/java/com/gh/gamecenter/ShellActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/ShellActivity.kt @@ -8,6 +8,7 @@ import com.gh.base.ToolBarActivity import com.gh.base.fragment.BaseFragment import com.gh.common.util.EntranceUtils import com.gh.gamecenter.amway.AmwaySuccessFragment +import com.halo.assistant.fragment.SwitchInstallMethodFragment /** * ShellActivity 用来包裹那些几乎没有交互且运营也不会想要知道页面访问量的静态 fragment (如安利墙的评论提交成功页面) @@ -28,12 +29,11 @@ class ShellActivity : ToolBarActivity() { when (intentType) { Type.AMWAY_SUCCESS -> startFragment(AmwaySuccessFragment().with(bundle)) + Type.SWITCH_INSTALL_METHOD -> startFragment(SwitchInstallMethodFragment()) } } - override fun getLayoutId(): Int { - return R.layout.activity_shell - } + override fun getLayoutId() = R.layout.activity_shell private fun startFragment(fragment: BaseFragment) { mFragment = fragment @@ -43,6 +43,7 @@ class ShellActivity : ToolBarActivity() { companion object { const val INTENT_TYPE = "intent_type" + @JvmStatic fun getIntent(context: Context, type: Type, extraParcelable: Parcelable? = null): Intent { val intent = Intent(context, ShellActivity::class.java) intent.putExtra(INTENT_TYPE, type.value) @@ -52,7 +53,8 @@ class ShellActivity : ToolBarActivity() { } enum class Type(val value: String) { - AMWAY_SUCCESS("amway_success"); + AMWAY_SUCCESS("amway_success"), + SWITCH_INSTALL_METHOD("switch_install_method"); companion object { fun fromString(typeString: String): Type { 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 44643f7a3f..26766a5d2f 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 @@ -35,6 +35,7 @@ import com.gh.common.util.StringUtils; import com.gh.common.view.DownloadProgressBar; import com.gh.download.DownloadManager; import com.gh.download.dialog.DownloadDialog; +import com.gh.download.server.BrowserInstallHelper; import com.gh.gamecenter.DownloadManagerActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.WebActivity; @@ -173,18 +174,19 @@ public class DetailViewHolder { PermissionHelper.checkStoragePermissionBeforeAction(mViewHolder.context, () -> { if (mGameEntity.getApk().size() == 1) { ApkEntity apk = mGameEntity.getApk().get(0); - PackageCheckDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity.getPackageDialog(), () -> { - 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); + BrowserInstallHelper.showBrowserInstallHintDialog(mViewHolder.context, () -> { + PackageCheckDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity.getPackageDialog(), () -> { + 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, () -> { 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 fa5a8f1c05..416c0ca4ef 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -34,6 +34,7 @@ import com.gh.common.view.TabIndicatorView import com.gh.common.xapk.XapkInstaller import com.gh.common.xapk.XapkUnzipStatus import com.gh.download.DownloadManager +import com.gh.download.server.BrowserInstallHelper import com.gh.gamecenter.* import com.gh.gamecenter.adapter.viewholder.DetailViewHolder import com.gh.gamecenter.entity.* @@ -173,6 +174,15 @@ class GameDetailFragment : NormalFragment() { @BindView(R.id.closeIv) lateinit var mReserveGuideClose: View + @BindView(R.id.browser_install_hint_container) + lateinit var mBrowserInstallContainer: View + + @BindView(R.id.browser_install_hint_close_iv) + lateinit var mBrowserInstallCloseIv: View + + @BindView(R.id.browser_install_hint_tv) + lateinit var mBrowserInstallHintTv: TextView + private var mDownloadMenuIcon: ImageView? = null private var mDownloadCountHint: TextView? = null private var mSkeleton: ViewSkeletonScreen? = null @@ -409,7 +419,6 @@ class GameDetailFragment : NormalFragment() { mConcernBtn.visibility = View.VISIBLE } - private fun observeData() { mViewModel.gameLiveData.observeNonNull(this) { gameResource -> if (gameResource.status == Status.SUCCESS) { @@ -1165,6 +1174,27 @@ class GameDetailFragment : NormalFragment() { if (mGameEntity != null && (mGameEntity!!.getApk().size == 1 || mGameEntity!!.isReservable)) { DetailDownloadUtils.detailInitDownload(detailViewHolder, true) } + + mBrowserInstallContainer.goneIf(!BrowserInstallHelper.shouldShowGameDetailUseBrowserToInstallHint()) + mBrowserInstallContainer.setOnClickListener { + val intent = ShellActivity.getIntent(requireContext(), ShellActivity.Type.SWITCH_INSTALL_METHOD, null) + requireActivity().startActivity(intent) + } + mBrowserInstallCloseIv.setOnClickListener { + DialogHelper.showRoundedCornerDialog( + requireContext(), + "温馨提示", + "关闭后将不再显示免密安装引导,您可以前往“ 我的光环-设置-切换安装方式”进行设置,或在“ 我的光环-帮助与反馈”查看相关问题", + "", + "确定", + "取消", + { + mBrowserInstallContainer.visibility = View.GONE + BrowserInstallHelper.hideGameDetailUseBrowserToInstallHint() + } + ) + } + DownloadManager.getInstance(context).addObserver(dataWatcher) } diff --git a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java index ffee1aade3..38cc15d24b 100644 --- a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java @@ -37,12 +37,14 @@ import com.gh.common.util.PermissionHelper; import com.gh.common.util.SPUtils; import com.gh.common.util.StringUtils; import com.gh.common.util.UsageStatsHelper; +import com.gh.download.server.BrowserInstallHelper; import com.gh.gamecenter.AboutActivity; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.CleanApkActivity; import com.gh.gamecenter.MainActivity; import com.gh.gamecenter.NetworkDiagnosisActivity; import com.gh.gamecenter.R; +import com.gh.gamecenter.ShellActivity; import com.gh.gamecenter.WebActivity; import com.gh.gamecenter.entity.LoginTokenEntity; import com.gh.gamecenter.eventbus.EBReuse; @@ -103,6 +105,10 @@ public class SettingsFragment extends NormalFragment { TextView mNotificationAuthorityTipsTv; @BindView(R.id.privacy_red_dot) View mPrivacyRedDotView; + @BindView(R.id.setting_rl_install_method) + View mSettingInstallMethodContainer; + @BindView(R.id.setting_install_method_tv) + TextView mSettingInstallMethodTv; public static final String AUTO_INSTALL_SP_KEY = "autoinstall"; public static final String CONCERN_GAME_SP_KEY = "concerngame"; @@ -225,6 +231,18 @@ public class SettingsFragment extends NormalFragment { mNotificationAuthorityTv.setCompoundDrawablesWithIntrinsicBounds(null, null, ContextCompat.getDrawable(requireContext(), R.drawable.answer_detail_more_answer_icon), null); } + if (BrowserInstallHelper.isUseBrowserToInstallEnabled()) { + if (BrowserInstallHelper.shouldUseBrowserToInstall()) { + mSettingInstallMethodTv.setText("浏览器安装"); + } else { + mSettingInstallMethodTv.setText("助手安装"); + } + mSettingInstallMethodContainer.setVisibility(View.VISIBLE); + mSettingInstallMethodContainer.setOnClickListener(v -> { + Intent intent = ShellActivity.getIntent(requireContext(), ShellActivity.Type.SWITCH_INSTALL_METHOD, null); + requireContext().startActivity(intent); + }); + } } private void initUsageStats() { diff --git a/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt b/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt new file mode 100644 index 0000000000..a0c022975e --- /dev/null +++ b/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt @@ -0,0 +1,53 @@ +package com.halo.assistant.fragment + +import android.os.Bundle +import android.view.View +import com.gh.common.constant.Constants +import com.gh.common.util.SPUtils +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.FragmentSwitchInstallMethodBinding +import com.gh.gamecenter.normal.NormalFragment + +class SwitchInstallMethodFragment : NormalFragment() { + + private var mBinding: FragmentSwitchInstallMethodBinding? = null + + override fun getLayoutId() = 0 + + override fun getInflatedLayout() = FragmentSwitchInstallMethodBinding.inflate(layoutInflater).apply { mBinding = this }.root + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + changeSwitch(SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) + + mBinding?.defaultContainer?.setOnClickListener { changeSwitch(false) } + mBinding?.browserContainer?.setOnClickListener { changeSwitch(true) } + mBinding?.toolbar?.normalTitle?.text = "切换安装方式" + mBinding?.toolbar?.normalToolbar?.setNavigationOnClickListener { requireActivity().finish() } + } + + private fun changeSwitch(useBrowserToInstall: Boolean) { + if (useBrowserToInstall) { + mBinding?.defaultInstallIv?.setImageResource(R.drawable.ic_install_method_select) + mBinding?.browserInstallIv?.setImageResource(R.drawable.ic_install_method_selected) + } else { + mBinding?.defaultInstallIv?.setImageResource(R.drawable.ic_install_method_selected) + mBinding?.browserInstallIv?.setImageResource(R.drawable.ic_install_method_select) + } + + if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL) != useBrowserToInstall) { + mBinding?.confirmBtn?.isEnabled = true + mBinding?.confirmBtn?.alpha = 1F + } else { + mBinding?.confirmBtn?.isEnabled = false + mBinding?.confirmBtn?.alpha = 0.4F + } + + mBinding?.confirmBtn?.setOnClickListener { + SPUtils.setBoolean(Constants.SP_USE_BROWSER_TO_INSTALL, useBrowserToInstall) + requireActivity().finish() + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xxxhdpi/ic_install_method_arrow.png b/app/src/main/res/drawable-xxxhdpi/ic_install_method_arrow.png new file mode 100644 index 0000000000..ac50d853ab Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_install_method_arrow.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_install_method_close.png b/app/src/main/res/drawable-xxxhdpi/ic_install_method_close.png new file mode 100644 index 0000000000..dec47ea919 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_install_method_close.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_install_method_hint.webp b/app/src/main/res/drawable-xxxhdpi/ic_install_method_hint.webp new file mode 100644 index 0000000000..14046b7456 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_install_method_hint.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_install_method_select.webp b/app/src/main/res/drawable-xxxhdpi/ic_install_method_select.webp new file mode 100644 index 0000000000..487c49b80d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_install_method_select.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_install_method_selected.png b/app/src/main/res/drawable-xxxhdpi/ic_install_method_selected.png new file mode 100644 index 0000000000..b0c1714923 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_install_method_selected.png differ diff --git a/app/src/main/res/layout/detail_download_item.xml b/app/src/main/res/layout/detail_download_item.xml index 30095d88d7..c86b0b14a1 100644 --- a/app/src/main/res/layout/detail_download_item.xml +++ b/app/src/main/res/layout/detail_download_item.xml @@ -11,16 +11,72 @@ android:visibility="gone" tools:visibility="visible"> - + android:layout_height="wrap_content"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 1ff2c49047..680f112a15 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -128,6 +128,8 @@ #26262B #1F1F23 #303030 + #F7F7F7 + #FFF6E6 #EBF5FF #3797FF #EFF7FF @@ -175,6 +177,7 @@ #C1BFC9 #FF5F14 #FFDAA2 + #F9A755 #FF9B06 #D8D8D8 #FAFAFA @@ -185,6 +188,7 @@ #50556B #979A9F #C2C6CC + #C0C0C0 #242529 #ebebeb #4BC7FF diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7c550a6cec..05367d3914 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -132,6 +132,7 @@ 一键修复 下载完成自动安装游戏 安装完成自动关注游戏 + 切换安装方式 非Wi-Fi环境播放视频提醒 非Wi-Fi环境下载游戏提醒 非Wi-Fi环境播放首页视频 diff --git a/dependencies.gradle b/dependencies.gradle index 8168e8028a..42d631c804 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -108,6 +108,7 @@ ext { zip4j = "2.6.1" whatTheStack = "0.1.0_rt" apkParser = "v2.6.10" + nanohttpd = "2.3.1" sentry = "3.2.0" } \ No newline at end of file