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 53dac6c785..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_menu_gamedetail_copyright.webp and /dev/null differ 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 7ade404e72..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_menu_gamedetail_feedback.webp and /dev/null differ 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 104a8bac48..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/icon_share_gray.webp and /dev/null differ 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环境播放首页视频