Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b65da76a authored by Liran Binyamin's avatar Liran Binyamin
Browse files

Use a SupervisorJob in BubbleDataRepository

Using a SupervisorJob ensures that if child coroutines
fail, the scope remains active and we can launch further
coroutines in it.

Also renamed the scope field to exclude io from it. Scopes
should be tied to lifetime of objects, not to dispatchers

Bug: 281083629
Test: Verified that bubbles are still persisted after adding
      new bubbles and reordering them.
Change-Id: I38cc755d5496bfd636d8a4e26f93a26843b0508a
parent 4b3863df
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import com.android.wm.shell.common.ShellExecutor
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancelAndJoin
import kotlinx.coroutines.launch
import kotlinx.coroutines.yield
@@ -45,7 +46,7 @@ internal class BubbleDataRepository(
    private val volatileRepository = BubbleVolatileRepository(launcherApps)
    private val persistentRepository = BubblePersistentRepository(context)

    private val ioScope = CoroutineScope(Dispatchers.IO)
    private val coroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
    private var job: Job? = null

    // For use in Bubble construction.
@@ -131,7 +132,7 @@ internal class BubbleDataRepository(
     */
    private fun persistToDisk() {
        val prev = job
        job = ioScope.launch {
        job = coroutineScope.launch {
            // if there was an ongoing disk I/O operation, they can be cancelled
            prev?.cancelAndJoin()
            // check for cancellation before disk I/O
@@ -148,7 +149,7 @@ internal class BubbleDataRepository(
     *           bubbles.
     */
    @SuppressLint("WrongConstant")
    fun loadBubbles(userId: Int, cb: (List<Bubble>) -> Unit) = ioScope.launch {
    fun loadBubbles(userId: Int, cb: (List<Bubble>) -> Unit) = coroutineScope.launch {
        /**
         * Load BubbleEntity from disk.
         * e.g.