From 0000d6a7825666df6337822331d830cfbedb6d23 Mon Sep 17 00:00:00 2001 From: Emily Kager Date: Sun, 5 May 2019 07:54:45 -0700 Subject: [PATCH] For #2277 - Clean up threading for session control with undo (#2281) --- .../org/mozilla/fenix/ext/CoroutineScope.kt | 3 +- .../org/mozilla/fenix/home/HomeFragment.kt | 33 +++++++++++++++---- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/ext/CoroutineScope.kt b/app/src/main/java/org/mozilla/fenix/ext/CoroutineScope.kt index 2859a501b..925feef3b 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/CoroutineScope.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/CoroutineScope.kt @@ -6,7 +6,6 @@ package org.mozilla.fenix.ext import android.view.View import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -19,7 +18,7 @@ fun CoroutineScope.allowUndo( onCancel: suspend () -> Unit = {}, operation: suspend () -> Unit ) { - val undoJob = launch(IO) { + val undoJob = launch(Main) { delay(UNDO_DELAY) operation.invoke() } diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index e3ac40ab9..b588172c9 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -7,28 +7,28 @@ package org.mozilla.fenix.home import android.content.res.Resources import android.graphics.drawable.BitmapDrawable import android.os.Bundle -import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.BOTTOM -import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.TOP -import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.START -import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.END -import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.PARENT_ID import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.PARENT_ID import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProviders import androidx.navigation.Navigation import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import mozilla.components.browser.menu.BrowserMenu import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager +import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.BOTTOM +import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.END +import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.START +import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.TOP import org.jetbrains.anko.constraint.layout.applyConstraintSet import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.BrowsingModeManager @@ -64,6 +64,9 @@ class HomeFragment : Fragment(), CoroutineScope { private val bus = ActionBusFactory.get(this) private var sessionObserver: SessionManager.Observer? = null private var homeMenu: HomeMenu? = null + + var deleteSessionJob: (suspend () -> Unit)? = null + private lateinit var sessionControlComponent: SessionControlComponent private lateinit var job: Job @@ -203,7 +206,16 @@ class HomeFragment : Fragment(), CoroutineScope { (activity as HomeActivity).openToBrowser(BrowserDirection.FromHome) } is TabAction.Close -> { - removeTabWithUndo(action.sessionId) + if (deleteSessionJob == null) removeTabWithUndo(action.sessionId) else { + deleteSessionJob?.let { + launch { + it.invoke() + }.invokeOnCompletion { + deleteSessionJob = null + removeTabWithUndo(action.sessionId) + } + } + } } is TabAction.Share -> { requireComponents.core.sessionManager.findSessionById(action.sessionId) @@ -323,6 +335,13 @@ class HomeFragment : Fragment(), CoroutineScope { ) ) + deleteSessionJob = { + sessionManager.findSessionById(sessionId) + ?.let { session -> + sessionManager.remove(session) + } + } + CoroutineScope(Dispatchers.Main).allowUndo( view!!, getString(R.string.snackbar_tab_deleted), getString(R.string.snackbar_deleted_undo), { emitSessionChanges() }