From f70b7214416f19c0c1f3fb4aed7b5bdf54131c13 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 9 May 2022 10:20:20 +0800 Subject: [PATCH 1/7] =?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 2/7] =?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 3/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20XAPK=20=E5=9C=A8=20And?= =?UTF-8?q?roid=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 4/7] =?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 5/7] =?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 6/7] =?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 7/7] =?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)