1
0
Fork 0

For #3275 - Adds PendingSessionDeletion data class to handle multiple emit session calls (#3393)

master
Emily Kager 2019-06-12 10:49:20 -07:00 committed by Sawyer Blatz
parent 80e7868fd7
commit 186983b786
1 changed files with 23 additions and 26 deletions

View File

@ -90,15 +90,19 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver {
private val singleSessionObserver = object : Session.Observer {
override fun onTitleChanged(session: Session, title: String) {
super.onTitleChanged(session, title)
emitSessionChanges()
if (deleteAllSessionsJob != null) return
emitSessionChanges(pendingSessionDeletion?.sessionId)
}
}
private lateinit var sessionObserver: BrowserSessionsObserver
private var homeMenu: HomeMenu? = null
var deleteAllSessionsJob: (suspend () -> Unit)? = null
var deleteSessionJob: (suspend () -> Unit)? = null
private var pendingSessionDeletion: PendingSessionDeletion? = null
data class PendingSessionDeletion(val deletionJob: (suspend () -> Unit), val sessionId: String)
private val onboarding by lazy { FenixOnboarding(requireContext()) }
private lateinit var sessionControlComponent: SessionControlComponent
@ -340,12 +344,12 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver {
nav(R.id.homeFragment, directions, extras)
}
is TabAction.Close -> {
if (deleteSessionJob == null) removeTabWithUndo(action.sessionId) else {
deleteSessionJob?.let {
if (pendingSessionDeletion?.deletionJob == null) removeTabWithUndo(action.sessionId) else {
pendingSessionDeletion?.deletionJob?.let {
launch {
it.invoke()
}.invokeOnCompletion {
deleteSessionJob = null
pendingSessionDeletion = null
removeTabWithUndo(action.sessionId)
}
}
@ -384,11 +388,11 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver {
}
private fun invokePendingDeleteJobs() {
deleteSessionJob?.let {
pendingSessionDeletion?.deletionJob?.let {
launch {
it.invoke()
}.invokeOnCompletion {
deleteSessionJob = null
pendingSessionDeletion = null
}
}
@ -555,7 +559,8 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver {
deleteAllSessionsJob = deleteOperation
allowUndo(
view!!, getString(R.string.snackbar_tabs_deleted),
view!!,
getString(R.string.snackbar_tabs_deleted),
getString(R.string.snackbar_deleted_undo), {
deleteAllSessionsJob = null
emitSessionChanges()
@ -568,52 +573,44 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver {
val sessionManager = requireComponents.core.sessionManager
// Update the UI with the tab removed, but don't remove it from storage yet
getManagedEmitter<SessionControlChange>().onNext(
SessionControlChange.TabsChange(
sessionManager.sessions
.filter { (activity as HomeActivity).browsingModeManager.isPrivate == it.private }
.filter { it.id != sessionId }
.map {
val selected = it == sessionManager.selectedSession
it.toTab(context!!, selected)
}
)
)
emitSessionChanges(sessionId)
val deleteOperation: (suspend () -> Unit) = {
sessionManager.findSessionById(sessionId)
?.let { session ->
pendingSessionDeletion = null
sessionManager.remove(session)
}
}
deleteSessionJob = deleteOperation
pendingSessionDeletion = PendingSessionDeletion(deleteOperation, sessionId)
allowUndo(
view!!, getString(R.string.snackbar_tab_deleted),
view!!,
getString(R.string.snackbar_tab_deleted),
getString(R.string.snackbar_deleted_undo), {
deleteSessionJob = null
pendingSessionDeletion = null
emitSessionChanges()
},
operation = deleteOperation
)
}
private fun emitSessionChanges() {
private fun emitSessionChanges(pendingDeletionSessionId: String? = null) {
val sessionManager = context?.components?.core?.sessionManager ?: return
getManagedEmitter<SessionControlChange>().onNext(
SessionControlChange.TabsChange(
getListOfTabs(sessionManager)
getListOfTabs(sessionManager, pendingDeletionSessionId)
)
)
}
private fun getListOfTabs(sessionManager: SessionManager): List<Tab> {
private fun getListOfTabs(sessionManager: SessionManager, pendingDeletionSessionId: String? = null): List<Tab> {
val context = context ?: return listOf()
return sessionManager.sessions
.filter { (activity as HomeActivity).browsingModeManager.isPrivate == it.private }
.filter { pendingDeletionSessionId != it.id }
.map {
val selected = it == sessionManager.selectedSession
it.toTab(context, selected)