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 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()
}

View File

@ -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() }