From 28d0d32a53ca7c53ef4026ae4bf0cb6d6abd2623 Mon Sep 17 00:00:00 2001 From: Codrut Topliceanu <60002907+codrut-topliceanu@users.noreply.github.com> Date: Fri, 11 Dec 2020 14:32:37 +0200 Subject: [PATCH] [fenix] For https://github.com/mozilla-mobile/fenix/issues/15636 - Focus a11y collection on snackbar view tap (https://github.com/mozilla-mobile/fenix/pull/16853) With accessibility enabled, when adding a site to a collection and tapping "View" on the snackbar, we send a request for focus and an `AccessibilityEvent.TYPE_VIEW_FOCUSED` to the specified collection. --- .../org/mozilla/fenix/home/HomeFragment.kt | 39 +++++++++++++++++++ app/src/main/res/layout/fragment_home.xml | 2 +- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index bdf65090b4..983ddc4914 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -15,7 +15,9 @@ import android.view.Display.FLAG_SECURE import android.view.Gravity import android.view.LayoutInflater import android.view.View +import android.view.View.AccessibilityDelegate import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import android.widget.Button import android.widget.LinearLayout import android.widget.PopupWindow @@ -954,6 +956,43 @@ class HomeFragment : Fragment() { border?.animate()?.alpha(1.0F)?.setStartDelay(ANIM_ON_SCREEN_DELAY) ?.setDuration(FADE_ANIM_DURATION) ?.setListener(listener)?.start() + }.invokeOnCompletion { + val a11yEnabled = context?.settings()?.accessibilityServicesEnabled ?: false + if (a11yEnabled) { + focusCollectionForTalkBack(indexOfCollection) + } + } + } + + /** + * Will focus the collection with [indexOfCollection] for accessibility services. + * */ + private fun focusCollectionForTalkBack(indexOfCollection: Int) { + viewLifecycleOwner.lifecycleScope.launch { + var focusedForAccessibility = false + view?.let { mainView -> + mainView.accessibilityDelegate = object : AccessibilityDelegate() { + override fun onRequestSendAccessibilityEvent( + host: ViewGroup, + child: View, + event: AccessibilityEvent + ): Boolean { + if (!focusedForAccessibility && + event.eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED + ) { + sessionControlView?.view?.findViewHolderForAdapterPosition( + indexOfCollection + )?.itemView?.let { viewToFocus -> + focusedForAccessibility = true + viewToFocus.requestFocus() + viewToFocus.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + return false + } + } + return super.onRequestSendAccessibilityEvent(host, child, event) + } + } + } } } diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index ebfe8e6cb2..0c344615b8 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -72,7 +72,7 @@ android:padding="16dp" android:scrollbars="none" android:transitionGroup="false" - android:importantForAccessibility="no" + android:importantForAccessibility="yes" android:overScrollMode="never" tools:listheader="@layout/collection_header" tools:listitem="@layout/collection_home_list_row"