From dfd9af8ee3b93225648231b85dc3b565266e228f Mon Sep 17 00:00:00 2001 From: tarsin Date: Mon, 3 Jul 2023 19:57:28 +0800 Subject: [PATCH] Convert DownloadInfoListener to callbackFlow --- .../ehviewer/download/DownloadManager.kt | 43 +++++++++++++++++++ .../com/hippo/ehviewer/ui/main/GalleryInfo.kt | 14 +++++- .../ehviewer/ui/scene/GalleryDetailScene.kt | 39 +---------------- .../ehviewer/ui/scene/GalleryListScene.kt | 31 ------------- 4 files changed, 57 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt index cbad1dc71..622aafb8a 100644 --- a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt +++ b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt @@ -36,7 +36,9 @@ import com.hippo.ehviewer.yorozuya.SimpleHandler import com.hippo.ehviewer.yorozuya.collect.LongList import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.util.lang.withUIContext +import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch import splitties.init.appCtx import splitties.preferences.edit @@ -254,6 +256,47 @@ object DownloadManager : OnSpiderListener { } } + val stateFlow = callbackFlow { + val listener = object : DownloadInfoListener { + override fun onAdd(info: DownloadInfo, list: List, position: Int) { + trySend(info) + list.forEach { trySend(it) } + } + + override fun onUpdate(info: DownloadInfo, list: List) { + trySend(info) + } + + override fun onUpdateAll() { + // No-op + } + + override fun onReload() { + // No-op + } + + override fun onChange() { + // No-op + } + + override fun onRenameLabel(from: String, to: String) { + // No-op + } + + override fun onRemove(info: DownloadInfo, list: List, position: Int) { + trySend(info) + } + + override fun onUpdateLabels() { + // No-op + } + } + addDownloadInfoListener(listener) + awaitClose { + removeDownloadInfoListener(listener) + } + } + fun startAllDownload() { var update = false // Start all STATE_NONE and STATE_FAILED item 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 2115539b4..304a3dfe2 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,11 @@ 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.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -36,6 +41,7 @@ import com.hippo.ehviewer.download.DownloadManager import com.hippo.ehviewer.ui.tools.CrystalCard import com.hippo.ehviewer.ui.tools.ElevatedCard import com.hippo.ehviewer.ui.tools.GalleryListCardRating +import kotlinx.coroutines.flow.collect @Composable fun GalleryInfoListItem( @@ -109,7 +115,13 @@ fun GalleryInfoListItem( bottom.linkTo(if (showFav) favRef.top else postedRef.top) }, ) { - if (DownloadManager.containDownloadInfo(info.gid)) { + var download by remember(info.gid) { mutableStateOf(DownloadManager.containDownloadInfo(info.gid)) } + LaunchedEffect(info.gid) { + DownloadManager.stateFlow.collect { + if (it.gid == info.gid) download = DownloadManager.containDownloadInfo(info.gid) + } + } + if (download) { Icon( Icons.Default.Download, contentDescription = null, 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 f0cea9644..afd145d72 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 @@ -129,7 +129,6 @@ import com.hippo.ehviewer.databinding.DialogArchiveListBinding import com.hippo.ehviewer.databinding.DialogRateBinding import com.hippo.ehviewer.databinding.DialogTorrentListBinding import com.hippo.ehviewer.databinding.ItemGalleryCommentBinding -import com.hippo.ehviewer.download.DownloadManager.DownloadInfoListener import com.hippo.ehviewer.spider.SpiderDen import com.hippo.ehviewer.spider.SpiderQueen import com.hippo.ehviewer.spider.SpiderQueen.Companion.MODE_READ @@ -176,7 +175,7 @@ import splitties.systemservices.downloadManager import kotlin.math.roundToInt import com.hippo.ehviewer.download.DownloadManager as ehDownloadManager -class GalleryDetailScene : BaseScene(), DownloadInfoListener { +class GalleryDetailScene : BaseScene() { private var mDownloadState = 0 private var mAction: String? = null private var mGid: Long = 0 @@ -396,7 +395,6 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { } else { getDetailError = getString(R.string.error_cannot_find_gallery) } - ehDownloadManager.addDownloadInfoListener(this) (requireActivity() as MainActivity).mShareUrl = galleryDetailUrl return ComposeView(requireContext()).apply { setMD3Content { @@ -814,7 +812,6 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { override fun onDestroyView() { super.onDestroyView() - ehDownloadManager.removeDownloadInfoListener(this) (requireActivity() as MainActivity).mShareUrl = null } @@ -1213,13 +1210,6 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { } } - private fun downloadLongClick() { - val galleryInfo = composeBindingGI - if (galleryInfo != null) { - CommonOperations.startDownload(activity as MainActivity, galleryInfo, true) - } - } - private fun showFilterUploaderDialog() { if (uploader.isNullOrEmpty() || disowned) { return @@ -1265,33 +1255,6 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { updateDownloadText() } - override fun onAdd(info: DownloadInfo, list: List, position: Int) { - updateDownloadState() - } - - override fun onUpdate(info: DownloadInfo, list: List) { - updateDownloadState() - } - - override fun onUpdateAll() { - updateDownloadState() - } - - override fun onReload() { - updateDownloadState() - } - - override fun onChange() { - updateDownloadState() - } - - override fun onRemove(info: DownloadInfo, list: List, position: Int) { - updateDownloadState() - } - - override fun onRenameLabel(from: String, to: String) {} - override fun onUpdateLabels() {} - private fun onModifyFavoritesSuccess() { if (composeBindingGD != null) { composeBindingGD!!.isFavorited = composeBindingGD!!.favoriteName != null 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 17060f0df..bb0a4f113 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 @@ -71,13 +71,10 @@ import com.hippo.ehviewer.client.parser.GalleryListParser import com.hippo.ehviewer.client.parser.GalleryPageUrlParser import com.hippo.ehviewer.coil.imageRequest import com.hippo.ehviewer.coil.justDownload -import com.hippo.ehviewer.dao.DownloadInfo import com.hippo.ehviewer.dao.QuickSearch import com.hippo.ehviewer.databinding.DrawerListRvBinding import com.hippo.ehviewer.databinding.ItemDrawerListBinding import com.hippo.ehviewer.databinding.SceneGalleryListBinding -import com.hippo.ehviewer.download.DownloadManager -import com.hippo.ehviewer.download.DownloadManager.DownloadInfoListener import com.hippo.ehviewer.ui.doGalleryInfoAction import com.hippo.ehviewer.ui.legacy.AddDeleteDrawable import com.hippo.ehviewer.ui.legacy.BaseDialogBuilder @@ -106,7 +103,6 @@ import java.io.File import java.time.LocalDateTime import java.time.ZoneId import java.time.ZoneOffset -import com.hippo.ehviewer.download.DownloadManager as downloadManager class GalleryListScene : SearchBarScene(), OnDragHandlerListener, OnClickFabListener, OnExpandListener { private val mCallback = object : OnBackPressedCallback(false) { @@ -156,31 +152,6 @@ class GalleryListScene : SearchBarScene(), OnDragHandlerListener, OnClickFabList } } private var mHasFirstRefresh = false - private val mDownloadManager: DownloadManager = downloadManager - - @SuppressLint("NotifyDataSetChanged") - private val mDownloadInfoListener: DownloadInfoListener = object : DownloadInfoListener { - override fun onAdd(info: DownloadInfo, list: List, position: Int) { - mAdapter?.notifyDataSetChanged() - } - - override fun onUpdate(info: DownloadInfo, list: List) {} - override fun onUpdateAll() {} - override fun onReload() { - mAdapter?.notifyDataSetChanged() - } - - override fun onChange() { - mAdapter?.notifyDataSetChanged() - } - - override fun onRenameLabel(from: String, to: String) {} - override fun onRemove(info: DownloadInfo, list: List, position: Int) { - mAdapter?.notifyDataSetChanged() - } - - override fun onUpdateLabels() {} - } @SuppressLint("NotifyDataSetChanged") private val mFavouriteStatusRouterListener: FavouriteStatusRouter.Listener = @@ -217,7 +188,6 @@ class GalleryListScene : SearchBarScene(), OnDragHandlerListener, OnClickFabList override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mDownloadManager.addDownloadInfoListener(mDownloadInfoListener) FavouriteStatusRouter.addListener(mFavouriteStatusRouterListener) if (savedInstanceState == null) { onInit() @@ -255,7 +225,6 @@ class GalleryListScene : SearchBarScene(), OnDragHandlerListener, OnClickFabList override fun onDestroy() { super.onDestroy() - mDownloadManager.removeDownloadInfoListener(mDownloadInfoListener) FavouriteStatusRouter.removeListener(mFavouriteStatusRouterListener) }