1
0
Fork 0

For #2277 - Clean up threading for session control with undo (#2281)

master
Emily Kager 2019-05-05 07:54:45 -07:00 committed by Colin Lee
parent 6b349a535a
commit 0000d6a782
2 changed files with 27 additions and 9 deletions

View File

@ -6,7 +6,6 @@ package org.mozilla.fenix.ext
import android.view.View import android.view.View
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -19,7 +18,7 @@ fun CoroutineScope.allowUndo(
onCancel: suspend () -> Unit = {}, onCancel: suspend () -> Unit = {},
operation: suspend () -> Unit operation: suspend () -> Unit
) { ) {
val undoJob = launch(IO) { val undoJob = launch(Main) {
delay(UNDO_DELAY) delay(UNDO_DELAY)
operation.invoke() operation.invoke()
} }

View File

@ -7,28 +7,28 @@ package org.mozilla.fenix.home
import android.content.res.Resources import android.content.res.Resources
import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.BitmapDrawable
import android.os.Bundle 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.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.PARENT_ID
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.ViewModelProviders
import androidx.navigation.Navigation import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.fragment_home.*
import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.fragment_home.view.*
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import mozilla.components.browser.menu.BrowserMenu import mozilla.components.browser.menu.BrowserMenu
import mozilla.components.browser.session.Session import mozilla.components.browser.session.Session
import mozilla.components.browser.session.SessionManager 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.jetbrains.anko.constraint.layout.applyConstraintSet
import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.BrowsingModeManager import org.mozilla.fenix.BrowsingModeManager
@ -64,6 +64,9 @@ class HomeFragment : Fragment(), CoroutineScope {
private val bus = ActionBusFactory.get(this) private val bus = ActionBusFactory.get(this)
private var sessionObserver: SessionManager.Observer? = null private var sessionObserver: SessionManager.Observer? = null
private var homeMenu: HomeMenu? = null private var homeMenu: HomeMenu? = null
var deleteSessionJob: (suspend () -> Unit)? = null
private lateinit var sessionControlComponent: SessionControlComponent private lateinit var sessionControlComponent: SessionControlComponent
private lateinit var job: Job private lateinit var job: Job
@ -203,7 +206,16 @@ class HomeFragment : Fragment(), CoroutineScope {
(activity as HomeActivity).openToBrowser(BrowserDirection.FromHome) (activity as HomeActivity).openToBrowser(BrowserDirection.FromHome)
} }
is TabAction.Close -> { 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 -> { is TabAction.Share -> {
requireComponents.core.sessionManager.findSessionById(action.sessionId) 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( CoroutineScope(Dispatchers.Main).allowUndo(
view!!, getString(R.string.snackbar_tab_deleted), view!!, getString(R.string.snackbar_tab_deleted),
getString(R.string.snackbar_deleted_undo), { emitSessionChanges() } getString(R.string.snackbar_deleted_undo), { emitSessionChanges() }