From a0ecff9a3d3ae583ea87e687b2b4174b8a790c8d Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Thu, 30 Dec 2021 13:35:01 -0600 Subject: [PATCH] Replace flow with channel --- .../astrid/adapter/NavigationDrawerAdapter.kt | 4 +- .../org/tasks/activities/DragAndDropDiffer.kt | 37 +++++++++++-------- .../tasklist/DragAndDropRecyclerAdapter.kt | 4 +- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/todoroo/astrid/adapter/NavigationDrawerAdapter.kt b/app/src/main/java/com/todoroo/astrid/adapter/NavigationDrawerAdapter.kt index 27ff8a22b..d3e530886 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/NavigationDrawerAdapter.kt +++ b/app/src/main/java/com/todoroo/astrid/adapter/NavigationDrawerAdapter.kt @@ -17,7 +17,7 @@ import com.todoroo.astrid.api.FilterListItem import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.asCoroutineDispatcher -import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.channels.Channel import org.tasks.LocalBroadcastManager import org.tasks.activities.DragAndDropDiffer import org.tasks.billing.Inventory @@ -45,7 +45,7 @@ class NavigationDrawerAdapter @Inject constructor( private lateinit var onClick: (FilterListItem?) -> Unit private var selected: Filter? = null - override val flow = MutableSharedFlow>() + override val channel = Channel>(Channel.UNLIMITED) override val updates: Queue, DiffUtil.DiffResult?>> = LinkedList() override val scope: CoroutineScope = CoroutineScope(Executors.newSingleThreadExecutor().asCoroutineDispatcher() + Job()) diff --git a/app/src/main/java/org/tasks/activities/DragAndDropDiffer.kt b/app/src/main/java/org/tasks/activities/DragAndDropDiffer.kt index bbd718f7b..7e7965524 100644 --- a/app/src/main/java/org/tasks/activities/DragAndDropDiffer.kt +++ b/app/src/main/java/org/tasks/activities/DragAndDropDiffer.kt @@ -3,23 +3,30 @@ package org.tasks.activities import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListUpdateCallback import com.todoroo.andlib.utility.AndroidUtilities -import kotlinx.coroutines.* -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.consumeAsFlow +import kotlinx.coroutines.flow.drop +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.scan import java.util.* -import java.util.concurrent.Executors interface DragAndDropDiffer : ListUpdateCallback { - val flow: MutableSharedFlow + val channel: Channel> val updates: Queue> var items: R var dragging: Boolean val scope: CoroutineScope fun submitList(list: List) { - scope.launch { - val transform = transform(list) - flow.emit(transform) - } + channel.trySend(list) } fun calculateDiff(last: Pair, next: R): Pair { @@ -48,18 +55,16 @@ interface DragAndDropDiffer : ListUpdateCallback { @ExperimentalCoroutinesApi fun initializeDiffer(list: List): R { val initial = transform(list) - flow + channel + .consumeAsFlow() + .map { transform(it) } .scan(Pair(initial, null), { last: Pair, next: R -> calculateDiff(last, next) }) .drop(1) - .flowOn(Executors.newSingleThreadExecutor().asCoroutineDispatcher()) - .onEach { - withContext(Dispatchers.Main) { - applyDiff(it) - } - } - .launchIn(scope) + .flowOn(Dispatchers.Default) + .onEach { applyDiff(it) } + .launchIn(CoroutineScope(Dispatchers.Main + Job())) return initial } diff --git a/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt b/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt index ad08c6d9c..4bfaf3537 100644 --- a/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt +++ b/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt @@ -13,7 +13,7 @@ import com.todoroo.astrid.utility.Flags import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.asCoroutineDispatcher -import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.runBlocking import org.tasks.activities.DragAndDropDiffer import org.tasks.data.TaskContainer @@ -39,7 +39,7 @@ class DragAndDropRecyclerAdapter( private val itemTouchHelper = ItemTouchHelper(ItemTouchHelperCallback()).apply { attachToRecyclerView(recyclerView) } - override val flow = MutableSharedFlow() + override val channel = Channel>(Channel.UNLIMITED) override val updates: Queue> = LinkedList() override var dragging = false override val scope: CoroutineScope =