From a2493349762fec536ed40439168e44ec2c57287a Mon Sep 17 00:00:00 2001 From: Jeff Boek Date: Mon, 11 May 2020 15:18:09 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=B2=20For=20#10332=20-=20Adds=20undo?= =?UTF-8?q?=20snackbar=20when=20closing=20tabs=20in=20the=20tab=20tray=20(?= =?UTF-8?q?#10456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mozilla/fenix/tabtray/TabTrayFragment.kt | 70 ++++++- app/src/main/res/layout/fragment_tab_tray.xml | 197 +++++++++--------- 2 files changed, 164 insertions(+), 103 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayFragment.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayFragment.kt index 83494cdc4..ad0b4708c 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayFragment.kt @@ -12,6 +12,7 @@ import android.view.View import androidx.core.view.isVisible import mozilla.components.concept.engine.prompt.ShareData import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope import mozilla.components.feature.tabs.tabstray.TabsFeature import kotlinx.android.synthetic.main.fragment_tab_tray.tabsTray import kotlinx.android.synthetic.main.fragment_tab_tray.view.* @@ -32,6 +33,7 @@ import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.sessionsOfType import org.mozilla.fenix.ext.showToolbar +import org.mozilla.fenix.utils.allowUndo @SuppressWarnings("TooManyFunctions", "LargeClass") class TabTrayFragment : Fragment(R.layout.fragment_tab_tray), TabsTray.Observer, UserInteractionHandler { @@ -130,16 +132,47 @@ class TabTrayFragment : Fragment(R.layout.fragment_tab_tray), TabsTray.Observer, true } R.id.tab_tray_close_menu_item -> { - val tabs = getListOfSessions() - tabs.forEach { - sessionManager.remove(it) - } + closeAllTabs() true } else -> super.onOptionsItemSelected(item) } } + private fun closeAllTabs() { + val tabs = getListOfSessions() + + val selectedIndex = sessionManager + .selectedSession?.let { sessionManager.sessions.indexOf(it) } ?: 0 + + val snapshot = tabs + .map(sessionManager::createSessionSnapshot) + .map { it.copy(engineSession = null, engineSessionState = it.engineSession?.saveState()) } + .let { SessionManager.Snapshot(it, selectedIndex) } + + tabs.forEach { + sessionManager.remove(it) + } + + val isPrivate = (activity as HomeActivity).browsingModeManager.mode.isPrivate + val snackbarMessage = if (isPrivate) { + getString(R.string.snackbar_private_tabs_closed) + } else { + getString(R.string.snackbar_tabs_closed) + } + + viewLifecycleOwner.lifecycleScope.allowUndo( + requireView(), + snackbarMessage, + getString(R.string.snackbar_deleted_undo), + { + sessionManager.restore(snapshot) + }, + operation = { }, + anchorView = view?.tab_tray_controls + ) + } + private fun saveToCollection() { val tabs = getListOfSessions() val tabIds = tabs.map { it.id }.toList().toTypedArray() @@ -169,15 +202,15 @@ class TabTrayFragment : Fragment(R.layout.fragment_tab_tray), TabsTray.Observer, override fun onStart() { super.onStart() - tabsFeature?.start() tabsTray.register(this) + tabsFeature?.start() } override fun onStop() { super.onStop() - tabsFeature?.stop() tabsTray.unregister(this) + tabsFeature?.stop() } override fun onBackPressed(): Boolean { @@ -196,7 +229,30 @@ class TabTrayFragment : Fragment(R.layout.fragment_tab_tray), TabsTray.Observer, } override fun onTabClosed(tab: Tab) { - // noop + val snapshot = sessionManager + .findSessionById(tab.id)?.let { + sessionManager.createSessionSnapshot(it) + } ?: return + + val state = snapshot.engineSession?.saveState() + val isSelected = tab.id == requireComponents.core.store.state.selectedTabId ?: false + + val snackbarMessage = if (snapshot.session.private) { + getString(R.string.snackbar_private_tab_closed) + } else { + getString(R.string.snackbar_tab_closed) + } + + viewLifecycleOwner.lifecycleScope.allowUndo( + requireView(), + snackbarMessage, + getString(R.string.snackbar_deleted_undo), + { + sessionManager.add(snapshot.session, isSelected, engineSessionState = state) + }, + operation = { }, + anchorView = view?.tab_tray_controls + ) } override fun onTabSelected(tab: Tab) { diff --git a/app/src/main/res/layout/fragment_tab_tray.xml b/app/src/main/res/layout/fragment_tab_tray.xml index 0a4643bda..6f77a32f0 100644 --- a/app/src/main/res/layout/fragment_tab_tray.xml +++ b/app/src/main/res/layout/fragment_tab_tray.xml @@ -2,109 +2,114 @@ - - - - - + + android:layout_height="match_parent" + android:background="?tabTrayItemBackground"> - + - + - + - + - + - - + + + + + + + \ No newline at end of file