From 1dc99f3848bfb2ffcbc6ded1b7b80b0de8e1c97f Mon Sep 17 00:00:00 2001 From: Jagrut Desai Date: Thu, 2 Mar 2023 17:27:18 -0800 Subject: [PATCH] Announce for accessiblity when taskbar is invoked/closed Test: Manual Bug: 265620540 Change-Id: I6660be7716ec59c765f3d54f8fe9889eaaf56e10 --- quickstep/res/values/strings.xml | 4 ++++ .../taskbar/TaskbarStashController.java | 1 + .../launcher3/taskbar/TaskbarView.java | 22 +++++++++++++++++++ .../taskbar/TaskbarViewController.java | 7 ++++++ .../launcher3/views/IconButtonView.java | 7 ++++++ 5 files changed, 41 insertions(+) diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml index 2b5975dd7b..3d174d3726 100644 --- a/quickstep/res/values/strings.xml +++ b/quickstep/res/values/strings.xml @@ -278,6 +278,10 @@ Quick Settings Taskbar + + Taskbar shown + + Taskbar hidden Navigation bar diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index babafd5dd9..150d3db453 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -600,6 +600,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba if (!mIsStashed) { tryStartTaskbarTimeout(); } + mControllers.taskbarViewController.announceForAccessibility(); } }); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index 3d5089fc07..dee867e8a8 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -16,15 +16,18 @@ package com.android.launcher3.taskbar; import static android.content.pm.PackageManager.FEATURE_PC; +import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Rect; +import android.os.Bundle; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import androidx.annotation.LayoutRes; @@ -153,7 +156,26 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar // TODO: Disable touch events on QSB otherwise it can crash. mQsb = LayoutInflater.from(context).inflate(R.layout.search_container_hotseat, this, false); + } + @Override + public boolean performAccessibilityActionInternal(int action, Bundle arguments) { + if (action == AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS) { + announceForAccessibility(mContext.getString(R.string.taskbar_a11y_shown_title)); + } else if (action == AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS) { + announceForAccessibility(mContext.getString(R.string.taskbar_a11y_hidden_title)); + } + return super.performAccessibilityActionInternal(action, arguments); + + } + + protected void announceAccessibilityChanges() { + this.performAccessibilityAction( + isVisibleToUser() ? AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS + : AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null); + + ActivityContext.lookupContext(getContext()).getDragLayer() + .sendAccessibilityEvent(TYPE_WINDOW_CONTENT_CHANGED); } private int getColorWithGivenLuminance(int color, float luminance) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index 3143f23f10..8b009e6827 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -189,6 +189,13 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar mActivity.addOnDeviceProfileChangeListener(mDeviceProfileChangeListener); } + /** + * Announcement for Accessibility when Taskbar stashes/unstashes. + */ + public void announceForAccessibility() { + mTaskbarView.announceAccessibilityChanges(); + } + public void onDestroy() { LauncherAppState.getInstance(mActivity).getModel().removeCallbacks(mModelCallbacks); mActivity.removeOnDeviceProfileChangeListener(mDeviceProfileChangeListener); diff --git a/src/com/android/launcher3/views/IconButtonView.java b/src/com/android/launcher3/views/IconButtonView.java index 71f6756777..0ac1919485 100644 --- a/src/com/android/launcher3/views/IconButtonView.java +++ b/src/com/android/launcher3/views/IconButtonView.java @@ -29,6 +29,7 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.AttributeSet; +import android.view.accessibility.AccessibilityEvent; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; @@ -78,6 +79,12 @@ public class IconButtonView extends BubbleTextView { } } + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(event); + event.getText().add(this.getContentDescription()); + } + /** Sets given Drawable as icon */ public void setIconDrawable(@NonNull Drawable drawable) { ColorStateList tintList = getBackgroundTintList();