From 22b87de29d15e6e634a357392b615db51e65d250 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Fri, 4 Aug 2023 14:23:27 +0800 Subject: [PATCH] Don't show cloud favorites when not logged in --- .../main/java/com/hippo/ehviewer/Settings.kt | 4 +- .../com/hippo/ehviewer/client/EhEngine.kt | 6 +- .../com/hippo/ehviewer/ui/CommonOperations.kt | 52 +++++++------- .../hippo/ehviewer/ui/scene/FavoritesScene.kt | 29 +++++--- .../ehviewer/ui/scene/GalleryDetailScene.kt | 9 ++- .../ehviewer/ui/settings/AdvancedScreen.kt | 69 ++++++++++--------- 6 files changed, 92 insertions(+), 77 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.kt b/app/src/main/java/com/hippo/ehviewer/Settings.kt index 2d1a9fd4b..89349ab7d 100755 --- a/app/src/main/java/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/java/com/hippo/ehviewer/Settings.kt @@ -22,7 +22,6 @@ object Settings : DataStorePreferences(null) { val favChangesFlow = _favFlow.debounce(1000) var favCat by stringArrayPref("fav_cat", 10, "Favorites").emitTo(_favFlow) var favCount by intArrayPref("fav_count", 10).emitTo(_favFlow) - var favLocalCount by intPref("fav_local", 0).emitTo(_favFlow) var favCloudCount by intPref("fav_cloud", 0).emitTo(_favFlow) var downloadScheme by stringOrNullPref("image_scheme", null) @@ -66,14 +65,13 @@ object Settings : DataStorePreferences(null) { var enableQuic by boolPref("enable_quic", true) var bypassCloudflare by boolPref("bypass_cloudflare", false) var thumbSizeDp by intPref("thumb_size_", 120) - var recentFavCat by intPref("recent_fav_cat", FavListUrlBuilder.FAV_CAT_ALL) + var recentFavCat by intPref("recent_fav_cat", FavListUrlBuilder.FAV_CAT_LOCAL) var securityDelay by intPref("require_unlock_delay", 0) var clipboardTextHashCode by intPref("clipboard_text_hash_code", 0) var listThumbSize by intPref("list_tile_size", 40) var searchCategory by intPref("search_pref", EhUtils.ALL_CATEGORY) var requestNewsTimerHour by intPref("request_news_timer_hour", -1) var requestNewsTimerMinute by intPref("request_news_timer_minute", -1) - var dataMapNextId by intPref("data_map_next_id", 0) var updateIntervalDays by intPref("update_interval_days", 0) var recentDownloadLabel by stringOrNullPref("recent_download_label", null) var defaultDownloadLabel by stringOrNullPref("default_download_label", null) diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt index 4d8a25c74..9d80f269f 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt @@ -290,7 +290,7 @@ object EhEngine { * @param dstCat -1 for delete, 0 - 9 for cloud favorite, others throw Exception * @param note max 250 characters */ - suspend fun addFavorites( + suspend fun modifyFavorites( gid: Long, token: String?, dstCat: Int = -1, @@ -519,7 +519,7 @@ object EhEngine { if (filter) list.removeAllSuspend { EhFilter.filterUploader(it) || EhFilter.filterTag(it) || EhFilter.filterTagNamespace(it) } } - suspend fun addFavoritesRange(galleryList: List>, dstCat: Int) { - galleryList.forEach { (gid, token) -> addFavorites(gid, token, dstCat) } + suspend fun modifyFavoritesRange(galleryList: List>, dstCat: Int) { + galleryList.forEach { (gid, token) -> modifyFavorites(gid, token, dstCat) } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt index f820f426b..1ceb1dbc1 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.kt @@ -34,6 +34,7 @@ import androidx.core.content.ContextCompat import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings +import com.hippo.ehviewer.client.EhCookieStore import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.BaseGalleryInfo @@ -195,31 +196,36 @@ suspend fun keepNoMediaFileStatus() { } } -suspend fun DialogState.addToFavorites(galleryInfo: BaseGalleryInfo): Boolean { +fun getFavoriteIcon(favorited: Boolean) = + if (favorited) Icons.Default.Favorite else Icons.Default.FavoriteBorder + +suspend fun DialogState.modifyFavorites(galleryInfo: BaseGalleryInfo): Boolean { val localFavorited = EhDB.containLocalFavorites(galleryInfo.gid) - val localFav = if (localFavorited) { - Icons.Default.Favorite - } else { - Icons.Default.FavoriteBorder - } to appCtx.getString(R.string.local_favorites) - val items = Settings.favCat.mapIndexed { index, name -> - if (galleryInfo.favoriteSlot == index) { - Icons.Default.Favorite + if (EhCookieStore.hasSignedIn()) { + val localFav = getFavoriteIcon(localFavorited) to appCtx.getString(R.string.local_favorites) + val cloudFav = Settings.favCat.mapIndexed { index, name -> + getFavoriteIcon(galleryInfo.favoriteSlot == index) to name + }.toTypedArray() + val isFavorited = galleryInfo.favoriteSlot != NOT_FAVORITED + val items = if (isFavorited) { + val remove = Icons.Default.HeartBroken to appCtx.getString(R.string.remove_from_favourites) + arrayOf(remove, localFav, *cloudFav) } else { - Icons.Default.FavoriteBorder - } to name - }.toTypedArray() - val isFavorited = galleryInfo.favoriteSlot != NOT_FAVORITED - val (slot, note) = if (isFavorited) { - val remove = Icons.Default.HeartBroken to appCtx.getString(R.string.remove_from_favourites) - showSelectItemWithIconAndTextField(remove, localFav, *items, title = R.string.add_favorites_dialog_title, hint = R.string.favorite_note, maxChar = MAX_FAVNOTE_CHAR) + arrayOf(localFav, *cloudFav) + } + val (slot, note) = showSelectItemWithIconAndTextField( + *items, + title = R.string.add_favorites_dialog_title, + hint = R.string.favorite_note, + maxChar = MAX_FAVNOTE_CHAR, + ) + return doModifyFavorites(galleryInfo, if (isFavorited) slot - 2 else slot - 1, note, localFavorited) } else { - showSelectItemWithIconAndTextField(localFav, *items, title = R.string.add_favorites_dialog_title, hint = R.string.favorite_note, maxChar = MAX_FAVNOTE_CHAR) + return doModifyFavorites(galleryInfo, LOCAL_FAVORITED, localFavorited = localFavorited) } - return doAddToFavorites(galleryInfo, if (isFavorited) slot - 2 else slot - 1, note, localFavorited) } -private suspend fun doAddToFavorites( +private suspend fun doModifyFavorites( galleryInfo: BaseGalleryInfo, slot: Int = NOT_FAVORITED, note: String = "", @@ -228,7 +234,7 @@ private suspend fun doAddToFavorites( val add = when (slot) { NOT_FAVORITED -> { // Remove from cloud favorites first if (galleryInfo.favoriteSlot > LOCAL_FAVORITED) { - EhEngine.addFavorites(galleryInfo.gid, galleryInfo.token) + EhEngine.modifyFavorites(galleryInfo.gid, galleryInfo.token) } else if (localFavorited) { EhDB.removeLocalFavorites(galleryInfo) } @@ -245,7 +251,7 @@ private suspend fun doAddToFavorites( } in 0..9 -> { - EhEngine.addFavorites(galleryInfo.gid, galleryInfo.token, slot, note) + EhEngine.modifyFavorites(galleryInfo.gid, galleryInfo.token, slot, note) true } @@ -266,7 +272,7 @@ private suspend fun doAddToFavorites( return add } -suspend fun removeFromFavorites(galleryInfo: BaseGalleryInfo) = doAddToFavorites(galleryInfo) +suspend fun removeFromFavorites(galleryInfo: BaseGalleryInfo) = doModifyFavorites(galleryInfo) fun Context.navToReader(info: BaseGalleryInfo, page: Int = -1) { val intent = Intent(this, ReaderActivity::class.java) @@ -316,7 +322,7 @@ suspend fun DialogState.doGalleryInfoAction(info: BaseGalleryInfo, context: Cont } } else { runSuspendCatching { - addToFavorites(info) + modifyFavorites(info) showTip(R.string.add_to_favorite_success, BaseScene.LENGTH_SHORT) }.onFailure { showTip(R.string.add_to_favorite_failure, BaseScene.LENGTH_LONG) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt index 3b59ad667..e60680c33 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt @@ -61,6 +61,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings +import com.hippo.ehviewer.client.EhCookieStore import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.data.BaseGalleryInfo @@ -271,9 +272,12 @@ class FavoritesScene : SearchBarScene() { 6 -> { val helper = MoveDialogHelper() // First is local favorite, the other 10 is cloud favorite - val array = arrayOfNulls(11) - array[0] = getString(R.string.local_favorites) - System.arraycopy(Settings.favCat, 0, array, 1, 10) + val localFav = getString(R.string.local_favorites) + val array = if (EhCookieStore.hasSignedIn()) { + arrayOf(localFav, *Settings.favCat) + } else { + arrayOf(localFav) + } BaseDialogBuilder(context).setTitle(R.string.move_favorites_dialog_title).setItems(array, helper).show() } } @@ -414,11 +418,16 @@ class FavoritesScene : SearchBarScene() { scope.invalidate() } } - val faves = arrayOf( - stringResource(id = R.string.local_favorites) to localFavCount, - stringResource(id = R.string.cloud_favorites) to Settings.favCloudCount, - *Settings.favCat.zip(Settings.favCount.toTypedArray()).toTypedArray(), - ) + val localFav = stringResource(id = R.string.local_favorites) to localFavCount + val faves = if (EhCookieStore.hasSignedIn()) { + arrayOf( + localFav, + stringResource(id = R.string.cloud_favorites) to Settings.favCloudCount, + *Settings.favCat.zip(Settings.favCount.toTypedArray()).toTypedArray(), + ) + } else { + arrayOf(localFav) + } LazyColumn { itemsIndexed(faves) { index, (name, count) -> ListItem( @@ -484,7 +493,7 @@ class FavoritesScene : SearchBarScene() { EhDB.removeLocalFavorites(info) } else { val delList = info.map { it.gid to it.token!! } - EhEngine.addFavoritesRange(delList, -1) + EhEngine.modifyFavoritesRange(delList, -1) } mAdapter?.refresh() } @@ -503,7 +512,7 @@ class FavoritesScene : SearchBarScene() { EhDB.removeLocalFavorites(info) val galleryList = info.map { it.gid to it.token!! } runCatching { - EhEngine.addFavoritesRange(galleryList, dstCat) + EhEngine.modifyFavoritesRange(galleryList, dstCat) } } else if (dstCat == FavListUrlBuilder.FAV_CAT_LOCAL) { // Move from cloud to local diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt index a1bca14e0..a59015a15 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt @@ -58,8 +58,6 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.CloudDone import androidx.compose.material.icons.filled.Difference -import androidx.compose.material.icons.filled.Favorite -import androidx.compose.material.icons.filled.FavoriteBorder import androidx.compose.material.icons.filled.ImageSearch import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.Share @@ -140,7 +138,7 @@ import com.hippo.ehviewer.spider.SpiderQueen.Companion.MODE_READ import com.hippo.ehviewer.ui.CommonOperations import com.hippo.ehviewer.ui.GalleryInfoBottomSheet import com.hippo.ehviewer.ui.MainActivity -import com.hippo.ehviewer.ui.addToFavorites +import com.hippo.ehviewer.ui.getFavoriteIcon import com.hippo.ehviewer.ui.legacy.BaseDialogBuilder import com.hippo.ehviewer.ui.legacy.CheckBoxDialogBuilder import com.hippo.ehviewer.ui.legacy.CoilImageGetter @@ -150,6 +148,7 @@ import com.hippo.ehviewer.ui.main.EhPreviewItem import com.hippo.ehviewer.ui.main.GalleryDetailErrorTip import com.hippo.ehviewer.ui.main.GalleryDetailHeaderCard import com.hippo.ehviewer.ui.main.GalleryTags +import com.hippo.ehviewer.ui.modifyFavorites import com.hippo.ehviewer.ui.navToReader import com.hippo.ehviewer.ui.openBrowser import com.hippo.ehviewer.ui.scene.GalleryListScene.Companion.toStartArgs @@ -694,7 +693,7 @@ class GalleryDetailScene : BaseScene() { onCheckedChange = { modifyFavourite() }, ) { Icon( - imageVector = if (favored) Icons.Default.Favorite else Icons.Default.FavoriteBorder, + imageVector = getFavoriteIcon(favored), contentDescription = null, ) } @@ -875,7 +874,7 @@ class GalleryDetailScene : BaseScene() { favoritesLock.withLock { var remove = false runCatching { - remove = !dialogState.addToFavorites(galleryDetail.galleryInfo) + remove = !dialogState.modifyFavorites(galleryDetail.galleryInfo) if (remove) { showTip(R.string.remove_from_favorite_success, LENGTH_SHORT) } else { 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 e49907487..670f96f8a 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 @@ -33,6 +33,7 @@ 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.EhCookieStore import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.data.FavListUrlBuilder import com.hippo.ehviewer.ui.LocalNavController @@ -176,41 +177,43 @@ fun AdvancedScreen() { } } } - 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()) { - launchSnackBar(backupNothing) - } else { - if (favTotal == 0) favTotal = result.countArray.sum() - favIndex += result.galleryInfoList.size - val status = "($favIndex/$favTotal)" - EhDB.putLocalFavorites(result.galleryInfoList) - launchSnackBar(context.getString(R.string.settings_advanced_backup_favorite_start, status)) - if (result.next != null) { - delay(Settings.downloadDelay.toLong()) - favListUrlBuilder.setIndex(result.next, true) - doBackup() + if (EhCookieStore.hasSignedIn()) { + 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()) { + launchSnackBar(backupNothing) + } else { + if (favTotal == 0) favTotal = result.countArray.sum() + favIndex += result.galleryInfoList.size + val status = "($favIndex/$favTotal)" + EhDB.putLocalFavorites(result.galleryInfoList) + launchSnackBar(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 { - launchSnackBar(backupSucceed) - }.onFailure { - it.printStackTrace() - launchSnackBar(backupFailed) + coroutineScope.launch { + runSuspendCatching { + doBackup() + }.onSuccess { + launchSnackBar(backupSucceed) + }.onFailure { + it.printStackTrace() + launchSnackBar(backupFailed) + } } } }