From 385d197e31739b0f6d07b1c8b0c74f6a6f84ad9a Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 31 Jul 2023 09:50:14 +0800 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20=E7=89=88=E6=9C=AC=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E8=87=B3=205.29.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 4504d07d8d..b6f40a9630 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 28 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 930 - versionName = "5.29.0" + versionCode = 931 + versionName = "5.29.1" applicationId = "com.gh.gamecenter" // AndroidX From 18276c59418372e7e7fb13c70f75193856c6d621 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Mon, 31 Jul 2023 10:28:15 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=9A=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B=E5=88=9D=E5=A7=8B=E5=8C=96=E4=B8=8B=E8=BD=BD=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=87=BA=E7=8E=B0=E7=9A=84=E9=97=AA=E9=80=80?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20https://sentry.shanqu.cc/organizations/lig?= =?UTF-8?q?htgame/issues/295121/events/7dc71a556b3242ab94054454e99a92a3/?= =?UTF-8?q?=3Fproject=3D22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/halo/assistant/HaloApp.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index ccf0e0ba67..fb42367e96 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -231,15 +231,16 @@ public class HaloApp extends MultiDexApplication { AppExecutor.getIoExecutor().execute(() -> { initDataHelper(); - ExtensionsKt.doOnMainProcessOnly(this, () -> Tracker.init(this)); + ExtensionsKt.doOnMainProcessOnly(this, () -> { + Tracker.init(this); + DownloadDbManager.init(this); + }); deviceRamSize = DeviceUtils.getTotalRamSizeOfDevice(this); mChannel = mFlavorProvider.getChannelStr(this); // 异步初始化 SP SPUtils.getString(""); - - DownloadDbManager.init(this); }); RxJavaPlugins.setIoSchedulerHandler(scheduler -> AppExecutor.INSTANCE.getCachedScheduler()); From 9f144a638b8c9f4754c955dc64ffafc2dc3feb7e Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Mon, 31 Jul 2023 14:28:15 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=95=85=E7=8E=A9=E6=95=B0=E6=8D=AE=E5=BA=93=20observeForever?= =?UTF-8?q?=20=E5=AF=BC=E8=87=B4=E7=9A=84=E6=95=B0=E6=8D=AE=E9=94=99?= =?UTF-8?q?=E4=B9=B1=E5=92=8C=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 --- .../CloudArchiveManagerViewModel.kt | 2 +- .../main/java/com/gh/vspace/VArchiveHelper.kt | 51 +++++++++++++------ .../com/gh/vspace/VDownloadManagerFragment.kt | 2 +- app/src/main/java/com/gh/vspace/VHelper.kt | 40 ++++++++------- .../main/java/com/gh/vspace/db/VArchiveDao.kt | 5 +- .../main/java/com/gh/vspace/db/VGameDao.kt | 6 --- 6 files changed, 60 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerViewModel.kt b/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerViewModel.kt index 1250858cce..4f2f8416d1 100644 --- a/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerViewModel.kt @@ -68,7 +68,7 @@ class CloudArchiveManagerViewModel( override fun provideDataSingle(page: Int): Single>? { return if (mType == MyArchiveFragment.Type.MY_DOWNLOAD_ARCHIVE) { Single.create { emitter -> - val downloadList = VArchiveHelper.vArchiveEntityListLiveData.value + val downloadList = VArchiveHelper.vArchiveDao.getAll() val archiveEntityList = arrayListOf() if (downloadList != null) { for (vArchiveEntity in downloadList) { diff --git a/app/src/main/java/com/gh/vspace/VArchiveHelper.kt b/app/src/main/java/com/gh/vspace/VArchiveHelper.kt index 926245ca51..4d6741b4f0 100644 --- a/app/src/main/java/com/gh/vspace/VArchiveHelper.kt +++ b/app/src/main/java/com/gh/vspace/VArchiveHelper.kt @@ -1,6 +1,7 @@ package com.gh.vspace import android.content.Context +import android.database.sqlite.SQLiteDiskIOException import androidx.annotation.WorkerThread import com.gh.download.simple.DownloadMessageHandler import com.gh.download.simple.SimpleDownloadManager @@ -9,6 +10,7 @@ import com.gh.gamecenter.core.AppExecutor import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.core.runOnUiThread import com.gh.gamecenter.core.utils.MD5Utils +import com.gh.gamecenter.core.utils.ToastUtils import com.gh.gamecenter.entity.ArchiveEntity import com.gh.vspace.db.VArchiveEntity import com.gh.vspace.db.VGameDatabase @@ -22,7 +24,7 @@ import java.io.File object VArchiveHelper { - private val mVArchiveDao by lazy { VGameDatabase.instance.vArchiveDao() } + val vArchiveDao by lazy { VGameDatabase.instance.vArchiveDao() } private var mLatestArchiveFile: File? = null // 最近一个用于保存的存档文件 private var mSaveArchiveListener: ((VArchiveEntity) -> Unit)? = null @@ -33,9 +35,6 @@ object VArchiveHelper { private var mLatestDownloadingArchiveEntity: ArchiveEntity? = null // 最近一个正在下载的存档实例 - // 本地存档列表的 LiveData - val vArchiveEntityListLiveData by lazy { mVArchiveDao.getAllLiveData() } - // 本地存档存放的位置 val archivePath by lazy { HaloApp.getInstance().filesDir.absolutePath + File.separator } @@ -59,7 +58,10 @@ object VArchiveHelper { ) Utils.log(VHelper.LOG_TAG, "新的存档 ${it.id} 保存至数据库中") - mVArchiveDao.insert(vArchiveEntity) + runOnIoThread { + vArchiveDao.insert(vArchiveEntity) + refreshArchiveSnapshot() + } } mLatestDownloadingArchiveEntity = null } @@ -70,17 +72,32 @@ object VArchiveHelper { } } - vArchiveEntityListLiveData.observeForever { - // 更新已拥有的存档数据 - val archiveMd5Set = hashSetOf() - mVArchiveEntityList = ArrayList(it) - for (vArchiveEntity in mVArchiveEntityList) { - archiveMd5Set.add(vArchiveEntity.md5) - } - mVArchiveMd5Set = archiveMd5Set + runOnIoThread { + refreshArchiveSnapshot() } } + /** + * 手动更新存档相关的内存快照 + */ + @WorkerThread + fun refreshArchiveSnapshot() { + try { + mVArchiveEntityList = ArrayList(vArchiveDao.getAll()) + } catch (e: SQLiteDiskIOException) { + ToastUtils.toast("磁盘出现异常,请稍后再试") + e.printStackTrace() + return + } + + // 更新已拥有的存档数据 + val archiveMd5Set = hashSetOf() + for (vArchiveEntity in mVArchiveEntityList) { + archiveMd5Set.add(vArchiveEntity.md5) + } + mVArchiveMd5Set = archiveMd5Set + } + /** * 下载新的存档 */ @@ -161,7 +178,8 @@ object VArchiveHelper { gameVersion = vGameEntity?.downloadEntity?.versionName ?: "", ) - mVArchiveDao.insert(vArchiveEntity) + vArchiveDao.insert(vArchiveEntity) + refreshArchiveSnapshot() runOnUiThread { mSaveArchiveListener?.invoke(vArchiveEntity) @@ -217,7 +235,8 @@ object VArchiveHelper { for (vArchiveEntity in mVArchiveEntityList) { if (md5 == vArchiveEntity.md5) { runOnIoThread { - mVArchiveDao.delete(vArchiveEntity) + vArchiveDao.delete(vArchiveEntity) + refreshArchiveSnapshot() tryWithDefaultCatch { File(vArchiveEntity.filePath).delete() } @@ -232,7 +251,7 @@ object VArchiveHelper { */ @WorkerThread fun clearAllArchives() { - mVArchiveDao.clearAllArchives() + vArchiveDao.clearAllArchives() } /** diff --git a/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt b/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt index 6d036a1c22..cc90ebbf4e 100644 --- a/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt +++ b/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt @@ -94,7 +94,7 @@ class VDownloadManagerFragment : mListRv.addOnScrollListener(mExposureListener) } - VHelper.vGameLiveData.observe(viewLifecycleOwner) { + VHelper.vGameDao.getAllLiveData().observe(viewLifecycleOwner) { onLoadRefresh() } } diff --git a/app/src/main/java/com/gh/vspace/VHelper.kt b/app/src/main/java/com/gh/vspace/VHelper.kt index 8fb35ebe3e..54805e3643 100644 --- a/app/src/main/java/com/gh/vspace/VHelper.kt +++ b/app/src/main/java/com/gh/vspace/VHelper.kt @@ -5,6 +5,7 @@ import android.content.ContentValues import android.content.Context import android.content.Intent import android.content.pm.PackageManager +import android.database.sqlite.SQLiteDiskIOException import android.database.sqlite.SQLiteFullException import android.net.Uri import android.os.Build @@ -13,7 +14,6 @@ import android.view.View import androidx.annotation.WorkerThread import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.* -import androidx.lifecycle.Observer import com.gh.common.constant.Config import com.gh.common.exposure.ExposureUtils import com.gh.common.history.HistoryHelper @@ -87,7 +87,8 @@ object VHelper { private var mInstalledInfoList: ArrayList = arrayListOf() // 已安装的列表,由畅玩服务返回 private var mLastSuccessfullyLaunchedGame: Pair? = null - private val mVGameDao by lazy { VGameDatabase.instance.vGameDao() } + val vGameDao by lazy { VGameDatabase.instance.vGameDao() } + private var mVGameSnapshotList = arrayListOf() private var m64UpdateEntity: AppEntity? = null @@ -133,14 +134,6 @@ object VHelper { // 临时的用来临时匹配安装完成时包名对应的游戏 ID 的 Map private var mTempPackageNameAndGameIdMap = hashMapOf() - val vGameLiveData by lazy { mVGameDao.getAllLiveData() } - - private val mVGameObserver by lazy { - Observer> { - mVGameSnapshotList = ArrayList(it) - } - } - private val mPackageObserver by lazy { PackageObserver.PackageChangeListener { val vaConfig = Config.getVSettingEntity()?.va ?: return@PackageChangeListener @@ -253,7 +246,9 @@ object VHelper { getVSpaceUpdate(config.arch32, false) } - vGameLiveData.observeForever(mVGameObserver) + runOnIoThread { + refreshVGameSnapshot() + } } } @@ -262,7 +257,12 @@ object VHelper { */ @WorkerThread fun refreshVGameSnapshot() { - mVGameSnapshotList = ArrayList(mVGameDao.getAll()) + try { + mVGameSnapshotList = ArrayList(vGameDao.getAll()) + } catch (e: SQLiteDiskIOException) { + ToastUtils.toast("磁盘出现异常,请稍后再试") + e.printStackTrace() + } } /** @@ -410,7 +410,7 @@ object VHelper { * (查询数据库,请在工作线程调用) */ @WorkerThread - fun getAllVGame(): List = mVGameDao.getAll() + fun getAllVGame(): List = vGameDao.getAll() /** * 获取库里全部畅玩游戏列表的内存快照 @@ -827,7 +827,8 @@ object VHelper { mInstallingVaPathSet.remove(downloadEntity.path) try { - mVGameDao.insert(VGameEntity.from(downloadEntity)) + vGameDao.insert(VGameEntity.from(downloadEntity)) + refreshVGameSnapshot() } catch (e: SQLiteFullException) { ToastUtils.toast("存储空间不足,安装失败") return@runOnIoThread @@ -1109,7 +1110,8 @@ object VHelper { // 存在安装完成任务,但数据没有正常插入到畅玩数据库的情况(磁盘满了?),遇到这种情况,手动再插一遍 if (!isThisVGameExistInDatabase && downloadEntity != null) { - mVGameDao.insert(VGameEntity.from(downloadEntity)) + vGameDao.insert(VGameEntity.from(downloadEntity)) + refreshVGameSnapshot() } } } catch (e: Exception) { @@ -1176,9 +1178,10 @@ object VHelper { if (packageName.isNullOrBlank()) return - mVGameDao.delete(packageName) + vGameDao.delete(packageName) + refreshVGameSnapshot() - if (mVGameDao.getAll().isEmpty()) { + if (vGameDao.getAll().isEmpty()) { VBackupHelper.removeAllDatabase() } else { VBackupHelper.backupDBToExternalStorage(HaloApp.getInstance()) @@ -1287,7 +1290,8 @@ object VHelper { it.downloadEntity.addMetaExtra(KEY_LAST_PLAYED_TIME, lastPlayedTime.toString()) it.downloadEntity.addMetaExtra(KEY_TOTAL_PLAYED_TIME, totalPlayedTime.toString()) try { - mVGameDao.insert(it) + vGameDao.insert(it) + refreshVGameSnapshot() } catch (e: SQLiteFullException) { ToastUtils.toast("设备存储空间不足,请清理后重试") } diff --git a/app/src/main/java/com/gh/vspace/db/VArchiveDao.kt b/app/src/main/java/com/gh/vspace/db/VArchiveDao.kt index a62b5d2162..f45d3f60f1 100644 --- a/app/src/main/java/com/gh/vspace/db/VArchiveDao.kt +++ b/app/src/main/java/com/gh/vspace/db/VArchiveDao.kt @@ -9,9 +9,6 @@ interface VArchiveDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(archive: VArchiveEntity) - @Update(onConflict = OnConflictStrategy.REPLACE) - fun update(archive: VArchiveEntity) - @Delete fun delete(archive: VArchiveEntity) @@ -19,6 +16,6 @@ interface VArchiveDao { fun clearAllArchives() @Query("SELECT * FROM VArchiveEntity ORDER BY time desc") - fun getAllLiveData(): LiveData> + fun getAll(): List } \ No newline at end of file diff --git a/app/src/main/java/com/gh/vspace/db/VGameDao.kt b/app/src/main/java/com/gh/vspace/db/VGameDao.kt index fb79e7cbbc..7e4586c940 100644 --- a/app/src/main/java/com/gh/vspace/db/VGameDao.kt +++ b/app/src/main/java/com/gh/vspace/db/VGameDao.kt @@ -15,12 +15,6 @@ interface VGameDao { @Query("SELECT * FROM v_game") fun getAllLiveData(): LiveData> - @Delete - fun delete(gameList: List) - - @Delete - fun delete(game: VGameEntity) - @Query("DELETE FROM v_game WHERE packageName = :packageName") fun delete(packageName: String) From 4cbd4fe629b8b6eaddf3d9d162de4813cfaf1f84 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Tue, 1 Aug 2023 11:28:24 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20=E6=B8=B8=E6=88=8F=E4=B8=93=E9=A2=98?= =?UTF-8?q?-=E6=8D=A2=E4=B8=80=E6=89=B9=E5=8A=A0=E8=BD=BD=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20https://jira.shanqu.cc/browse/GHZS-3094?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt | 4 ++++ app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt index 04046f7ad4..378c433d05 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt @@ -101,10 +101,12 @@ class HomeFragmentAdapter( if (oldItem?.columnHead != null && newItem?.columnHead != null) { return oldItem.columnHead?.name == newItem.columnHead?.name + && oldItem.columnHead?.data?.firstOrNull() == newItem.columnHead?.data?.firstOrNull() } if (oldItem?.horizontalColumn != null && newItem?.horizontalColumn != null) { return oldItem.horizontalColumn?.id == newItem.horizontalColumn?.id + && oldItem.horizontalColumn?.data?.firstOrNull() == newItem.horizontalColumn?.data?.firstOrNull() } if (oldItem?.image != null && newItem?.image != null) { @@ -113,10 +115,12 @@ class HomeFragmentAdapter( if (oldItem?.verticalSlide != null && newItem?.verticalSlide != null) { return oldItem.verticalSlide?.id == newItem.verticalSlide?.id + && oldItem.verticalSlide?.data?.firstOrNull() == newItem.verticalSlide?.data?.firstOrNull() } if (oldItem?.horizontalSlide != null && newItem?.horizontalSlide != null) { return oldItem.horizontalSlide?.id == newItem.horizontalSlide?.id + && oldItem.horizontalSlide?.data?.firstOrNull() == newItem.horizontalSlide?.data?.firstOrNull() } if (oldItem?.gallery != null && newItem?.gallery != null) { diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt b/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt index b9ffca3ec0..8181974818 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt @@ -606,7 +606,7 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) { val gameEntity = sourceList[index] rawList.add(gameEntity) } - transformRawDataIntoItemDataWithThrottle(mHomeContents) + transformRawDataIntoItemData(mHomeContents) } /**