For #16424 - Focus the right item in tabs tray when using Talkback (#16472)

To get the index of the current selected browser tab when using reverse layout
we should also account for items placed below of the browser tabs.
The patch here unifies the logic already used for some calls but not all.
This commit is contained in:
Mugurell 2020-11-10 15:10:50 +02:00 committed by GitHub
parent 6e4393a199
commit 5e58377948
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 23 deletions

View File

@ -291,7 +291,7 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler
getString(R.string.snackbar_deleted_undo),
{
requireComponents.useCases.tabsUseCases.undo.invoke()
_tabTrayView?.scrollToTab(tab.id)
_tabTrayView?.scrollToSelectedBrowserTab(tab.id)
},
operation = { },
elevation = ELEVATION,

View File

@ -157,9 +157,6 @@ class TabTrayView(
val tabs = getTabs(isPrivate)
val selectedBrowserTabIndex = tabs
.indexOfFirst { it.id == view.context.components.core.store.state.selectedTabId }
updateBottomSheetBehavior()
setTopOffset(isInLandscape())
@ -208,14 +205,14 @@ class TabTrayView(
}
if (!hasLoaded) {
hasLoaded = true
scrollToTab(view.context.components.core.store.state.selectedTabId)
scrollToSelectedBrowserTab()
if (view.context.settings().accessibilityServicesEnabled) {
lifecycleScope.launch {
delay(SELECTION_DELAY.toLong())
lifecycleScope.launch(Main) {
layoutManager?.findViewByPosition(selectedBrowserTabIndex)
layoutManager?.findViewByPosition(getSelectedBrowserTabViewIndex())
?.requestFocus()
layoutManager?.findViewByPosition(selectedBrowserTabIndex)
layoutManager?.findViewByPosition(getSelectedBrowserTabViewIndex())
?.sendAccessibilityEvent(
AccessibilityEvent.TYPE_VIEW_FOCUSED
)
@ -367,7 +364,7 @@ class TabTrayView(
toggleSaveToCollectionButton(isPrivateModeSelected)
updateUINormalMode(view.context.components.core.store.state)
scrollToTab(view.context.components.core.store.state.selectedTabId)
scrollToSelectedBrowserTab()
if (isPrivateModeSelected) {
components.analytics.metrics.track(Event.TabsTrayPrivateModeTapped)
@ -682,22 +679,9 @@ class TabTrayView(
return interactor.onBackPressed()
}
fun scrollToTab(sessionId: String?) {
fun scrollToSelectedBrowserTab(selectedTabId: String? = null) {
view.tabsTray.apply {
val tabs = if (isPrivateModeSelected) {
view.context.components.core.store.state.privateTabs
} else {
view.context.components.core.store.state.normalTabs
}
val selectedBrowserTabIndex = tabs
.indexOfFirst { it.id == sessionId }
// We offset the tab index by the number of items in the other adapters.
// We add the offset, because the layoutManager is initialized with `reverseLayout`.
val recyclerViewIndex = selectedBrowserTabIndex +
collectionsButtonAdapter.itemCount +
syncedTabsController.adapter.itemCount
val recyclerViewIndex = getSelectedBrowserTabViewIndex(selectedTabId)
layoutManager?.scrollToPosition(recyclerViewIndex)
smoothScrollBy(
@ -707,6 +691,30 @@ class TabTrayView(
}
}
private fun getSelectedBrowserTabViewIndex(sessionId: String? = null): Int {
val tabs = if (isPrivateModeSelected) {
view.context.components.core.store.state.privateTabs
} else {
view.context.components.core.store.state.normalTabs
}
val selectedBrowserTabIndex = if (sessionId != null) {
tabs.indexOfFirst { it.id == sessionId }
} else {
tabs.indexOfFirst { it.id == view.context.components.core.store.state.selectedTabId }
}
// We offset the tab index by the number of items in the other adapters.
// We add the offset, because the layoutManager is initialized with `reverseLayout`.
return if (view.context.settings().listTabView) {
selectedBrowserTabIndex +
collectionsButtonAdapter.itemCount +
syncedTabsController.adapter.itemCount
} else {
selectedBrowserTabIndex
}
}
companion object {
private const val TAB_COUNT_SHOW_CFR = 6
private const val DEFAULT_TAB_ID = 0