diff --git a/app/src/main/java/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt index 7c3b7b19a..9104a475c 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt @@ -35,13 +35,17 @@ import com.hippo.ehviewer.BuildConfig import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings +import com.hippo.ehviewer.client.EhEngine +import com.hippo.ehviewer.client.data.FavListUrlBuilder import com.hippo.ehviewer.ui.legacy.BaseDialogBuilder import com.hippo.ehviewer.ui.login.LocalNavController import com.hippo.ehviewer.util.LogCat import com.hippo.ehviewer.util.ReadableTime import eu.kanade.tachiyomi.util.lang.withUIContext import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import moe.tarsin.coroutines.runSuspendCatching import java.io.File import java.util.zip.ZipEntry import java.util.zip.ZipOutputStream @@ -198,10 +202,44 @@ fun AdvancedScreen() { title = stringResource(id = R.string.settings_advanced_import_data), summary = stringResource(id = R.string.settings_advanced_import_data_summary), ) { importLauncher.launch("application/octet-stream") } + val backupNothing = stringResource(id = R.string.settings_advanced_backup_favorite_nothing) + val backupFailed = stringResource(id = R.string.settings_advanced_backup_favorite_failed) + val backupSucceed = stringResource(id = R.string.settings_advanced_backup_favorite_success) Preference( title = stringResource(id = R.string.settings_advanced_backup_favorite), summary = stringResource(id = R.string.settings_advanced_backup_favorite_summary), - ) + ) { + val favListUrlBuilder = FavListUrlBuilder() + var favTotal = 0 + var favIndex = 0 + tailrec suspend fun doBackup() { + val result = EhEngine.getFavorites(favListUrlBuilder.build()) + if (result.galleryInfoList.isEmpty()) { + snackbarHostState.showSnackbar(backupNothing) + } else { + if (favTotal == 0) favTotal = result.countArray.sum() + favIndex += result.galleryInfoList.size + val status = "($favIndex/$favTotal)" + EhDB.putLocalFavorites(result.galleryInfoList) + snackbarHostState.showSnackbar(context.getString(R.string.settings_advanced_backup_favorite_start, status)) + if (result.next != null) { + delay(Settings.downloadDelay.toLong()) + favListUrlBuilder.setIndex(result.next, true) + doBackup() + } + } + } + coroutineScope.launch { + runSuspendCatching { + doBackup() + }.onSuccess { + snackbarHostState.showSnackbar(backupSucceed) + }.onFailure { + it.printStackTrace() + snackbarHostState.showSnackbar(backupFailed) + } + } + } Preference( title = stringResource(id = R.string.open_by_default), summary = null,