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 6ff6c8ebc..c6a097b35 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -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().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().onNext( SessionControlChange.TabsChange( - getListOfTabs(sessionManager) + getListOfTabs(sessionManager, pendingDeletionSessionId) ) ) } - private fun getListOfTabs(sessionManager: SessionManager): List { + private fun getListOfTabs(sessionManager: SessionManager, pendingDeletionSessionId: String? = null): List { 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)