From 4b21f52db4f816ff1cd17cb9dc1cf9a9e9100cac Mon Sep 17 00:00:00 2001 From: "codrut.topliceanu" Date: Thu, 5 Aug 2021 14:17:05 +0300 Subject: [PATCH] For #20310 - Adds Recently Closed button to tabsTray --- .../fenix/tabstray/TabsTrayController.kt | 14 ++++++ .../tabstray/browser/BrowserTrayInteractor.kt | 12 +++++ .../tabstray/browser/InactiveTabViewHolder.kt | 23 ++++++++++ .../tabstray/browser/InactiveTabsAdapter.kt | 13 +++++- .../layout/inactive_recently_closed_item.xml | 45 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/layout/inactive_recently_closed_item.xml diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt index e66174fce..d55d1cf2b 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt @@ -58,6 +58,11 @@ interface TabsTrayController { */ fun handleMultipleTabsDeletion(tabs: Collection) + /** + * Navigate from TabsTray to Recently Closed section in the History fragment. + */ + fun handleNavigateToRecentlyClosed() + /** * Set the list of [tabs] into the inactive state. * @@ -160,6 +165,15 @@ class DefaultTabsTrayController( showUndoSnackbarForTab(isPrivate) } + /** + * Dismisses the tabs tray and navigates to the Recently Closed section in the History fragment. + */ + override fun handleNavigateToRecentlyClosed() { + dismissTray() + + navController.navigate(R.id.recentlyClosedFragment) + } + /** * Marks all the [tabs] with the [TabSessionState.lastAccess] to 5 days; enough time to * have a tab considered as inactive. diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/BrowserTrayInteractor.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/BrowserTrayInteractor.kt index d4cf648e0..d1c4ad46f 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/browser/BrowserTrayInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/BrowserTrayInteractor.kt @@ -30,6 +30,11 @@ interface BrowserTrayInteractor : SelectionInteractor, UserInteractionHandl * TabTray's Floating Action Button clicked. */ fun onFabClicked(isPrivate: Boolean) + + /** + * Recently Closed item is clicked. + */ + fun onRecentlyClosedClicked() } /** @@ -103,4 +108,11 @@ class DefaultBrowserTrayInteractor( override fun onFabClicked(isPrivate: Boolean) { controller.handleOpeningNewTab(isPrivate) } + + /** + * See [BrowserTrayInteractor.onRecentlyClosedClicked] + */ + override fun onRecentlyClosedClicked() { + controller.handleNavigateToRecentlyClosed() + } } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabViewHolder.kt index b29012ce7..83a44e619 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabViewHolder.kt @@ -11,6 +11,7 @@ import mozilla.components.browser.toolbar.MAX_URI_LENGTH import mozilla.components.concept.tabstray.Tab import org.mozilla.fenix.R import org.mozilla.fenix.databinding.InactiveFooterItemBinding +import org.mozilla.fenix.databinding.InactiveRecentlyClosedItemBinding import org.mozilla.fenix.databinding.InactiveTabListItemBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.loadIntoView @@ -61,6 +62,28 @@ sealed class InactiveTabViewHolder(itemView: View) : RecyclerView.ViewHolder(ite } } + class RecentlyClosedHolder( + itemView: View, + private val browserTrayInteractor: BrowserTrayInteractor, + ) : InactiveTabViewHolder(itemView) { + + val binding = InactiveRecentlyClosedItemBinding.bind(itemView) + + fun bind() { + val context = itemView.context + binding.inactiveRecentlyClosedText.text = + context.getString(R.string.tab_tray_inactive_recently_closed) + + binding.inactiveRecentlyClosed.setOnClickListener { + browserTrayInteractor.onRecentlyClosedClicked() + } + } + + companion object { + const val LAYOUT_ID = R.layout.inactive_recently_closed_item + } + } + class FooterHolder(itemView: View) : InactiveTabViewHolder(itemView) { val binding = InactiveFooterItemBinding.bind(itemView) diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabsAdapter.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabsAdapter.kt index cdf93cffe..60e0d015e 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabsAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabsAdapter.kt @@ -15,6 +15,7 @@ import mozilla.components.concept.tabstray.TabsTray import mozilla.components.support.base.observer.ObserverRegistry import org.mozilla.fenix.tabstray.browser.InactiveTabViewHolder.FooterHolder import org.mozilla.fenix.tabstray.browser.InactiveTabViewHolder.HeaderHolder +import org.mozilla.fenix.tabstray.browser.InactiveTabViewHolder.RecentlyClosedHolder import org.mozilla.fenix.tabstray.browser.InactiveTabViewHolder.TabViewHolder import org.mozilla.fenix.tabstray.ext.autoCloseInterval import mozilla.components.support.base.observer.Observable as ComponentObservable @@ -46,6 +47,7 @@ class InactiveTabsAdapter( HeaderHolder.LAYOUT_ID -> HeaderHolder(view) TabViewHolder.LAYOUT_ID -> TabViewHolder(view, browserTrayInteractor) FooterHolder.LAYOUT_ID -> FooterHolder(view) + RecentlyClosedHolder.LAYOUT_ID -> RecentlyClosedHolder(view, browserTrayInteractor) else -> throw IllegalStateException("Unknown viewType: $viewType") } } @@ -63,12 +65,16 @@ class InactiveTabsAdapter( is HeaderHolder -> { // do nothing. } + is RecentlyClosedHolder -> { + holder.bind() + } } } override fun getItemViewType(position: Int): Int { return when (position) { 0 -> HeaderHolder.LAYOUT_ID + itemCount - 2 -> RecentlyClosedHolder.LAYOUT_ID itemCount - 1 -> FooterHolder.LAYOUT_ID else -> TabViewHolder.LAYOUT_ID } @@ -84,7 +90,7 @@ class InactiveTabsAdapter( val items = tabs.list.map { Item.Tab(it) } val footer = Item.Footer(context.autoCloseInterval) - submitList(listOf(Item.Header) + items + listOf(footer)) + submitList(listOf(Item.Header) + items + listOf(Item.RecentlyClosed, footer)) } override fun isTabSelected(tabs: Tabs, position: Int): Boolean = false @@ -123,6 +129,11 @@ class InactiveTabsAdapter( */ data class Tab(val tab: TabsTrayTab) : Item() + /** + * A button that leads to the Recently Closed section in History. + */ + object RecentlyClosed : Item() + /** * A footer for the inactive tab section. This may be seen only * when at least one inactive tab is present. diff --git a/app/src/main/res/layout/inactive_recently_closed_item.xml b/app/src/main/res/layout/inactive_recently_closed_item.xml new file mode 100644 index 000000000..0c008f109 --- /dev/null +++ b/app/src/main/res/layout/inactive_recently_closed_item.xml @@ -0,0 +1,45 @@ + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bdf984dff..ac4ef65cc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -641,6 +641,8 @@ Share all tabs Recently closed tabs + + Recently closed Account settings