From 68ee926897e0acacabffbf718e37ab05baffa910 Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 3 Mar 2021 18:30:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=B5=8F=E8=A7=88=E5=99=A8=E4=B8=8B=E8=BD=BD=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E5=9F=8B=E7=82=B9=E7=BB=86=E8=8A=82=E5=BE=85?= =?UTF-8?q?=E8=A1=A5=E5=85=85=20https://git.ghzs.com/pm/halo-app-issues/-/?= =?UTF-8?q?issues/1132?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/constant/Config.java | 31 ++++ .../com/gh/common/constant/Constants.java | 3 + .../download/server/BrowserInstallHelper.kt | 27 +++- .../com/gh/download/server/DownloadServer.kt | 53 ++++++- .../java/com/gh/gamecenter/MainActivity.java | 4 +- .../gh/gamecenter/SplashScreenActivity.java | 4 - .../gh/gamecenter/entity/NewSettingsEntity.kt | 12 ++ .../gamedetail/GameDetailFragment.kt | 149 ++++++------------ .../retrofit/service/ApiService.java | 7 + .../fragment/SwitchInstallMethodFragment.kt | 36 +++++ .../ic_menu_gamedetail_copyright.webp | Bin 1246 -> 0 bytes .../ic_menu_gamedetail_feedback.webp | Bin 894 -> 0 bytes .../res/drawable-xxhdpi/icon_share_gray.webp | Bin 1564 -> 0 bytes .../res/layout/layout_gamedetail_more.xml | 111 ------------- app/src/main/res/values/strings.xml | 4 + 15 files changed, 226 insertions(+), 215 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/entity/NewSettingsEntity.kt delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_menu_gamedetail_copyright.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_menu_gamedetail_feedback.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/icon_share_gray.webp delete mode 100644 app/src/main/res/layout/layout_gamedetail_more.xml diff --git a/app/src/main/java/com/gh/common/constant/Config.java b/app/src/main/java/com/gh/common/constant/Config.java index 6b72d55217..9f4372390d 100644 --- a/app/src/main/java/com/gh/common/constant/Config.java +++ b/app/src/main/java/com/gh/common/constant/Config.java @@ -2,6 +2,7 @@ package com.gh.common.constant; import android.content.Context; import android.content.SharedPreferences; +import android.os.Build; import android.preference.PreferenceManager; import android.text.TextUtils; @@ -11,9 +12,11 @@ import com.gh.common.util.PackageUtils; import com.gh.common.util.SPUtils; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.SuggestionActivity; +import com.gh.gamecenter.entity.NewSettingsEntity; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.entity.SettingsEntity; import com.gh.gamecenter.eventbus.EBReuse; +import com.gh.gamecenter.retrofit.BiResponse; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.halo.assistant.HaloApp; @@ -61,6 +64,7 @@ public class Config { private static String SETTINGS_KEY = "settingsKey"; private static SettingsEntity mSettingsEntity; + private static NewSettingsEntity mNewSettingsEntity; public static final String FIX_DOWNLOAD_KEY = "isFixDownload"; public static final String FIX_PLUGIN_KEY = "isFixPlugin"; @@ -203,6 +207,21 @@ public class Config { return mSettingsEntity; } + @Nullable + public static NewSettingsEntity getNewSettingsEntity() { + if (mNewSettingsEntity == null) { + try { + String json = SPUtils.getString(Constants.SP_NEW_SETTINGS); + if (!TextUtils.isEmpty(json)) { + mNewSettingsEntity = GsonUtils.fromJson(json, NewSettingsEntity.class); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return mNewSettingsEntity; + } + private static boolean isExistDownloadFilter() { if (getSettings() == null || getSettings().getDownload() == null || getSettings().getDownload().size() == 0) { return false; @@ -278,5 +297,17 @@ public class Config { EventBus.getDefault().post(new EBReuse("Refresh")); } }); + + RetrofitManager.getInstance(HaloApp.getInstance().getApplication()) + .getApi().getNewSettings(Build.MANUFACTURER, Build.MODEL, channel) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BiResponse() { + @Override + public void onSuccess(NewSettingsEntity data) { + mNewSettingsEntity = data; + SPUtils.setString(Constants.SP_NEW_SETTINGS, data.toString()); + } + }); } } 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 0154ada354..fb9e791000 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -165,6 +165,9 @@ public class Constants { // 签到提醒开关 public static final String SP_SIGN_REMIND = "sign_remind"; + // 补充配置项 + public static final String SP_NEW_SETTINGS = "new_settings"; + //手机号码匹配规则 public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"; public static final String REGEX_ACCOUNT = "^[a-zA-Z_]\\w{5,17}$"; diff --git a/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt b/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt index 587df04697..0c6ae4244a 100644 --- a/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt +++ b/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt @@ -1,12 +1,14 @@ package com.gh.download.server import android.content.Context +import com.gh.common.constant.Config 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.gh.gamecenter.manager.PackagesManager import com.halo.assistant.HaloApp import com.lightgame.utils.Utils import java.io.File @@ -94,7 +96,30 @@ object BrowserInstallHelper { */ @JvmStatic fun isUseBrowserToInstallEnabled(): Boolean { - return true + // 如果已经手动设置了使用浏览器安装,那么后台开关强制为开,直到用户关闭才走下面的逻辑 + if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) { + return true + } + + val settingsEntity = Config.getNewSettingsEntity() + + if (settingsEntity == null) { + return false + } else { + if (settingsEntity.installModel.status == "matched") { + return true + } + + settingsEntity.installModel.packages?.let { + for (packageName in it) { + if (PackagesManager.isInstalled(packageName)) { + return true + } + } + } + + return false + } } fun onApkInstalled(path: String?) { diff --git a/app/src/main/java/com/gh/download/server/DownloadServer.kt b/app/src/main/java/com/gh/download/server/DownloadServer.kt index ebaafb41cc..d4b821b929 100644 --- a/app/src/main/java/com/gh/download/server/DownloadServer.kt +++ b/app/src/main/java/com/gh/download/server/DownloadServer.kt @@ -1,12 +1,33 @@ package com.gh.download.server +import com.gh.download.DownloadManager import com.halo.assistant.HaloApp import com.lightgame.download.FileUtils +import com.lightgame.utils.Utils import fi.iki.elonen.NanoHTTPD +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.schedulers.Schedulers +import io.reactivex.subjects.PublishSubject import java.io.File +import java.io.FileInputStream +import java.util.concurrent.TimeUnit class DownloadServer(port: Int) : NanoHTTPD(port) { + private val mPublishSubject: PublishSubject = PublishSubject.create() + private val mCompositeDisposable: CompositeDisposable = CompositeDisposable() + + init { + val disposable = mPublishSubject + .distinctUntilChanged() + .throttleWithTimeout(500, TimeUnit.MILLISECONDS) + .subscribeOn(Schedulers.io()) + .subscribe({ + logBrowserDownloadStart(it) + }, {}) + mCompositeDisposable.add(disposable) + } + override fun serve(fileName: String?, method: Method?, headers: MutableMap?, @@ -15,10 +36,12 @@ class DownloadServer(port: Int) : NanoHTTPD(port) { val filePath = FileUtils.getDownloadDir(HaloApp.getInstance()) + fileName + APK_SUFFIX val file = File(filePath) + mPublishSubject.onNext(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()) + newFixedLengthResponse(Response.Status.OK, fileType, DownloadFileInputStream(file), file.length()) } else { newFixedLengthResponse("找不到文件") } @@ -26,6 +49,34 @@ class DownloadServer(port: Int) : NanoHTTPD(port) { companion object { const val APK_SUFFIX = ".apk" + + fun logBrowserDownloadSuccess(path: String) { + for (download in DownloadManager.getInstance(HaloApp.getInstance()).allDownloadEntity) { + if (download.path == path) { + Utils.toast(HaloApp.getInstance().application, download.name + "浏览器下载完成") + break + } + } + } + + fun logBrowserDownloadStart(path: String) { + for (download in DownloadManager.getInstance(HaloApp.getInstance()).allDownloadEntity) { + if (download.path == path) { + Utils.toast(HaloApp.getInstance().application, download.name + "浏览器下载开始") + break + } + } + } } +} + +class DownloadFileInputStream(val file: File?) : FileInputStream(file) { + override fun read(b: ByteArray?, off: Int, len: Int): Int { + // 不为 BUFFER_LENGTH 的时候算是到尾了 + if (len != 16 * 1024) { + DownloadServer.logBrowserDownloadSuccess(file?.path ?: "") + } + return super.read(b, off, len) + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 5a7f9995e7..cc6615dd77 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -260,7 +260,9 @@ public class MainActivity extends BaseActivity { // 上传数据 DataCollectionManager.getInstance(getApplicationContext()).upload(); // 获取默认配置 - Config.getGhzsSettings(); + if (Config.getSettings() == null) { + Config.getGhzsSettings(); + } // 初始化PlatformUtils PlatformUtils.getInstance(getApplicationContext()); diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java index e033196bb8..44c4649c35 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java @@ -349,10 +349,6 @@ public class SplashScreenActivity extends BaseActivity { } } - private void getUniqueId() { - DataUtils.getGid(); - } - private void prefetchData() { AppExecutor.getIoExecutor().execute(() -> { Config.getGhzsSettings(); diff --git a/app/src/main/java/com/gh/gamecenter/entity/NewSettingsEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/NewSettingsEntity.kt new file mode 100644 index 0000000000..4287fc4b77 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/entity/NewSettingsEntity.kt @@ -0,0 +1,12 @@ +package com.gh.gamecenter.entity + +import com.google.gson.annotations.SerializedName + +data class NewSettingsEntity( + @SerializedName("install_model") + var installModel: InstallModel) { + data class InstallModel( + var status: String = "", + var packages: ArrayList? = arrayListOf() + ) +} \ No newline at end of file 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 416c0ca4ef..e9229be18d 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -2,12 +2,14 @@ package com.gh.gamecenter.gamedetail import android.annotation.SuppressLint import android.content.Intent -import android.graphics.drawable.ColorDrawable import android.os.Build import android.os.Bundle import android.text.TextUtils import android.view.* -import android.widget.* +import android.widget.CheckedTextView +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat @@ -18,7 +20,6 @@ import butterknife.BindView import butterknife.OnClick import com.ethanhua.skeleton.Skeleton import com.ethanhua.skeleton.ViewSkeletonScreen -import com.gh.base.BaseActivity import com.gh.base.adapter.FragmentAdapter import com.gh.base.fragment.BaseFragment_TabLayout import com.gh.common.constant.Constants @@ -35,9 +36,15 @@ 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.DownloadManagerActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.SearchActivity +import com.gh.gamecenter.ShellActivity import com.gh.gamecenter.adapter.viewholder.DetailViewHolder -import com.gh.gamecenter.entity.* +import com.gh.gamecenter.entity.GameDetailEntity +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.entity.GameUpdateEntity +import com.gh.gamecenter.entity.TagStyleEntity import com.gh.gamecenter.eventbus.EBConcernChanged import com.gh.gamecenter.eventbus.EBDownloadStatus import com.gh.gamecenter.eventbus.EBPackage @@ -54,7 +61,6 @@ import com.gh.gamecenter.home.video.ScrollCalculatorHelper import com.gh.gamecenter.mvvm.Status import com.gh.gamecenter.normal.NormalFragment import com.gh.gamecenter.packagehelper.PackageViewModel -import com.gh.gamecenter.suggest.SuggestType import com.gh.gamecenter.tag.TagsActivity import com.gh.gamecenter.user.UserViewModel import com.google.android.material.appbar.AppBarLayout @@ -667,49 +673,6 @@ class GameDetailFragment : NormalFragment() { mSkeleton?.hide() } - private fun showMoreMenuDialog() { - if (!isVisible) return - - val inflater = LayoutInflater.from(requireContext()) - val layout = inflater.inflate(R.layout.layout_gamedetail_more, null) - - ViewCompat.setElevation(layout, DisplayUtils.dip2px(2.0f).toFloat()) - - val popupWindow = PopupWindow( - layout, - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ) - popupWindow.apply { - setBackgroundDrawable(ColorDrawable(0)) - isTouchable = true - isFocusable = true - isOutsideTouchable = true - } - popupWindow.showAsDropDown(mDownloadMenuItem?.actionView, 0, 10) - - layout.findViewById(R.id.share_container).setOnClickListener { - share() - popupWindow.dismiss() - } - - layout.findViewById(R.id.feedback_container).setOnClickListener { - SuggestionActivity.startSuggestionActivity( - requireContext(), - SuggestType.gameQuestion, - mGameEntity!!.getGameCategory().toString(), - mGameEntity!!.name, - SimpleGameEntity(mGameEntity!!.id, mGameEntity!!.name!!)) - popupWindow.dismiss() - MtaHelper.onEvent("游戏详情_新", "问题反馈按钮", mViewModel.game?.name ?: "") - } - layout.findViewById(R.id.copyright_container).setOnClickListener { - requireContext().startActivity(WebActivity.getCopyrighyRulesIntent(requireContext())) - popupWindow.dismiss() - MtaHelper.onEvent("游戏详情_新", "版权申诉按钮", mViewModel.game?.name ?: "") - } - } - private fun initGameDetailTop() { mLoading.visibility = View.GONE mAppBarLayout.visibility = View.VISIBLE @@ -862,35 +825,6 @@ class GameDetailFragment : NormalFragment() { DisplayUtils.setLightStatusBar(requireActivity(), isToolbarWhite) } - private fun share() { - mNewGameDetailEntity?.let { - DataCollectionUtils.uploadClick(context, "分享", "游戏详情", mGameEntity!!.name) - -// GdtHelper.logAction(ActionType.SHARE, GdtHelper.CONTENT_TYPE, "GAME", GdtHelper.CONTENT_ID, mGameEntity!!.id) - - val url = if (isPublishEnv()) { - "http://m.ghzs666.com/game/" + mGameEntity?.id - } else { - "https://static-web.ghzs.com/gamestats-dev/index.html#/game/" + mGameEntity?.id - } - - if (activity is BaseActivity) { - var shareEntrance: ShareUtils.ShareEntrance = ShareUtils.ShareEntrance.game - val tagList = mGameEntity!!.getTag() - for (s in tagList) { - if ("官方版" != s) { - shareEntrance = ShareUtils.ShareEntrance.plugin - } - } - - (activity as BaseActivity).showShare(url, mGameEntity!!.icon, mGameEntity!!.name, - mGameEntity!!.brief, shareEntrance, mGameEntity?.id ?: "") - } - - MtaHelper.onEvent("游戏详情_新", "分享按钮", mGameEntity!!.name) - } - } - override fun onTouchEvent(event: MotionEvent) { when (event.action) { MotionEvent.ACTION_DOWN -> mIsTouchScreen = true @@ -1149,6 +1083,45 @@ class GameDetailFragment : NormalFragment() { } } + fun showBrowserInstallHintIfNeeded() { + if (BrowserInstallHelper.shouldShowGameDetailUseBrowserToInstallHint()) { + mBrowserInstallContainer.visibility = View.VISIBLE + mBrowserInstallContainer.setOnClickListener { + val intent = ShellActivity.getIntent(requireContext(), ShellActivity.Type.SWITCH_INSTALL_METHOD, null) + requireActivity().startActivity(intent) + } + val manufacturer = Build.MANUFACTURER.toUpperCase(Locale.CHINA) + var hintText = "" + var closeHintText = "" + + if (manufacturer == "OPPO" && manufacturer == "VIVO") { + hintText = "${manufacturer}手机如何解决安装需要密码" + closeHintText = "关闭后将不再显示免密安装引导,您可以前往“ 我的光环-设置-切换安装方式”进行设置,或在“ 我的光环-帮助与反馈”查看相关问题" + } else { + hintText = "手机如何解决无法安装问题" + closeHintText = "关闭后将不再显示切换安装方式引导,您可以前往“ 我的光环-设置-切换安装方式”进行设置" + } + + mBrowserInstallHintTv.text = hintText + mBrowserInstallCloseIv.setOnClickListener { + DialogHelper.showRoundedCornerDialog( + requireContext(), + "温馨提示", + closeHintText, + "", + "确定", + "取消", + { + mBrowserInstallContainer.visibility = View.GONE + BrowserInstallHelper.hideGameDetailUseBrowserToInstallHint() + } + ) + } + } else { + mBrowserInstallContainer.visibility = View.GONE + } + } + override fun onBackPressed(): Boolean { mOrientationUtils?.backToProtVideo() @@ -1175,25 +1148,7 @@ class GameDetailFragment : NormalFragment() { 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() - } - ) - } + showBrowserInstallHintIfNeeded() DownloadManager.getInstance(context).addObserver(dataWatcher) } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index 7ff661c223..156bc6e9af 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -46,6 +46,7 @@ import com.gh.gamecenter.entity.MessageFold; import com.gh.gamecenter.entity.MessageKeFuEntity; import com.gh.gamecenter.entity.MessageUnreadEntity; import com.gh.gamecenter.entity.MyVideoEntity; +import com.gh.gamecenter.entity.NewSettingsEntity; import com.gh.gamecenter.entity.NewsDetailEntity; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.entity.NotificationHint; @@ -1016,6 +1017,12 @@ public interface ApiService { @GET("settings") Observable getSettings(@Query("version") String version, @Query("channel") String channel); + /** + * 获取新的配置信息,因为旧的已经太大了避免冲突 + */ + @GET("new_settings") + Single getNewSettings(@Query("manufacture") String manufacture, @Query("model") String model, @Query("channel") String channel); + /** * 给一个回答新增评论 */ diff --git a/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt b/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt index a0c022975e..11ced77b1d 100644 --- a/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt +++ b/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt @@ -1,13 +1,21 @@ package com.halo.assistant.fragment +import android.os.Build import android.os.Bundle import android.view.View import com.gh.common.constant.Constants import com.gh.common.util.SPUtils +import com.gh.common.util.SpanBuilder +import com.gh.common.view.CustomLinkMovementMethod import com.gh.gamecenter.R +import com.gh.gamecenter.WebActivity import com.gh.gamecenter.databinding.FragmentSwitchInstallMethodBinding import com.gh.gamecenter.normal.NormalFragment +import java.util.* +/** + * 切换安装方式 + */ class SwitchInstallMethodFragment : NormalFragment() { private var mBinding: FragmentSwitchInstallMethodBinding? = null @@ -25,6 +33,34 @@ class SwitchInstallMethodFragment : NormalFragment() { mBinding?.browserContainer?.setOnClickListener { changeSwitch(true) } mBinding?.toolbar?.normalTitle?.text = "切换安装方式" mBinding?.toolbar?.normalToolbar?.setNavigationOnClickListener { requireActivity().finish() } + + val manufacturer = Build.MANUFACTURER.toUpperCase(Locale.CHINA) + + val defaultHintText: String + var browserHintText: CharSequence = "1.光环助手下载应用后,通过跳转默认浏览器安装已下载的应用(不会重复消耗流量),即可完成免密码安装2.内存较大的游戏在浏览器解压时间较长,需要等待片刻,您也可以通过浏览器的“下载记录”查看解压进度" + + if (manufacturer == "OPPO" || manufacturer == "VIVO") { + defaultHintText = "直接使用光环助手下载应用,但${manufacturer}手机自身安全性检测,下载后需要进行验证账户密码、指纹等解锁后安装" + + val clickableText: CharSequence = "可查看使用教程>" + browserHintText = "$browserHintText\n以上未能解决安装需要密码的,$clickableText" + browserHintText = SpanBuilder(browserHintText) + .click(browserHintText.length - clickableText.length, browserHintText.length , R.color.theme_font, true) { + val url = if (manufacturer == "OPPO") { + "https://static-web.ghzs.com/ghzs_help/help.html?content=5fa90fe143d91a022e0d33ff" + } else { + "https://static-web.ghzs.com/ghzs_help/help.html?content=5fc05a0033b5f008e04cdc4b" + } + requireContext().startActivity(WebActivity.getIntent(requireContext(), url, "安装问题", 1)) + } + .build() + } else { + defaultHintText = "直接使用光环助手下载应用,但部分手机可能存在无法安装的问题" + } + + mBinding?.defaultHintTv?.text = defaultHintText + mBinding?.browserHintTv?.text = browserHintText + mBinding?.browserHintTv?.movementMethod = CustomLinkMovementMethod.getInstance() } private fun changeSwitch(useBrowserToInstall: Boolean) { diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_gamedetail_copyright.webp b/app/src/main/res/drawable-xxhdpi/ic_menu_gamedetail_copyright.webp deleted file mode 100644 index 53dac6c7854b5df2ad02d17d9b3dab87fcfddc2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1246 zcmV<41R?uUNk&H21ONb6MM6+kP&il$0000G0000r001=r06|PpNDBf000AH5plu{c zTBqmP z+uh@~ZQHhO+jbA)r>7#vA2Uuy^nU`xf9Uw`od>BibH%jP?QR{AB1wxhg3CHl43C2(9DCbSx@0}588akDJQEFgbb8aGOPVN|5G&YbuT za8?&7ba45eG|pygOLbZ&4n9fXrnBK(0$)dyg-tiKj%&HZ@~-Ezui9c#=k|i0`oUb1cL62rE4g zKepey=X*%zh0Tat;K%c&%N`PLBkbseYkpFlAnXSXzx)i^4-(GPYnoj4(!_sD09H^q zAfy5S0Pqq3odGH~05$+VF%pPEq9Gv_3pYd{0|c~y3h{5_9a#BQeI?2H_W#LmFb&dJ z&OglQ1^>@VGrqeAJD>4F}SlsKD$FuoT_Z@lEa6Z4CO|0092~px*1l3seHyf>v4GaF)7W;R}&)MrWUCkoUUQY~cu)Z`XI$8y*df zfIjinxAfV4A$p@F0os6ctHoajP# zm>~@PP`h&gWiMK*t9yKD>i5itDjz7tI3-P`%x<=3w&p@`z#$U8fA#RIV_`#+NVU4S zRLA}w^(P!Zx6DoP0Ptsb$j&%7-?ySezv6$tqns9uui{(a!EXxZQ`)G8f~Rpxsv+^(Ko*1HEa|VTUq&hFUln#{e%5u`lJW zHM*=_flYi3%5KA})^O2!Om{#92VIe}UCAMLd-5FPD4vD%WFsX|mC$$(E>Wv90OcRQ zOw+Eo$=3q_(fz_nu87?ir1MsgOg^FollsGB!LVZ^U}LU6MNVNWhZSCIxqOu5=;whN z%D1btpoBV+L0X7DJwapm_g5Sa!x}p2f+#)+t0wu*kmZo5=E7ke&@$gpAgV`=hbJ^b zmNs%oX`wS)k|`=GBGU1Ki{_le+NQk9D0Yka|C;)G459-2JL%uU5WaBwJ9l!vPM}|u I-`p?&0O#~#&;S4c diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_gamedetail_feedback.webp b/app/src/main/res/drawable-xxhdpi/ic_menu_gamedetail_feedback.webp deleted file mode 100644 index 7ade404e721475e1ab3fcc2bccf5d6c45779cf20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 894 zcmV-^1A+WfNk&F?0{{S5MM6+kP&il$0000G0000r001=r06|PpNMQj000F1MxNRHB z!Ik9MC#y)A3JTKh`|0h8HzE*9;iMAa#VUIl`@A{QaSHom)Fz7e)$cG)wz5&iAPPFZ~ z&o*4df{o#^C8l%lP?5lv2Q4vv2nQ0p4rgM#0p4PW6_^-HUBgg9I^Y=FfO|{d+za$X z-!7cQ^%a1ksEZxLp6Khq>%6|q9c+od0oD7{&d;P%+l;EinwZPivB!z(pQ{=NWKP&gp&0RRB-4FH`1DmDN% z06sAkh(jVFArlI(U?2kow15im59dFC6UqN^{D9B3j%w5vU?0&x$$h|lC;w^X2jdT5 zf8zhjf7fsZe#Qr}3AzTm-ii$_!1iSLVUm8_5+|_cdaD9)2-LxJHNhX0xog5Me=+-eKS>U!|n% zZ&*+N@~r`gg3bw?YJq#vt~-@x@<+dSKm0N2!7Os6;i-iHAIAi*u`v~+^rrRvu+tq8 zf7OhKxIFoN_tcEd59;LVZ~Xd$0OGm%Xcv7I^!mg_ynp}jdHuta<Mt8=aR&)Yeayo=lXL#qc`Vo_jab+)3{KMizx3==%sh(}R?pmc&!Bl}*Ycq|$G-Mjz*08Z|_;Q#;t diff --git a/app/src/main/res/drawable-xxhdpi/icon_share_gray.webp b/app/src/main/res/drawable-xxhdpi/icon_share_gray.webp deleted file mode 100644 index 104a8bac48399063e3af4719a16fb19ce33429a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 zcmV+%2IKisNk&E#1^@t8MM6+kP&il$0000G0000r001=r06|PpNTvb+00BSbplu^T zdS_;rKj*#Y5E1$F7eR*h`Yd+KJG)MCY|>h&?J{jTVYtkUx2%g`nq2ZJ4-#$LHXZ4d zZQJ&%blJ9T+qU!8hbMVCd80odqW=>h|J9(J`qnPP&sHIIlSkjU8a7HFdBU@OvNmyR zUN4Rf8h$nj9ryvb?kC(2Q`?~OXWz;TkO zmx9@>;Q;ocMc;oP%qH(LKVU6Pd>MHFW|KEzXK)%OzKuKpv&oA|_(&J+)q8iZlh_{x~osh2*y$LbK$WEQ`gc+xJGX9t$7A3h_?@&xk4v2 z;@~q-;T{r{B2B)7MC1-i6&ASiS1N`>5s_&aRR}7M66J1~aB;w`g1+B1)VV}{L9Ttu z;3>pK=3&V`3os&Xb4@6)OX?4#yOUYiwaYeah{u#~sIf-_{A78O5qQn8L((%0h{c#2 zxQ_8%^f6q9T9K?b*a-Ah*dF{8iS;TcY{d8`Yz>^X;%z5zo$ibD6QD`F?{vaTjb8l+ z&?}l%Z@_MWPTnf;;Sk-d8-S%;@A8%b&N4+iX5<^-cC<9mQ*in4Ie>FAOnjI!YvTHO zwKG37G`n&7fva;aO?;d?|Ap7@GwEW(NXPV@m5Y&zV6kmnp`)d%-6+qBmH#SMP&gn+ z0{{RJ5&)e6DmDN%06r}eheDyD4t(!a3;|+VKm~B_i7&7jNB;Yqi~HvER}B7d{*Or8 z%P;R<3_ca=E&Sj8-=RnL{!G6a{-^&#+z0sA^N;rb-ajHfP(4(B#(N6>s2%92z@Osi zL|ksBewvQ6MC0W9yf0<7C|0j}QEEI7$@%092sDr0>rtp|+mF}tiy1@Djft_9E*j-v z0RI2v;w*^ny|Y4Xv(ypS>8(Q#FMnlW^wj^6^mTV43qd+#~a-2Y6xd3}Zd$#e{9ulz zd;s=uZ3s+vt+DPuN5!4x{az#5ocyQ;9^XY9^WlUfd;n7IFO#e5XQpGWRg45AC2$bB zJE7K+4>us#e zC$Zbbcm9T*NHXaenrEcQqzj$Fcj0L1<@#ad*ur2Bn>6snHd z1>cM3OL20rHmnTyT=VSTlo)$z0W(NAnn`Z&QWMZ}@d21M&LxR_vjqZ~30?tdNps#` zKR+K77rpS#`w`+LN8)tf!6KJa-L-`jc6M7aDOn;VZL4RlecynB%hzH*32uJekiKEY zV{~pzEPeN+yk0lF6%-N`olZ-VYa@$3If*w|Y2rSp*|!F^{o3F9BCX=B&sQY+;rxBt Op)anSSNNX9&;S6o^ZU#I diff --git a/app/src/main/res/layout/layout_gamedetail_more.xml b/app/src/main/res/layout/layout_gamedetail_more.xml deleted file mode 100644 index 1d1965e836..0000000000 --- a/app/src/main/res/layout/layout_gamedetail_more.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 05367d3914..263cb9729b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -133,6 +133,10 @@ 下载完成自动安装游戏 安装完成自动关注游戏 切换安装方式 + 1.光环助手下载应用后,通过跳转默认浏览器安装已下载的应用(不会重复消耗流量),即可完成免密码安装2.内存较大的游戏在浏览器解压时间较长,需要等待片刻,您也可以通过浏览器的“下载记录”查看解压进度 + 以上未能解决安装需要密码的,可查看使用教程> + 直接使用光环助手下载应用,但%s手机自身安全性检测,下载后需要进行验证账户密码、指纹等解锁后安装 + 直接使用光环助手下载应用,但部分手机可能存在无法安装的问题 非Wi-Fi环境播放视频提醒 非Wi-Fi环境下载游戏提醒 非Wi-Fi环境播放首页视频