diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt index 17e5a0517f..361e477865 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -276,7 +276,8 @@ class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor { store, browserInteractor, syncedTabsTrayInteractor, - trayInteractor + trayInteractor, + requireComponents.core.store ) isUserInputEnabled = false } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt index 668e9662c0..8c09e439cd 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt @@ -8,13 +8,17 @@ import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import mozilla.components.browser.state.selector.normalTabs +import mozilla.components.browser.state.selector.privateTabs +import mozilla.components.browser.state.selector.selectedTab +import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.feature.syncedtabs.view.SyncedTabsView +import org.mozilla.fenix.sync.SyncedTabsAdapter import org.mozilla.fenix.tabstray.browser.BrowserTabsAdapter import org.mozilla.fenix.tabstray.browser.BrowserTrayInteractor import org.mozilla.fenix.tabstray.viewholders.AbstractTrayViewHolder import org.mozilla.fenix.tabstray.viewholders.NormalBrowserTabViewHolder import org.mozilla.fenix.tabstray.viewholders.PrivateBrowserTabViewHolder -import mozilla.components.feature.syncedtabs.view.SyncedTabsView -import org.mozilla.fenix.sync.SyncedTabsAdapter import org.mozilla.fenix.tabstray.viewholders.SyncedTabViewHolder class TrayPagerAdapter( @@ -22,7 +26,8 @@ class TrayPagerAdapter( private val store: TabsTrayStore, private val browserInteractor: BrowserTrayInteractor, private val syncedTabsInteractor: SyncedTabsView.Listener, - private val interactor: TabsTrayInteractor + private val interactor: TabsTrayInteractor, + private val browserStore: BrowserStore ) : RecyclerView.Adapter() { private val normalAdapter by lazy { BrowserTabsAdapter(context, browserInteractor, store) } @@ -32,21 +37,31 @@ class TrayPagerAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AbstractTrayViewHolder { val itemView = LayoutInflater.from(parent.context).inflate(viewType, parent, false) + val selectedTab = browserStore.state.selectedTab + return when (viewType) { - NormalBrowserTabViewHolder.LAYOUT_ID -> NormalBrowserTabViewHolder( - itemView, - store, - interactor - ) - PrivateBrowserTabViewHolder.LAYOUT_ID -> PrivateBrowserTabViewHolder( - itemView, - store, - interactor - ) - SyncedTabViewHolder.LAYOUT_ID -> SyncedTabViewHolder( - itemView, - syncedTabsInteractor - ) + NormalBrowserTabViewHolder.LAYOUT_ID -> { + NormalBrowserTabViewHolder( + itemView, + store, + interactor, + browserStore.state.normalTabs.indexOf(selectedTab) + ) + } + PrivateBrowserTabViewHolder.LAYOUT_ID -> { + PrivateBrowserTabViewHolder( + itemView, + store, + interactor, + browserStore.state.privateTabs.indexOf(selectedTab) + ) + } + SyncedTabViewHolder.LAYOUT_ID -> { + SyncedTabViewHolder( + itemView, + syncedTabsInteractor + ) + } else -> throw IllegalStateException("Unknown viewType.") } } @@ -58,7 +73,6 @@ class TrayPagerAdapter( POSITION_SYNCED_TABS -> syncedTabsAdapter else -> throw IllegalStateException("View type does not exist.") } - viewHolder.bind(adapter, browserInteractor.getLayoutManagerForPosition(context, position)) } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolder.kt index f3a432ad67..f22b1c418c 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolder.kt @@ -17,8 +17,9 @@ import org.mozilla.fenix.tabstray.browser.BaseBrowserTrayList */ abstract class BaseBrowserTabViewHolder( containerView: View, + tabsTrayStore: TabsTrayStore, interactor: TabsTrayInteractor, - tabsTrayStore: TabsTrayStore + private val currentTabIndex: Int ) : AbstractTrayViewHolder(containerView) { private val trayList: BaseBrowserTrayList = itemView.findViewById(R.id.tray_list_item) @@ -33,7 +34,24 @@ abstract class BaseBrowserTabViewHolder( adapter: RecyclerView.Adapter, layoutManager: RecyclerView.LayoutManager ) { + adapter.registerAdapterDataObserver(OneTimeAdapterObserver(adapter) { + trayList.scrollToPosition(currentTabIndex) + }) + trayList.layoutManager = layoutManager trayList.adapter = adapter } } + +/** + * Observes the adapter and invokes the callback when data is first inserted. + */ +class OneTimeAdapterObserver( + private val adapter: RecyclerView.Adapter, + private val onAdapterReady: () -> Unit +) : RecyclerView.AdapterDataObserver() { + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { + onAdapterReady.invoke() + adapter.unregisterAdapterDataObserver(this) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/NormalBrowserTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/NormalBrowserTabViewHolder.kt index dc129ad72a..99702c5264 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/NormalBrowserTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/NormalBrowserTabViewHolder.kt @@ -19,8 +19,14 @@ import org.mozilla.fenix.tabstray.browser.BrowserTabsAdapter class NormalBrowserTabViewHolder( containerView: View, private val store: TabsTrayStore, - interactor: TabsTrayInteractor -) : BaseBrowserTabViewHolder(containerView, interactor, store), SelectionHolder { + interactor: TabsTrayInteractor, + currentTabIndex: Int +) : BaseBrowserTabViewHolder( + containerView, + store, + interactor, + currentTabIndex +), SelectionHolder { /** * Holds the list of selected tabs. diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/PrivateBrowserTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/PrivateBrowserTabViewHolder.kt index f32f44437d..e5017ff105 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/PrivateBrowserTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/PrivateBrowserTabViewHolder.kt @@ -15,8 +15,14 @@ import org.mozilla.fenix.tabstray.TabsTrayStore class PrivateBrowserTabViewHolder( containerView: View, store: TabsTrayStore, - interactor: TabsTrayInteractor -) : BaseBrowserTabViewHolder(containerView, interactor, store) { + interactor: TabsTrayInteractor, + currentTabIndex: Int +) : BaseBrowserTabViewHolder( + containerView, + store, + interactor, + currentTabIndex +) { companion object { const val LAYOUT_ID = R.layout.private_browser_tray_list }