From 0b1a0cade84da370fedfa54c9d64c10e1964bfed Mon Sep 17 00:00:00 2001 From: tarsin Date: Tue, 4 Jul 2023 10:24:08 +0800 Subject: [PATCH] Cleanup FavouriteStatusRouter implementation --- .../hippo/ehviewer/FavouriteStatusRouter.kt | 34 ++++--------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.kt b/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.kt index 60410972c..40c1de2a7 100644 --- a/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.kt +++ b/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.kt @@ -15,11 +15,11 @@ */ 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.ProducerScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.callbackFlow @@ -28,10 +28,7 @@ import kotlinx.coroutines.flow.transform object FavouriteStatusRouter { private val idGenerator = IntIdGenerator(Settings.dataMapNextId) - - @SuppressLint("UseSparseArrays") private val maps = HashMap>() - private val listeners: MutableList = ArrayList() fun saveDataMap(map: MutableMap): Int { val id = idGenerator.nextId() maps[id] = map @@ -50,33 +47,16 @@ object FavouriteStatusRouter { info.favoriteSlot = slot } } - for (listener in listeners) { - listener.onModifyFavourites(gid, slot) - } - } - - private fun addListener(listener: Listener) { - listeners.add(listener) - } - - private fun removeListener(listener: Listener) { - listeners.remove(listener) - } - - fun interface Listener { - fun onModifyFavourites(gid: Long, slot: Int) + collector.trySend(gid to slot) } private val listenerScope = CoroutineScope(Dispatchers.IO) - val globalFlow = callbackFlow { - val listener = Listener { gid, slot -> - trySend(gid to slot) - } - addListener(listener) - awaitClose { - removeListener(listener) - } + private lateinit var collector: ProducerScope> + + val globalFlow = callbackFlow> { + collector = this + awaitClose { error("Unreachable!!!") } }.shareIn(listenerScope, SharingStarted.Eagerly) fun stateFlow(targetGid: Long) = globalFlow.transform { (gid, slot) -> if (targetGid == gid) emit(slot) }