For #18521 - Added scroll to current tab (#19021)

* For #18521 - Added scroll to current tab

* For #18521 - Addressed comments
upstream-sync
Codrut Topliceanu 3 years ago committed by GitHub
parent a3f4cee388
commit d8660341a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -276,7 +276,8 @@ class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor {
store, store,
browserInteractor, browserInteractor,
syncedTabsTrayInteractor, syncedTabsTrayInteractor,
trayInteractor trayInteractor,
requireComponents.core.store
) )
isUserInputEnabled = false isUserInputEnabled = false
} }

@ -8,13 +8,17 @@ import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView 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.BrowserTabsAdapter
import org.mozilla.fenix.tabstray.browser.BrowserTrayInteractor import org.mozilla.fenix.tabstray.browser.BrowserTrayInteractor
import org.mozilla.fenix.tabstray.viewholders.AbstractTrayViewHolder import org.mozilla.fenix.tabstray.viewholders.AbstractTrayViewHolder
import org.mozilla.fenix.tabstray.viewholders.NormalBrowserTabViewHolder import org.mozilla.fenix.tabstray.viewholders.NormalBrowserTabViewHolder
import org.mozilla.fenix.tabstray.viewholders.PrivateBrowserTabViewHolder 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 import org.mozilla.fenix.tabstray.viewholders.SyncedTabViewHolder
class TrayPagerAdapter( class TrayPagerAdapter(
@ -22,7 +26,8 @@ class TrayPagerAdapter(
private val store: TabsTrayStore, private val store: TabsTrayStore,
private val browserInteractor: BrowserTrayInteractor, private val browserInteractor: BrowserTrayInteractor,
private val syncedTabsInteractor: SyncedTabsView.Listener, private val syncedTabsInteractor: SyncedTabsView.Listener,
private val interactor: TabsTrayInteractor private val interactor: TabsTrayInteractor,
private val browserStore: BrowserStore
) : RecyclerView.Adapter<AbstractTrayViewHolder>() { ) : RecyclerView.Adapter<AbstractTrayViewHolder>() {
private val normalAdapter by lazy { BrowserTabsAdapter(context, browserInteractor, store) } private val normalAdapter by lazy { BrowserTabsAdapter(context, browserInteractor, store) }
@ -32,21 +37,31 @@ class TrayPagerAdapter(
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AbstractTrayViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AbstractTrayViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(viewType, parent, false) val itemView = LayoutInflater.from(parent.context).inflate(viewType, parent, false)
val selectedTab = browserStore.state.selectedTab
return when (viewType) { return when (viewType) {
NormalBrowserTabViewHolder.LAYOUT_ID -> NormalBrowserTabViewHolder( NormalBrowserTabViewHolder.LAYOUT_ID -> {
itemView, NormalBrowserTabViewHolder(
store, itemView,
interactor store,
) interactor,
PrivateBrowserTabViewHolder.LAYOUT_ID -> PrivateBrowserTabViewHolder( browserStore.state.normalTabs.indexOf(selectedTab)
itemView, )
store, }
interactor PrivateBrowserTabViewHolder.LAYOUT_ID -> {
) PrivateBrowserTabViewHolder(
SyncedTabViewHolder.LAYOUT_ID -> SyncedTabViewHolder( itemView,
itemView, store,
syncedTabsInteractor interactor,
) browserStore.state.privateTabs.indexOf(selectedTab)
)
}
SyncedTabViewHolder.LAYOUT_ID -> {
SyncedTabViewHolder(
itemView,
syncedTabsInteractor
)
}
else -> throw IllegalStateException("Unknown viewType.") else -> throw IllegalStateException("Unknown viewType.")
} }
} }
@ -58,7 +73,6 @@ class TrayPagerAdapter(
POSITION_SYNCED_TABS -> syncedTabsAdapter POSITION_SYNCED_TABS -> syncedTabsAdapter
else -> throw IllegalStateException("View type does not exist.") else -> throw IllegalStateException("View type does not exist.")
} }
viewHolder.bind(adapter, browserInteractor.getLayoutManagerForPosition(context, position)) viewHolder.bind(adapter, browserInteractor.getLayoutManagerForPosition(context, position))
} }

@ -17,8 +17,9 @@ import org.mozilla.fenix.tabstray.browser.BaseBrowserTrayList
*/ */
abstract class BaseBrowserTabViewHolder( abstract class BaseBrowserTabViewHolder(
containerView: View, containerView: View,
tabsTrayStore: TabsTrayStore,
interactor: TabsTrayInteractor, interactor: TabsTrayInteractor,
tabsTrayStore: TabsTrayStore private val currentTabIndex: Int
) : AbstractTrayViewHolder(containerView) { ) : AbstractTrayViewHolder(containerView) {
private val trayList: BaseBrowserTrayList = itemView.findViewById(R.id.tray_list_item) private val trayList: BaseBrowserTrayList = itemView.findViewById(R.id.tray_list_item)
@ -33,7 +34,24 @@ abstract class BaseBrowserTabViewHolder(
adapter: RecyclerView.Adapter<out RecyclerView.ViewHolder>, adapter: RecyclerView.Adapter<out RecyclerView.ViewHolder>,
layoutManager: RecyclerView.LayoutManager layoutManager: RecyclerView.LayoutManager
) { ) {
adapter.registerAdapterDataObserver(OneTimeAdapterObserver(adapter) {
trayList.scrollToPosition(currentTabIndex)
})
trayList.layoutManager = layoutManager trayList.layoutManager = layoutManager
trayList.adapter = adapter trayList.adapter = adapter
} }
} }
/**
* Observes the adapter and invokes the callback when data is first inserted.
*/
class OneTimeAdapterObserver(
private val adapter: RecyclerView.Adapter<out RecyclerView.ViewHolder>,
private val onAdapterReady: () -> Unit
) : RecyclerView.AdapterDataObserver() {
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
onAdapterReady.invoke()
adapter.unregisterAdapterDataObserver(this)
}
}

@ -19,8 +19,14 @@ import org.mozilla.fenix.tabstray.browser.BrowserTabsAdapter
class NormalBrowserTabViewHolder( class NormalBrowserTabViewHolder(
containerView: View, containerView: View,
private val store: TabsTrayStore, private val store: TabsTrayStore,
interactor: TabsTrayInteractor interactor: TabsTrayInteractor,
) : BaseBrowserTabViewHolder(containerView, interactor, store), SelectionHolder<Tab> { currentTabIndex: Int
) : BaseBrowserTabViewHolder(
containerView,
store,
interactor,
currentTabIndex
), SelectionHolder<Tab> {
/** /**
* Holds the list of selected tabs. * Holds the list of selected tabs.

@ -15,8 +15,14 @@ import org.mozilla.fenix.tabstray.TabsTrayStore
class PrivateBrowserTabViewHolder( class PrivateBrowserTabViewHolder(
containerView: View, containerView: View,
store: TabsTrayStore, store: TabsTrayStore,
interactor: TabsTrayInteractor interactor: TabsTrayInteractor,
) : BaseBrowserTabViewHolder(containerView, interactor, store) { currentTabIndex: Int
) : BaseBrowserTabViewHolder(
containerView,
store,
interactor,
currentTabIndex
) {
companion object { companion object {
const val LAYOUT_ID = R.layout.private_browser_tray_list const val LAYOUT_ID = R.layout.private_browser_tray_list
} }

Loading…
Cancel
Save