From f70b7214416f19c0c1f3fb4aed7b5bdf54131c13 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 9 May 2022 10:20:20 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=87=B3=205.8.0-511?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 57d5237e78..c09dea897d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,7 +7,7 @@ ext { targetSdkVersion = 28 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 510 + versionCode = 511 versionName = "5.8.0" applicationId = "com.gh.gamecenter" From fd836137a5bf605f21a5aa90f3b8cdf15ec55b72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=8E=89=E4=B9=85?= Date: Wed, 11 May 2022 11:05:18 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=BC=80?= =?UTF-8?q?=E7=BD=91=E9=A1=B5=E4=BC=9A=E5=8F=98=E4=B8=BA=E6=A8=AA=E5=B1=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 ++- .../main/java/com/gh/gamecenter/WebActivity.kt | 3 --- app/src/main/res/values-v26/style.xml | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/values-v26/style.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 572576f652..e6ce35bccf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -165,7 +165,8 @@ android:screenOrientation="portrait" /> + android:name="com.gh.gamecenter.WebActivity" + android:screenOrientation="portrait"/> + + + \ No newline at end of file From bad10158bd0301818e9df400a4b658b1bcd8d402 Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 11 May 2022 14:21:47 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20XAPK=20=E5=9C=A8=20A?= =?UTF-8?q?ndroid=2012=20=E6=8E=88=E6=9D=83=E5=90=8E=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E8=A7=A3=E5=8E=8B=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dialog/InstallPermissionDialogFragment.kt | 23 +++++++------- .../com/gh/common/util/PackageInstaller.kt | 16 +++++++--- .../java/com/gh/gamecenter/MainActivity.java | 30 ++++++++++++++----- .../gh/gamecenter/SplashScreenActivity.java | 7 +++-- 4 files changed, 52 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt index 34bca83c83..b73da59329 100644 --- a/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt +++ b/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt @@ -19,6 +19,7 @@ import com.gh.common.util.PermissionHelper.INSTALL_PERMISSION_CODE import com.gh.common.xapk.XapkInstaller import com.gh.gamecenter.R import com.lightgame.download.DownloadEntity +import com.lightgame.utils.Utils import kotlin.random.Random class InstallPermissionDialogFragment : BaseTrackableDialogFragment() { @@ -26,7 +27,7 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() { lateinit var mView: View var isXapk = false var url: String = "" - var mCallBack: (() -> Unit)? = null + var mCallBack: ((isFromPermissionGrantedCallback: Boolean) -> Unit)? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { mView = inflater.inflate(R.layout.dialog_install_permission, null, false) @@ -56,7 +57,7 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() { closeTv.setOnClickListener { MtaHelper.onEvent(getEvent(), getKey(), "文案样式_点击以后再说") if (isXapk) { - mCallBack?.invoke() + mCallBack?.invoke(false) } dismiss() } @@ -77,9 +78,11 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == RESULT_OK && requestCode == INSTALL_PERMISSION_CODE) { - SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "") - SPUtils.setString(Constants.SP_XAPK_URL, "") - mCallBack?.invoke() + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "") + SPUtils.setString(Constants.SP_XAPK_URL, "") + } + mCallBack?.invoke(true) dismiss() } } @@ -90,27 +93,27 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() { companion object { @JvmStatic - fun show(activity: AppCompatActivity, downloadEntity: DownloadEntity, callBack: (() -> Unit)?) { + fun show(activity: AppCompatActivity, downloadEntity: DownloadEntity, callBack: ((isFromPermissionGrantedCallback: Boolean) -> Unit)?) { val isXapk = XapkInstaller.XAPK_EXTENSION_NAME == downloadEntity.path.getExtension() if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - callBack?.invoke() + callBack?.invoke(false) return } val haveInstallPermission = activity.packageManager.canRequestPackageInstalls() if (haveInstallPermission) { - callBack?.invoke() + callBack?.invoke(false) return } if (isXapk) { val xapkUnzipVersions = Config.getSettings()?.permissionPopupAppliedVersions?.xapkUnzip if (xapkUnzipVersions?.contains(Build.VERSION.SDK_INT.toString()) == false) { - callBack?.invoke() + callBack?.invoke(false) return } } else { val installVersions = Config.getSettings()?.permissionPopupAppliedVersions?.install if (installVersions?.contains(Build.VERSION.SDK_INT.toString()) == false) { - callBack?.invoke() + callBack?.invoke(false) return } } 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 b9aae9125e..69b22b6c14 100644 --- a/app/src/main/java/com/gh/common/util/PackageInstaller.kt +++ b/app/src/main/java/com/gh/common/util/PackageInstaller.kt @@ -53,15 +53,23 @@ object PackageInstaller { // TODO 此处可能遇到 activity 是 WXEntryActivity // TODO 当 activity 全部出栈,但是应用还在下载游戏,下载完会唤不起安装! if (currentActivity is AppCompatActivity && !currentActivity.isFinishing) { - InstallPermissionDialogFragment.show(currentActivity, downloadEntity) { + InstallPermissionDialogFragment.show(currentActivity, downloadEntity) { isFromPermissionGrantedCallback -> // 取消状态栏下载完成的通知,若存在 downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES" DownloadNotificationHelper.addOrUpdateDownloadNotification(downloadEntity) - if (isXapk) { - XapkInstaller.install(context, downloadEntity, showUnzipToast) + if (isFromPermissionGrantedCallback && Build.VERSION.SDK_INT >= 31) { + val pm = context.packageManager + val intent = pm.getLaunchIntentForPackage(context.packageName) + val mainIntent = Intent.makeRestartActivityTask(intent!!.component) + context.startActivity(mainIntent) + Runtime.getRuntime().exit(0) } else { - install(context, downloadEntity.isPlugin, downloadEntity.path) + if (isXapk) { + XapkInstaller.install(context, downloadEntity, showUnzipToast) + } else { + install(context, downloadEntity.isPlugin, downloadEntity.path) + } } } } diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 1f6e754ce6..17708e5ea2 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -295,11 +295,6 @@ public class MainActivity extends BaseActivity { checkDialog(); } -// handler.postDelayed(() -> { -// PushHelper.postPushClickAction(this.getApplicationContext(), null); -// }, 2000); - - // 耗时操作 AppExecutor.getIoExecutor().execute(() -> { // 上传数据 @@ -312,9 +307,6 @@ public class MainActivity extends BaseActivity { // 初始化PlatformUtils PlatformUtils.getInstance(getApplicationContext()); -// // 友盟记录启动 -// PushAgent.getInstance(this).onAppStart(); - HomePluggableHelper.activationFilterData(); }); @@ -336,6 +328,9 @@ public class MainActivity extends BaseActivity { postAttentionVideoRecord(); deleteSimulatorGame(); + // 检查是否需要触发 XAPK 安装 + AppExecutor.getUiExecutor().executeWithDelay(this::resumeXapkInstallIfNeeded, 150); + QuickLoginHelper.getPhoneInfo(this); WechatBindHelper.getWechatConfig(null); initWBSDK(); @@ -1033,4 +1028,23 @@ public class MainActivity extends BaseActivity { } } + /** + * 重新触发 XAPK 安装流程 + * 因为 Android 12 起授予应用安装未知应用权限以后不触发进程重启,导致应用一直无法读写 android/data 目录 + * 所以这里再手动重启应用进程时再触发一回安装 + */ + private void resumeXapkInstallIfNeeded() { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { + String xapkUrl = SPUtils.getString(Constants.SP_XAPK_URL); + if (!TextUtils.isEmpty(xapkUrl)) { + DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntityByUrl(xapkUrl); + if (downloadEntity != null) { + PackageInstaller.install(this, downloadEntity, false); + } + } + SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, ""); + SPUtils.setString(Constants.SP_XAPK_URL, ""); + } + } + } diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java index 82a88d201b..3519e0f959 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java @@ -5,6 +5,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.text.TextUtils; @@ -176,8 +177,10 @@ public class SplashScreenActivity extends BaseActivity { launchMainActivity(); } - SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, ""); - SPUtils.setString(Constants.SP_XAPK_URL, ""); + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, ""); + SPUtils.setString(Constants.SP_XAPK_URL, ""); + } } private void showPrivacyDialog(ViewPager guideLayout) { From 362e34be8a803f514690d89aadf320c9c3337165 Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 11 May 2022 15:06:08 +0800 Subject: [PATCH 04/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E8=BF=9B=E5=87=BA=E8=AE=BE=E7=BD=AE=E7=95=8C=E9=9D=A2=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E7=9A=84=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assistant/fragment/SettingsFragment.kt | 103 ++++++++++-------- 1 file changed, 58 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.kt b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.kt index 4d6cc03a70..176f2ce339 100644 --- a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.kt @@ -1,13 +1,17 @@ package com.halo.assistant.fragment import android.annotation.SuppressLint +import android.app.Application import android.app.Dialog +import android.content.Context import android.content.Intent import android.graphics.Color import android.os.Build import android.os.Bundle import android.provider.Settings import android.view.View +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModelProvider import com.airbnb.lottie.LottieAnimationView import com.gh.common.constant.Config @@ -51,6 +55,8 @@ class SettingsFragment : NormalFragment() { private var loadingDialog: Dialog? = null private var mUsageStatus = false + private val mViewModel: SettingViewModel by lazy { viewModelProvider() } + override fun getLayoutId() = 0 override fun getInflatedLayout() = FragmentSettingBinding.inflate(layoutInflater).apply { mBinding = this }.root @@ -94,13 +100,12 @@ class SettingsFragment : NormalFragment() { //判断隐私政策是否有更新 mBinding.privacyPolicyItem.redDot.visibility = if (checkPrivacyIsSame()) View.GONE else View.VISIBLE - runOnIoThread { - val cacheSize = getCacheSize() - runOnUiThread { - mBinding.cacheItem.contentTv.text = cacheSize - } + mViewModel.cacheSizeLiveData.observe(this) { + mBinding.cacheItem.contentTv.text = it } + mViewModel.getCacheSize() + mBinding.personalRecommendItem.switchLottie.setSwitchAnimation(SPUtils.getBoolean(PERSONAL_RECOMMEND_SP_KEY, true)) checkSizeIndex = SPUtils.getInt(FONT_SIZE_SP_KEY, 1) @@ -377,7 +382,7 @@ class SettingsFragment : NormalFragment() { if (loadingDialog != null) { loadingDialog!!.dismiss() } - mBinding.cacheItem.contentTv.text = getCacheSize() + mViewModel.getCacheSize() Utils.toast(context, "缓存清除成功") } @@ -446,45 +451,6 @@ class SettingsFragment : NormalFragment() { return currentMd5 == privacyMd5 } - // 获取缓存大小 - private fun getCacheSize(): String { - val ecDir = requireContext().externalCacheDir - var cacheLength: Long = getFolderSize(requireContext().cacheDir) - if (ecDir != null) { - cacheLength += getFolderSize(ecDir) - } - return long2Size(cacheLength) - } - - private fun getFolderSize(folder: File): Long { - var size: Long = 0 - //忽略视频缓存 - if (folder.name == "video-cache" || folder.name == "exo") return size - size += folder.length() - if (folder.isDirectory) { - val files = folder.listFiles() - if (files == null || files.isEmpty()) return size - for (file in files) { - size += if (file.isDirectory) { - getFolderSize(file) - } else { - file.length() - } - } - } - return size - } - - private fun long2Size(length: Long): String { - val m = length / 1024f / 1024f - var str = m.toString() - val index = str.lastIndexOf(".") - if (index != -1 && str.length > index + 3) { - str = str.substring(0, index + 3) - } - return str + "M" - } - companion object { const val AUTO_INSTALL_SP_KEY = "autoinstall" const val CONCERN_GAME_SP_KEY = "concerngame" @@ -494,4 +460,51 @@ class SettingsFragment : NormalFragment() { const val INSERT_MOBILE_CODE = 411 } + + class SettingViewModel(application: Application): AndroidViewModel(application) { + val cacheSizeLiveData = MutableLiveData() + + // 获取缓存大小 + fun getCacheSize() { + runOnIoThread { + val ecDir = getApplication().externalCacheDir + var cacheLength: Long = getFolderSize(getApplication().cacheDir) + if (ecDir != null) { + cacheLength += getFolderSize(ecDir) + } + cacheSizeLiveData.postValue(long2Size(cacheLength)) + } + } + + private fun long2Size(length: Long): String { + val m = length / 1024f / 1024f + var str = m.toString() + val index = str.lastIndexOf(".") + if (index != -1 && str.length > index + 3) { + str = str.substring(0, index + 3) + } + return str + "M" + } + + private fun getFolderSize(folder: File): Long { + var size: Long = 0 + //忽略视频缓存 + if (folder.name == "video-cache" || folder.name == "exo") return size + size += folder.length() + if (folder.isDirectory) { + val files = folder.listFiles() + if (files == null || files.isEmpty()) return size + for (file in files) { + size += if (file.isDirectory) { + getFolderSize(file) + } else { + file.length() + } + } + } + return size + } + + } + } \ No newline at end of file From 090a567887bba44d5a6c3be9f05e2d6abe83de1d Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 11 May 2022 15:09:05 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=87=B3=205.8.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index c09dea897d..038a1c1e3d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 28 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 511 - versionName = "5.8.0" + versionCode = 512 + versionName = "5.8.1" applicationId = "com.gh.gamecenter" // AndroidX From 10cbcdd76844060365ef175268a7217e86ee4cb7 Mon Sep 17 00:00:00 2001 From: leafwai Date: Fri, 13 May 2022 14:12:51 +0800 Subject: [PATCH 06/16] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8Bv5.10.0=E3=80=91=E5=89=8D=E7=AB=AF=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=B1=87=E6=80=BB5=E6=9C=88=E7=AC=AC3=E5=91=A8(1)=20https://gi?= =?UTF-8?q?t.shanqu.cc/pm/halo-app-issues/-/issues/1858?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forum/search/ForumContentSearchListAdapter.kt | 10 +++++----- app/src/main/res/layout/forum_search_content_list.xml | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt index c6f3eaad56..3d49299194 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt @@ -195,15 +195,15 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC timeTv.text = TimeUtils.getFormatTime(answer.time ?: 0, "yyyy-MM-dd") } if (answer.type == "question") { - forumSearchHolder.binding.content.visibility = View.GONE + forumSearchHolder.binding.contentTv.visibility = View.GONE val title = answer.questions.title ?: "" val spannableStringBuilder = SpannableStringBuilder(" ") spannableStringBuilder.setSpan(CenterImageSpan(mContext, R.drawable.ic_ask_label), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) spannableStringBuilder.append(title.fromHtml()) - forumSearchHolder.binding.title.text = spannableStringBuilder + forumSearchHolder.binding.titleTv.text = spannableStringBuilder } else { - forumSearchHolder.binding.content.visibility = View.VISIBLE - forumSearchHolder.binding.title.text = answer.questions.title?.fromHtml() + forumSearchHolder.binding.contentTv.visibility = View.VISIBLE + forumSearchHolder.binding.titleTv.text = answer.questions.title?.fromHtml() } when { answer.getPassVideos().isNotEmpty() -> { @@ -220,7 +220,7 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC } } - forumSearchHolder.binding.content.text = answer.brief?.fromHtml() + forumSearchHolder.binding.contentTv.text = answer.brief?.fromHtml() forumSearchHolder.itemView.setOnClickListener { val bbsType = if (answer.bbs.type == "official_bbs") "综合论坛" else "游戏论坛" when (answer.type) { diff --git a/app/src/main/res/layout/forum_search_content_list.xml b/app/src/main/res/layout/forum_search_content_list.xml index 60caa9d8ee..00c853b824 100644 --- a/app/src/main/res/layout/forum_search_content_list.xml +++ b/app/src/main/res/layout/forum_search_content_list.xml @@ -25,7 +25,7 @@ android:layout_height="wrap_content"> Date: Tue, 17 May 2022 14:29:15 +0800 Subject: [PATCH 07/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E5=BA=93=E6=A8=AA=E5=90=91=E6=BB=91=E5=8A=A8=E4=B8=93=E9=A2=98?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E4=B8=BA=E7=A9=BA=E6=97=B6=E4=BC=9A=E9=97=AA?= =?UTF-8?q?=E9=80=80=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/horizontal/GameHorizontalSlideListViewHolder.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideListViewHolder.kt b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideListViewHolder.kt index 7726ca6be9..d5e3366e99 100644 --- a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideListViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideListViewHolder.kt @@ -36,7 +36,7 @@ class GameHorizontalSlideListViewHolder(val binding: GameHorizontalListBinding) binding.horizontalRv.setScrollingTouchSlop(RecyclerView.TOUCH_SLOP_PAGING) binding.horizontalRv.isNestedScrollingEnabled = false - if (subjectEntity.data?.first()?.test?.testTime != null && mLastScrolledPosition == 0) { + if (subjectEntity.data?.firstOrNull()?.test?.testTime != null && mLastScrolledPosition == 0) { scrollToSpecificItemForTheFirstTime(subjectEntity) } } else { @@ -46,7 +46,7 @@ class GameHorizontalSlideListViewHolder(val binding: GameHorizontalListBinding) if (mLastScrolledPosition != adapterPosition) { val offset = offsetable.getOffset(adapterPosition) if (offset == 0) { - if (subjectEntity.data?.first()?.test?.testTime != null && mLastScrolledPosition == 0) { + if (subjectEntity.data?.firstOrNull()?.test?.testTime != null && mLastScrolledPosition == 0) { scrollToSpecificItemForTheFirstTime(subjectEntity) } else { binding.horizontalRv.scrollToPosition(0) From c2e02d356d16540b8a061ef7c956e5df0f02eb27 Mon Sep 17 00:00:00 2001 From: leafwai Date: Wed, 18 May 2022 11:09:23 +0800 Subject: [PATCH 08/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E5=8D=95=E5=AE=89=E5=88=A9=E5=A2=99=E8=BD=AE=E6=92=AD=E5=8F=91?= =?UTF-8?q?=E7=94=9F=E7=9A=84=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../square/GameCollectionAmwayViewHolder.kt | 54 ++++++++++++------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayViewHolder.kt index bb603356fb..f581aed995 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionAmwayViewHolder.kt @@ -3,6 +3,9 @@ package com.gh.gamecenter.gamecollection.square import android.animation.Animator import android.animation.TimeInterpolator import android.animation.ValueAnimator +import android.os.Handler +import android.os.Looper +import android.os.Message import android.view.animation.AccelerateDecelerateInterpolator import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 @@ -13,20 +16,10 @@ import com.gh.gamecenter.entity.AmwayCommentEntity import java.lang.ref.WeakReference class GameCollectionAmwayViewHolder(var binding: GameCollectionSquareAmwayItemBinding) : RecyclerView.ViewHolder(binding.root) { - val mAdapter = GameCollectionAmwayAdapter(binding.root.context) - private val mLoopTask = object : Runnable { - private val reference: WeakReference = WeakReference(binding.amwayVp) - override fun run() { - val vp: ViewPager2? = reference.get() - if (vp != null) { - val count = mAdapter.itemCount - if (count == 0) return - val next = vp.currentItem + 1 - vp.setCurrentItem(next, 1000) - vp.postDelayed(this, AMWAY_LOOP_TIME) - } - } - } + + private val mAdapter = GameCollectionAmwayAdapter(binding.root.context) + private val mLooperHandle = LooperHandle(this) + private val mSlideLooperKey = 333 fun bindAmway(amwayList: List) { mAdapter.setAmwayList(amwayList) @@ -35,7 +28,7 @@ class GameCollectionAmwayViewHolder(var binding: GameCollectionSquareAmwayItemBi isUserInputEnabled = false adapter = mAdapter orientation = ViewPager2.ORIENTATION_VERTICAL - postDelayed(mLoopTask, AMWAY_LOOP_TIME) + startAutoPlay() } binding.root.setOnClickListener { NewLogUtils.logClickGameCollectionAmway() @@ -44,13 +37,20 @@ class GameCollectionAmwayViewHolder(var binding: GameCollectionSquareAmwayItemBi } } - fun start() { - stop() - binding.amwayVp.postDelayed(mLoopTask, AMWAY_LOOP_TIME) + private fun scrollToNextPage() { + if (mAdapter.getRealCount() == 0) return + val next = binding.amwayVp.currentItem + 1 + binding.amwayVp.setCurrentItem(next, 1000) } - fun stop() { - binding.amwayVp.removeCallbacks(mLoopTask) + private fun startAutoPlay() { + if (mAdapter.getRealCount() <= 1) return + stopAutoPlay() + mLooperHandle.sendEmptyMessageDelayed(mSlideLooperKey, AMWAY_LOOP_TIME) + } + + private fun stopAutoPlay() { + mLooperHandle.removeMessages(mSlideLooperKey) } fun ViewPager2.setCurrentItem( @@ -83,4 +83,18 @@ class GameCollectionAmwayViewHolder(var binding: GameCollectionSquareAmwayItemBi // 安利墙卡片轮播时间 const val AMWAY_LOOP_TIME = 5000L } + + class LooperHandle(viewHolder: GameCollectionAmwayViewHolder): Handler( + Looper.getMainLooper()) { + private val mWeakReference: WeakReference = WeakReference(viewHolder) + + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val viewHolder = mWeakReference.get() + if (viewHolder != null && msg.what == viewHolder.mSlideLooperKey) { + viewHolder.scrollToNextPage() + viewHolder.startAutoPlay() + } + } + } } \ No newline at end of file From 4819bf3ddfe0f8c62a73f7a1f2ced23cdad7c174 Mon Sep 17 00:00:00 2001 From: leafwai Date: Wed, 18 May 2022 11:15:12 +0800 Subject: [PATCH 09/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=8E=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E9=A1=B5=E9=9D=A2=E8=BF=94=E5=9B=9E=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=8F=E5=8F=98=E6=88=90=E6=B7=B1=E8=89=B2?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/fragment/SearchToolbarFragment.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java index 1196246e9b..9b17291db5 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java @@ -400,12 +400,13 @@ public class SearchToolbarFragment extends BaseLazyFragment implements View.OnCl private void updateSearchToolbar() { if (getParentFragment() instanceof SearchToolWrapperFragment) { + if (getParentFragment() instanceof HomeSearchToolWrapperFragment) { + mContainer.setBackground(null); + return; + } updateStyle(mNightMode); updateSearchToolbarColor(ContextCompat.getColor(requireContext(), R.color.background_white)); } - if (getParentFragment() instanceof HomeSearchToolWrapperFragment) { - mContainer.setBackground(null); - } } @Override From 7bc6655b99861931482af437056370f9344a7a15 Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 18 May 2022 15:12:24 +0800 Subject: [PATCH 10/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=89=B9=E6=AE=8A?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E4=B8=8B=20fragment=20=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=97=B6=E7=9A=84=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/base/fragment/BaseFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/base/fragment/BaseFragment.java b/app/src/main/java/com/gh/base/fragment/BaseFragment.java index 693d005414..e4a3424913 100644 --- a/app/src/main/java/com/gh/base/fragment/BaseFragment.java +++ b/app/src/main/java/com/gh/base/fragment/BaseFragment.java @@ -330,7 +330,9 @@ public abstract class BaseFragment extends Fragment implements OnRequestCallB // 为 fragment 附加 bundle (setArgument()) public BaseFragment with(Bundle bundle) { - this.setArguments(bundle); + if (!isStateSaved()) { + this.setArguments(bundle); + } return this; } From 4263f53315d0a7b151bcdd5bf19c4316ff76680c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=8E=89=E4=B9=85?= Date: Wed, 18 May 2022 11:45:25 +0800 Subject: [PATCH 11/16] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8Bv5.10.0=E3=80=91=E5=89=8D=E7=AB=AF=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=B1=87=E6=80=BB5=E6=9C=88=E7=AC=AC3=E5=91=A8(6)=20https://gi?= =?UTF-8?q?t.shanqu.cc/pm/halo-app-issues/-/issues/1858?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/layout/fragment_comment_dark.xml | 2 +- .../res/layout/fragment_list_normal_base.xml | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/layout/fragment_list_normal_base.xml diff --git a/app/src/main/res/layout/fragment_comment_dark.xml b/app/src/main/res/layout/fragment_comment_dark.xml index 86e3339329..26cc04349e 100644 --- a/app/src/main/res/layout/fragment_comment_dark.xml +++ b/app/src/main/res/layout/fragment_comment_dark.xml @@ -41,7 +41,7 @@ + + + + + + + + + + + + + + \ No newline at end of file From e1d82e7fbda5e34b29bae9c2cd00fada043259eb Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 18 May 2022 16:21:44 +0800 Subject: [PATCH 12/16] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=87=B3=205.9.0-531?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index cda040ed5b..a6c96adc32 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,7 +7,7 @@ ext { targetSdkVersion = 28 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 530 + versionCode = 531 versionName = "5.9.0" applicationId = "com.gh.gamecenter" From b02f650a34a764600b33a355eb63b6c18dea9ff6 Mon Sep 17 00:00:00 2001 From: leafwai Date: Thu, 19 May 2022 11:07:35 +0800 Subject: [PATCH 13/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E6=9C=AA=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E6=97=A5=E5=A4=9C=E9=97=B4=E6=A8=A1=E5=BC=8F=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/gamecenter/home/HomeFragment.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt index 174ba6f2aa..9035ebc559 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt @@ -325,11 +325,12 @@ class HomeFragment : LazyFragment() { override fun onNightModeChange() { super.onNightModeChange() - mBinding.gameList.setBackgroundColor(R.color.background_white.toColor(requireContext())) - mBinding.gameList.recycledViewPool.clear() - mListAdapter.notifyItemRangeChanged(0, mListAdapter.itemCount) - if (isSupportVisible) { - onScrollChanged() + if (::mBinding.isInitialized) { + mBinding.gameList.recycledViewPool.clear() + if (::mListAdapter.isInitialized) mListAdapter.notifyItemRangeChanged(0, mListAdapter.itemCount) + if (isSupportVisible) { + onScrollChanged() + } } } } \ No newline at end of file From 677511b11943431a80ccadae0985c86d2e780ea2 Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 19 May 2022 11:46:56 +0800 Subject: [PATCH 14/16] =?UTF-8?q?=E5=85=B3=E9=97=AD=E9=81=97=E6=BC=8F?= =?UTF-8?q?=E7=9A=84=E5=A4=9C=E9=97=B4=E6=A8=A1=E5=BC=8F=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/base/BaseActivity.java | 4 +++- app/src/main/java/com/gh/base/fragment/BaseFragment.java | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gh/base/BaseActivity.java b/app/src/main/java/com/gh/base/BaseActivity.java index 8945d5a1ff..99542d35d2 100644 --- a/app/src/main/java/com/gh/base/BaseActivity.java +++ b/app/src/main/java/com/gh/base/BaseActivity.java @@ -179,7 +179,9 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy super.onResume(); startPageTime = System.currentTimeMillis(); - if (!NightModeUtils.INSTANCE.getSystemMode() && mNightMode != NightModeUtils.INSTANCE.isNightMode(this)) { + if (BuildConfig.IS_NIGHT_MODE_ON + && !NightModeUtils.INSTANCE.getSystemMode() + && mNightMode != NightModeUtils.INSTANCE.isNightMode(this)) { onNightModeChange(); } } diff --git a/app/src/main/java/com/gh/base/fragment/BaseFragment.java b/app/src/main/java/com/gh/base/fragment/BaseFragment.java index e4a3424913..90063f73c8 100644 --- a/app/src/main/java/com/gh/base/fragment/BaseFragment.java +++ b/app/src/main/java/com/gh/base/fragment/BaseFragment.java @@ -242,7 +242,9 @@ public abstract class BaseFragment extends Fragment implements OnRequestCallB isEverPause = false; startPageTime = System.currentTimeMillis(); - if (!NightModeUtils.INSTANCE.getSystemMode() && mNightMode != NightModeUtils.INSTANCE.isNightMode(requireContext())) { + if (BuildConfig.IS_NIGHT_MODE_ON + && !NightModeUtils.INSTANCE.getSystemMode() + && mNightMode != NightModeUtils.INSTANCE.isNightMode(requireContext())) { onNightModeChange(); } } @@ -352,7 +354,9 @@ public abstract class BaseFragment extends Fragment implements OnRequestCallB @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); - onNightModeChange(); + if (BuildConfig.IS_NIGHT_MODE_ON) { + onNightModeChange(); + } } protected void onNightModeChange() { From 6a5f7f82847b2f85521c245c15757c6dd1aba663 Mon Sep 17 00:00:00 2001 From: juntao Date: Sat, 21 May 2022 15:56:32 +0800 Subject: [PATCH 15/16] =?UTF-8?q?=E3=80=90=E5=90=88=E8=A7=84=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E3=80=91=E5=8D=95=E6=9C=BA=E6=B8=B8=E6=88=8F=E5=86=85?= =?UTF-8?q?=E5=AE=9E=E5=90=8D=E6=A0=A1=E9=AA=8C=E5=8A=9F=E8=83=BD=EF=BC=88?= =?UTF-8?q?3=EF=BC=89=20https://git.shanqu.cc/pm/halo-app-issues/-/issues/?= =?UTF-8?q?1865?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/databind/BindingAdapters.java | 1 + .../common/simulator/SimulatorDownloadManager.kt | 3 +++ .../com/gh/common/util/DetailDownloadUtils.java | 1 + .../gh/common/util/DownloadNotificationHelper.kt | 1 + .../java/com/gh/common/util/DownloadObserver.kt | 15 ++++++++++++++- .../java/com/gh/download/DownloadDataHelper.kt | 2 ++ libraries/LGLibrary | 2 +- 7 files changed, 23 insertions(+), 2 deletions(-) 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 378758e7e4..ceaa848046 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -580,6 +580,7 @@ public class BindingAdapters { case notfound: case uncertificated: case unqualified: + case unavailable: break; default: break; diff --git a/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt b/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt index aad6f8f14f..fbcb4eb049 100644 --- a/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt +++ b/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt @@ -91,6 +91,9 @@ class SimulatorDownloadManager private constructor() { DownloadStatus.unqualified == downloadEntity.status -> { ToastUtils.showToast("未成年人暂不允许在此时间下载游戏") } + DownloadStatus.unavailable == downloadEntity.status -> { + ToastUtils.showToast("该游戏未接入防沉迷系统,暂不支持下载") + } DownloadStatus.hijack == downloadEntity.status -> { ToastUtils.showToast("网络劫持,请稍后重试") } diff --git a/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java b/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java index 57b6d62e86..a6b2704e46 100644 --- a/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java +++ b/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java @@ -200,6 +200,7 @@ public class DetailDownloadUtils { case notfound: case uncertificated: case unqualified: + case unavailable: detailInitDownload(viewHolder, false); break; default: 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 4c273fb5c9..eacdb1abb6 100644 --- a/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt +++ b/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt @@ -112,6 +112,7 @@ object DownloadNotificationHelper { || entity.status == DownloadStatus.cancel || entity.status == DownloadStatus.hijack || entity.status == DownloadStatus.unqualified + || entity.status == DownloadStatus.unavailable || entity.status == DownloadStatus.uncertificated || entity.status == DownloadStatus.notfound || entity.status == DownloadStatus.overflow 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 c4abed9f94..fd203ee695 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -36,7 +36,6 @@ import okhttp3.MediaType import okhttp3.RequestBody import org.greenrobot.eventbus.EventBus import org.json.JSONObject -import java.util.* object DownloadObserver { @@ -109,6 +108,20 @@ object DownloadObserver { // 未成年 RealNameHelper.showRealNameUnqualifiedDialog(downloadEntity) + // 删除任务 + downloadEntity.status = DownloadStatus.cancel + downloadManager.cancel(downloadEntity.url) + } else if (DownloadStatus.unavailable == downloadEntity.status) { + // 未接入防沉迷系统 + val currentActivity = AppManager.getInstance().currentActivity() ?: return + + DialogHelper.showDialog( + context = currentActivity, + title = "温馨提示", + content = "该游戏未接入防沉迷系统,暂不支持下载", + confirmText = "知道了", + cancelText = "") + // 删除任务 downloadEntity.status = DownloadStatus.cancel downloadManager.cancel(downloadEntity.url) diff --git a/app/src/main/java/com/gh/download/DownloadDataHelper.kt b/app/src/main/java/com/gh/download/DownloadDataHelper.kt index 2f5cc6064f..4139c37dd7 100644 --- a/app/src/main/java/com/gh/download/DownloadDataHelper.kt +++ b/app/src/main/java/com/gh/download/DownloadDataHelper.kt @@ -82,6 +82,8 @@ object DownloadDataHelper { "未实名" } else if (status == DownloadStatus.unqualified) { "未成年" + } else if (status == DownloadStatus.unavailable) { + "未接入防沉迷系统,暂不支持下载" } else if (status == DownloadStatus.redirected) { "重定向至最终地址" } else { diff --git a/libraries/LGLibrary b/libraries/LGLibrary index 87ea0fecbb..692d58bc9b 160000 --- a/libraries/LGLibrary +++ b/libraries/LGLibrary @@ -1 +1 @@ -Subproject commit 87ea0fecbba4e6d9b5ed2edd9279d856cb698aed +Subproject commit 692d58bc9b494bf1d04db7809d43acbedaeb326c From d12a1037a20d0060a89c6bc5048ba75d5ebc54f1 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 24 May 2022 17:51:10 +0800 Subject: [PATCH 16/16] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=87=B3=205.9.0-532?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index a6c96adc32..2262536bb0 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,7 +7,7 @@ ext { targetSdkVersion = 28 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 531 + versionCode = 532 versionName = "5.9.0" applicationId = "com.gh.gamecenter"