From da543114c38915f6e089f8b4d833e48d70a08e79 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Tue, 10 Nov 2020 15:10:50 +0200 Subject: [PATCH] [fenix] For https://github.com/mozilla-mobile/fenix/issues/16424 - Focus the right item in tabs tray when using Talkback (https://github.com/mozilla-mobile/fenix/pull/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. --- .../fenix/tabtray/TabTrayDialogFragment.kt | 2 +- .../org/mozilla/fenix/tabtray/TabTrayView.kt | 52 +++++++++++-------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt index 93c730c327..7cf5a127b3 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt @@ -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, 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 4526489570..1a7681f648 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt @@ -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