From e0f16f31e6cc23cdd5e5ff8db3659620bd1dd419 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Mon, 15 Apr 2024 23:58:36 +0800 Subject: [PATCH] Automatically backup data before updating --- app/src/main/kotlin/com/hippo/ehviewer/EhDB.kt | 5 +++-- app/src/main/kotlin/com/hippo/ehviewer/Settings.kt | 1 + .../com/hippo/ehviewer/ui/settings/AboutScreen.kt | 14 ++++++++++++++ .../hippo/ehviewer/ui/settings/AdvancedScreen.kt | 3 ++- app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 22 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/EhDB.kt b/app/src/main/kotlin/com/hippo/ehviewer/EhDB.kt index 0689ccc96..47aed5f13 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/EhDB.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/EhDB.kt @@ -32,6 +32,7 @@ import com.hippo.ehviewer.dao.QuickSearch import com.hippo.ehviewer.dao.Schema17to18 import com.hippo.ehviewer.download.DownloadManager import com.hippo.ehviewer.util.sendTo +import com.hippo.unifile.UniFile import com.hippo.unifile.asUniFile import kotlinx.coroutines.flow.Flow import splitties.arch.room.roomDb @@ -260,10 +261,10 @@ object EhDB { db.filterDao().update(filter) } - fun exportDB(context: Context, uri: Uri) { + fun exportDB(context: Context, file: UniFile) { db.query("PRAGMA wal_checkpoint(FULL)", null).use { it.moveToNext() } val dbFile = context.getDatabasePath(DB_NAME) - dbFile.asUniFile() sendTo uri.asUniFile() + dbFile.asUniFile() sendTo file } suspend fun importDB(context: Context, uri: Uri) { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt index 4d8495770..2438a485b 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt @@ -143,6 +143,7 @@ object Settings : DataStorePreferences(null) { var showTagTranslations by boolPref(KEY_SHOW_TAG_TRANSLATIONS, false).observed { updateWhenTagTranslationChanges() } var appLinkVerifyTip by boolPref("app_link_verify_tip", false) var enabledSecurity by boolPref("enable_secure", false) + var backupBeforeUpdate by boolPref("backup_before_update", true) var useCIUpdateChannel by boolPref("ci_update_channel", false) var mediaScan by boolPref("media_scan", false).observed { updateWhenKeepMediaStatusChanges() } var hasDefaultDownloadLabel by boolPref("has_default_download_label", false) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AboutScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AboutScreen.kt index c1d389c7d..cebe84dbd 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AboutScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AboutScreen.kt @@ -30,8 +30,10 @@ import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.fromHtml import androidx.compose.ui.unit.dp import com.hippo.ehviewer.BuildConfig +import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings +import com.hippo.ehviewer.download.downloadLocation import com.hippo.ehviewer.ui.destinations.LicenseScreenDestination import com.hippo.ehviewer.ui.tools.DialogState import com.hippo.ehviewer.ui.tools.LocalDialogState @@ -39,6 +41,7 @@ import com.hippo.ehviewer.ui.tools.observed import com.hippo.ehviewer.updater.AppUpdater import com.hippo.ehviewer.updater.Release import com.hippo.ehviewer.util.AppConfig +import com.hippo.ehviewer.util.ReadableTime import com.hippo.ehviewer.util.displayString import com.hippo.ehviewer.util.installPackage import com.ramcosta.composedestinations.annotation.Destination @@ -48,6 +51,7 @@ import eu.kanade.tachiyomi.util.lang.withUIContext import java.io.File import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.datetime.Clock import moe.tarsin.coroutines.runSuspendCatching private const val REPO_URL = "https://github.com/${BuildConfig.REPO_NAME}" @@ -108,6 +112,10 @@ fun AboutScreen(navigator: DestinationsNavigator) { title = stringResource(id = R.string.settings_about_version), summary = versionCode(), ) + SwitchPreference( + title = stringResource(id = R.string.backup_before_update), + value = Settings::backupBeforeUpdate, + ) SwitchPreference( title = stringResource(id = R.string.use_ci_update_channel), value = Settings::useCIUpdateChannel, @@ -145,6 +153,12 @@ suspend fun DialogState.showNewVersion(context: Context, release: Release) { Text(text = release.changelog) } } + if (Settings.backupBeforeUpdate) { + val time = ReadableTime.getFilenamableTime(Clock.System.now().toEpochMilliseconds()) + downloadLocation.createFile("$time.db")?.let { + EhDB.exportDB(context, it) + } + } // TODO: Download in the background and show progress in notification val file = File(AppConfig.tempDir, "update.apk").apply { delete() } AppUpdater.downloadUpdate(release.downloadLink, file) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt index d6c9cae7c..061a05ea7 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt @@ -43,6 +43,7 @@ import com.hippo.ehviewer.ui.tools.observed import com.hippo.ehviewer.util.AppConfig import com.hippo.ehviewer.util.Crash import com.hippo.ehviewer.util.ReadableTime +import com.hippo.unifile.asUniFile import com.jamal.composeprefs3.ui.prefs.SwitchPref import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootGraph @@ -181,7 +182,7 @@ fun AdvancedScreen(navigator: DestinationsNavigator) { uri?.let { context.runCatching { grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION) - EhDB.exportDB(context, uri) + EhDB.exportDB(context, uri.asUniFile()) launchSnackBar(getString(R.string.settings_advanced_export_data_to, uri.toString())) }.onFailure { logcat(it) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a4760fcb6..188da7506 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -424,6 +424,7 @@ 收藏画廊 纯黑深色主题 类别颜色适配动态配色 + 更新前备份数据 使用持续集成(CI)构建频道更新 排序依据 添加时间(降序) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a068f258c..457b87672 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -519,6 +519,7 @@ For Android 12 and newer, you need to manually add link to verified links in order to open E-Hentai links in EhViewer. App links not verified Open by default + Backup data before update Use CI update channel Require Unlock Lock Delay