diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt index 33f4ed4f4..8eb743fb5 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/EhEngine.kt @@ -297,6 +297,10 @@ object EhEngine { }.executeSafely { } } + suspend fun getFavoriteNote(gid: Long, token: String) = + ehRequest(EhUrl.getAddFavorites(gid, token), EhUrl.getGalleryDetailUrl(gid, token)) + .fetchUsingAsText(FavoritesParser::parseNote) + suspend fun downloadArchive(gid: Long, token: String, or: String, res: String, isHAtH: Boolean): String? { val url = EhUrl.getDownloadArchive(gid, token, or) val referer = EhUrl.getGalleryDetailUrl(gid, token) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/parser/FavoritesParser.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/parser/FavoritesParser.kt index c578a1f74..b24131425 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/parser/FavoritesParser.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/parser/FavoritesParser.kt @@ -1,6 +1,7 @@ package com.hippo.ehviewer.client.parser import com.hippo.ehviewer.client.exception.ParseException +import com.hippo.ehviewer.util.unescapeXml import java.nio.ByteBuffer import kotlinx.serialization.Serializable import moe.tarsin.coroutines.runSuspendCatching @@ -17,11 +18,16 @@ data class FavParserResult( } object FavoritesParser { + private val NoteRegex = Regex("]*>([^<]*)") + fun parse(body: ByteBuffer): FavParserResult = runSuspendCatching { unmarshalParsingAs(body, ::parseFav) }.getOrElse { throw ParseException("Parse favorites error", it) } + + fun parseNote(body: String) = NoteRegex.find(body)?.run { groupValues[1].unescapeXml() } + ?: throw ParseException("Can't parse favorite note") } private external fun parseFav(body: ByteBuffer, limit: Int = body.limit()): Int diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/CommonOperations.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/CommonOperations.kt index 4bada550a..02842ae95 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/CommonOperations.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/CommonOperations.kt @@ -57,6 +57,7 @@ import com.hippo.ehviewer.ui.destinations.ReaderScreenDestination import com.hippo.ehviewer.ui.tools.DialogState import com.hippo.ehviewer.ui.tools.LabeledCheckbox import com.hippo.ehviewer.util.FavouriteStatusRouter +import com.hippo.ehviewer.util.bgWork import com.hippo.ehviewer.util.findActivity import com.hippo.ehviewer.util.isAtLeastT import com.hippo.ehviewer.util.mapToLongArray @@ -207,10 +208,14 @@ suspend fun DialogState.modifyFavorites(galleryInfo: BaseGalleryInfo): Boolean { add(localFav) addAll(cloudFav) } + if (galleryInfo.favoriteSlot >= 0 && galleryInfo.favoriteNote == null) { + galleryInfo.favoriteNote = bgWork { EhEngine.getFavoriteNote(galleryInfo.gid, galleryInfo.token) } + } val (slot, note) = awaitSelectItemWithIconAndTextField( items, title = R.string.add_favorites_dialog_title, hint = R.string.favorite_note, + initialNote = galleryInfo.favoriteNote.orEmpty(), maxChar = MAX_FAVNOTE_CHAR, ) return doModifyFavorites(galleryInfo, if (isFavorited) slot - 2 else slot - 1, localFavorited, note) @@ -249,6 +254,7 @@ private suspend fun doModifyFavorites( in 0..9 -> { EhEngine.modifyFavorites(galleryInfo.gid, galleryInfo.token, slot, note) + galleryInfo.favoriteNote = note true } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt index 8e77491d3..4752c098a 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt @@ -532,6 +532,7 @@ class DialogState { items: List>, @StringRes title: Int, @StringRes hint: Int, + initialNote: String, maxChar: Int, ): Pair = showNoButton(false) { Column { @@ -540,7 +541,7 @@ class DialogState { modifier = Modifier.fillMaxWidth().aspectRatio(1F), placeFirstItemInCenter = true, ) { - var note by remember { mutableStateOf("") } + var note by remember { mutableStateOf(initialNote) } TextField( value = note, onValueChange = { note = it },