From 0566790257f9daaa6d7d127a4dbe687191d04e11 Mon Sep 17 00:00:00 2001 From: Jeff Boek Date: Wed, 27 May 2020 12:44:48 -0700 Subject: [PATCH] For #10496 - Automatically scroll to the selected tab when you open the tab tray --- .../java/org/mozilla/fenix/HomeActivity.kt | 17 ++++------ .../mozilla/fenix/tabtray/FenixTabsAdapter.kt | 31 +++++++++++++++++++ .../org/mozilla/fenix/tabtray/TabTrayView.kt | 18 +++++++++++ 3 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/tabtray/FenixTabsAdapter.kt diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 479088b27..1df930354 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -83,6 +83,7 @@ import org.mozilla.fenix.utils.RunWhenReadyQueue import mozilla.components.concept.tabstray.TabsTray import mozilla.components.browser.tabstray.TabsAdapter import mozilla.components.browser.tabstray.BrowserTabsTray +import org.mozilla.fenix.tabtray.FenixTabsAdapter import org.mozilla.fenix.tabtray.TabTrayViewHolder /** @@ -223,18 +224,12 @@ open class HomeActivity : LocaleAwareAppCompatActivity() { } }.asView() TabsTray::class.java.name -> { - val layout = LinearLayoutManager(context) - layout.reverseLayout = true - layout.stackFromEnd = true - - val adapter = TabsAdapter { parentView, _ -> - TabTrayViewHolder( - LayoutInflater.from(this).inflate( - R.layout.tab_tray_item, - parentView, - false) - ) + val layout = LinearLayoutManager(context).apply { + reverseLayout = true + stackFromEnd = true } + + val adapter = FenixTabsAdapter(context) val decoration = DividerItemDecoration( context, DividerItemDecoration.VERTICAL diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/FenixTabsAdapter.kt b/app/src/main/java/org/mozilla/fenix/tabtray/FenixTabsAdapter.kt new file mode 100644 index 000000000..3382a3c0d --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabtray/FenixTabsAdapter.kt @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.tabtray + +import android.content.Context +import android.view.LayoutInflater +import mozilla.components.browser.tabstray.TabsAdapter +import mozilla.components.concept.tabstray.Tabs +import org.mozilla.fenix.R + +class FenixTabsAdapter( + context: Context +) : TabsAdapter( + viewHolderProvider = { parentView, _ -> + TabTrayViewHolder( + LayoutInflater.from(context).inflate( + R.layout.tab_tray_item, + parentView, + false) + ) + } +) { + var onTabsUpdated: (() -> Unit)? = null + + override fun updateTabs(tabs: Tabs) { + super.updateTabs(tabs) + onTabsUpdated?.invoke() + } +} \ No newline at end of file diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt index 254d8c712..79a428602 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt @@ -57,6 +57,8 @@ class TabTrayView( private var tabsFeature: TabsFeature private var tabTrayItemMenu: TabTrayItemMenu + private var hasLoaded = false + override val containerView: View? get() = container @@ -98,8 +100,24 @@ class TabTrayView( { it.content.private == isPrivate }, { }) + + val selectedBrowserTabIndex = if (isPrivate) { + view.context.components.core.store.state.privateTabs + } else { + view.context.components.core.store.state.normalTabs + }.indexOfFirst { it.id == view.context.components.core.store.state.selectedTabId } + + (view.tabsTray as? BrowserTabsTray)?.also { tray -> TabsTouchHelper(tray.tabsAdapter).attachToRecyclerView(tray) + (tray.tabsAdapter as? FenixTabsAdapter)?.also { adapter -> + adapter.onTabsUpdated = { + if (!hasLoaded) { + hasLoaded = true + tray.layoutManager?.scrollToPosition(selectedBrowserTabIndex) + } + } + } } tabTrayItemMenu = TabTrayItemMenu(view.context, { view.tab_layout.selectedTabPosition == 0 }) {