From 5a554ccbfa11231013377901248bf0b3f4e85d3b Mon Sep 17 00:00:00 2001 From: Yi-Ling Chuang Date: Mon, 13 Apr 2020 19:37:32 +0800 Subject: [PATCH] Add Dismiss action in Talkback Local Context Menu - Add dismiss action for cards that can be dismissed. - Remove importantForAccessibility from sliceView so Talkback can recognise this view in order to generate Local Context Menu. Fixes: 146910157 Test: Enable Talkback -> Move focus to removeable contextual card -> use up-right gesture -> see Local Context Menu Change-Id: I75a7394e94e6939d48cc379f62eab66f7903fd98 --- res/layout/contextual_slice_full_tile.xml | 8 +++--- res/layout/contextual_slice_sticky_tile.xml | 6 ++--- .../slices/SliceContextualCardRenderer.java | 25 +++++++++++++++++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/res/layout/contextual_slice_full_tile.xml b/res/layout/contextual_slice_full_tile.xml index 4b1155e3e97..b6ab410f341 100644 --- a/res/layout/contextual_slice_full_tile.xml +++ b/res/layout/contextual_slice_full_tile.xml @@ -19,7 +19,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - style="@style/ContextualCardStyle"> + style="@style/ContextualCardStyle" + android:importantForAccessibility="no"> @@ -28,10 +29,9 @@ android:theme="@style/Theme.Settings.ContextualCard" style="@style/ContextualCardSliceViewStyle" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:importantForAccessibility="no"/> + android:layout_height="wrap_content"/> - + \ No newline at end of file diff --git a/res/layout/contextual_slice_sticky_tile.xml b/res/layout/contextual_slice_sticky_tile.xml index 5991068dfc6..2e7a2befa63 100644 --- a/res/layout/contextual_slice_sticky_tile.xml +++ b/res/layout/contextual_slice_sticky_tile.xml @@ -19,14 +19,14 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - style="@style/ContextualCardStyle"> + style="@style/ContextualCardStyle" + android:importantForAccessibility="no"> + android:layout_height="wrap_content"/> diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java index 5f1e9559c5c..740c328692b 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java +++ b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java @@ -21,6 +21,7 @@ import static android.app.slice.Slice.HINT_ERROR; import android.content.ContentResolver; import android.content.Context; import android.net.Uri; +import android.os.Bundle; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; @@ -29,6 +30,9 @@ import android.widget.Button; import androidx.annotation.LayoutRes; import androidx.annotation.VisibleForTesting; +import androidx.core.view.AccessibilityDelegateCompat; +import androidx.core.view.ViewCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleOwner; @@ -167,6 +171,27 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, Life resetCardView(holder); mSliceLiveDataMap.get(card.getSliceUri()).removeObservers(mLifecycleOwner); }); + + ViewCompat.setAccessibilityDelegate(getInitialView(holder), + new AccessibilityDelegateCompat() { + @Override + public void onInitializeAccessibilityNodeInfo(View host, + AccessibilityNodeInfoCompat info) { + super.onInitializeAccessibilityNodeInfo(host, info); + info.addAction(AccessibilityNodeInfoCompat.ACTION_DISMISS); + info.setDismissable(true); + } + + @Override + public boolean performAccessibilityAction(View host, int action, Bundle args) { + if (action == AccessibilityNodeInfoCompat.ACTION_DISMISS) { + mControllerRendererPool.getController(mContext, + card.getCardType()).onDismissed(card); + } + return super.performAccessibilityAction(host, action, args); + } + }); + } @OnLifecycleEvent(Lifecycle.Event.ON_STOP)