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