diff --git a/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.kt b/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.kt index 275898fd4..919139d00 100644 --- a/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.kt +++ b/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.kt @@ -18,6 +18,13 @@ package com.hippo.ehviewer import android.annotation.SuppressLint import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.yorozuya.IntIdGenerator +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.shareIn object FavouriteStatusRouter { private val idGenerator = IntIdGenerator(Settings.dataMapNextId) @@ -59,4 +66,18 @@ object FavouriteStatusRouter { fun interface Listener { fun onModifyFavourites(gid: Long, slot: Int) } + + private val listenerScope = CoroutineScope(Dispatchers.IO) + + private val _stateFlow = callbackFlow { + val listener = Listener { gid, slot -> + trySend(gid to slot) + } + addListener(listener) + awaitClose { + removeListener(listener) + } + }.shareIn(listenerScope, SharingStarted.Eagerly) + + fun stateFlow(gid: Long) = _stateFlow.filter { (gid1) -> gid1 == gid } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt index 13f2eca1a..38b70ff01 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt @@ -22,6 +22,8 @@ import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Text import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.currentRecomposeScope import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.ui.Alignment @@ -32,6 +34,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout +import com.hippo.ehviewer.FavouriteStatusRouter import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.download.DownloadManager @@ -60,6 +63,12 @@ fun GalleryInfoListItem( modifier = Modifier.aspectRatio(0.6666667F).fillMaxSize(), ) } + val scope = currentRecomposeScope + LaunchedEffect(info.gid) { + FavouriteStatusRouter.stateFlow(info.gid).collect { + scope.invalidate() + } + } val showFav = info.favoriteSlot != -2 && !isInFavScene ConstraintLayout(modifier = Modifier.padding(8.dp, 4.dp).fillMaxSize()) { val (titleRef, uploaderRef, ratingRef, categoryRef, postedRef, favRef, iconsRef) = createRefs() diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt index bb0a4f113..3aee78063 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt @@ -53,7 +53,6 @@ import com.google.android.material.datepicker.DateValidatorPointForward import com.google.android.material.datepicker.MaterialDatePicker import com.google.android.material.floatingactionbutton.FloatingActionButton import com.hippo.ehviewer.EhDB -import com.hippo.ehviewer.FavouriteStatusRouter import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhEngine @@ -153,12 +152,6 @@ class GalleryListScene : SearchBarScene(), OnDragHandlerListener, OnClickFabList } private var mHasFirstRefresh = false - @SuppressLint("NotifyDataSetChanged") - private val mFavouriteStatusRouterListener: FavouriteStatusRouter.Listener = - FavouriteStatusRouter.Listener { _: Long, _: Int -> - mAdapter?.notifyDataSetChanged() - } - private var mIsTopList = false override fun getMenuResId(): Int { return R.menu.scene_gallery_list_searchbar_menu @@ -188,7 +181,6 @@ class GalleryListScene : SearchBarScene(), OnDragHandlerListener, OnClickFabList override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - FavouriteStatusRouter.addListener(mFavouriteStatusRouterListener) if (savedInstanceState == null) { onInit() } else { @@ -223,11 +215,6 @@ class GalleryListScene : SearchBarScene(), OnDragHandlerListener, OnClickFabList outState.putInt(KEY_STATE, mState) } - override fun onDestroy() { - super.onDestroy() - FavouriteStatusRouter.removeListener(mFavouriteStatusRouterListener) - } - private fun setSearchBarHint() { setEditTextHint(getString(if (EhUtils.isExHentai) R.string.gallery_list_search_bar_hint_exhentai else R.string.gallery_list_search_bar_hint_e_hentai)) }