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,
browserInteractor,
syncedTabsTrayInteractor,
trayInteractor
trayInteractor,
requireComponents.core.store
)
isUserInputEnabled = false
}

@ -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<AbstractTrayViewHolder>() {
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))
}

@ -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<out RecyclerView.ViewHolder>,
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<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(
containerView: View,
private val store: TabsTrayStore,
interactor: TabsTrayInteractor
) : BaseBrowserTabViewHolder(containerView, interactor, store), SelectionHolder<Tab> {
interactor: TabsTrayInteractor,
currentTabIndex: Int
) : BaseBrowserTabViewHolder(
containerView,
store,
interactor,
currentTabIndex
), SelectionHolder<Tab> {
/**
* Holds the list of selected tabs.

@ -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
}

Loading…
Cancel
Save