From f535d467ccafe1e43804c65e56837661438e4aeb Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 10 Nov 2020 17:42:16 +0200 Subject: [PATCH] [fenix] For https://github.com/mozilla-mobile/fenix/issues/16416: Remove save to collection button from tab a11y list. --- .../main/java/org/mozilla/fenix/ext/View.kt | 33 +++++++++++++++++++ .../tabtray/SaveToCollectionsButtonAdapter.kt | 18 ++++++++++ .../main/res/layout/tab_tray_grid_item.xml | 1 - 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/ext/View.kt b/app/src/main/java/org/mozilla/fenix/ext/View.kt index 069f60ad2..bc1f99c03 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/View.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/View.kt @@ -8,6 +8,7 @@ import android.graphics.Rect import android.os.Build import android.view.TouchDelegate import android.view.View +import android.view.accessibility.AccessibilityNodeInfo import androidx.annotation.Dimension import androidx.annotation.Dimension.DP import androidx.annotation.VisibleForTesting @@ -33,6 +34,38 @@ fun View.removeTouchDelegate() { } } +/** + * Removes a child view from accessibility node info of an accessibility parent view. + * If the child does not exist in the node, calling this has no effect. + */ +fun View.removeChildFromAccessibilityNodeInfo(child: View) { + this.accessibilityDelegate = object : View.AccessibilityDelegate() { + override fun onInitializeAccessibilityNodeInfo( + host: View?, + info: AccessibilityNodeInfo? + ) { + super.onInitializeAccessibilityNodeInfo(host, info) + info?.removeChild(child) + } + } +} + +/** + * Add a child view to the accessibility node info of a view that becomes it's accessibility parent. + * If the child already exists in the node, calling this has no effect. + */ +fun View.addChildToAccessibilityNodeInfo(child: View) { + this.accessibilityDelegate = object : View.AccessibilityDelegate() { + override fun onInitializeAccessibilityNodeInfo( + host: View?, + info: AccessibilityNodeInfo? + ) { + super.onInitializeAccessibilityNodeInfo(host, info) + info?.addChild(child) + } + } +} + /** * Fills a [Rect] with data about a view's location in the screen. * diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/SaveToCollectionsButtonAdapter.kt b/app/src/main/java/org/mozilla/fenix/tabtray/SaveToCollectionsButtonAdapter.kt index 03d10be28..3fb44dde6 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/SaveToCollectionsButtonAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/SaveToCollectionsButtonAdapter.kt @@ -7,11 +7,14 @@ package org.mozilla.fenix.tabtray import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityNodeInfo import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.mozilla.fenix.R +import org.mozilla.fenix.ext.addChildToAccessibilityNodeInfo +import org.mozilla.fenix.ext.removeChildFromAccessibilityNodeInfo import org.mozilla.fenix.tabtray.SaveToCollectionsButtonAdapter.Item import org.mozilla.fenix.tabtray.SaveToCollectionsButtonAdapter.ViewHolder @@ -34,6 +37,21 @@ class SaveToCollectionsButtonAdapter( } override fun onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList) { + // remove button from node info of tabs list for a11y services,and add it to the tab tray node + holder.itemView.accessibilityDelegate = object : View.AccessibilityDelegate() { + override fun onInitializeAccessibilityNodeInfo( + host: View?, + info: AccessibilityNodeInfo? + ) { + super.onInitializeAccessibilityNodeInfo(host, info) + info?.collectionItemInfo = null + (holder.itemView.parentForAccessibility as View).apply { + removeChildFromAccessibilityNodeInfo(holder.itemView) + (this.parentForAccessibility as View).addChildToAccessibilityNodeInfo(holder.itemView) + } + } + } + if (payloads.isNullOrEmpty()) { onBindViewHolder(holder, position) return diff --git a/app/src/main/res/layout/tab_tray_grid_item.xml b/app/src/main/res/layout/tab_tray_grid_item.xml index b9b3d8548..fb1b56ba1 100644 --- a/app/src/main/res/layout/tab_tray_grid_item.xml +++ b/app/src/main/res/layout/tab_tray_grid_item.xml @@ -18,7 +18,6 @@ A FrameLayout here is an efficient way of having a views stack while allowing: android:layout_height="202dp" android:clipChildren="false" android:clipToPadding="false" - android:importantForAccessibility="no" android:padding="8dp">