From 3fe4e7d90fc6c3d09b39f93c438a24864bbfe260 Mon Sep 17 00:00:00 2001 From: Saumya Prakash Date: Wed, 26 Feb 2025 05:41:08 +0000 Subject: [PATCH] Ensure Talkback announces text correctly in Gesture tutorial This change modifies how Talkback announces the title and the subtitle in the gesture navigation tutorial. It no longer shifts the focus to the subtitle, but instead makes the whole window focusable. Fix: 386884587 Test: Open the gesture tutorial with talkback and ensure the text is announced without change of focus. Ensure the Done button doesn't get announced Flag: EXEMPT bugfix Change-Id: Id28382acbebe763f2f64f4e49eb00d6ea61e0553 --- .../redesigned_gesture_tutorial_fragment.xml | 5 +-- .../interaction/TutorialController.java | 43 ++----------------- 2 files changed, 5 insertions(+), 43 deletions(-) diff --git a/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml b/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml index 7530c286f4..8ca59c4591 100644 --- a/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml +++ b/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml @@ -137,6 +137,7 @@ android:layout_above="@id/gesture_tutorial_fragment_action_button" android:layout_centerHorizontal="true" android:background="@android:color/transparent" + android:screenReaderFocusable="true" android:paddingTop="24dp" android:paddingHorizontal="24dp" android:layout_marginBottom="16dp"> @@ -146,8 +147,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="104dp" - android:accessibilityHeading="true" - android:accessibilityTraversalBefore="@id/gesture_tutorial_fragment_feedback_subtitle" android:gravity="top" android:lineSpacingExtra="-1sp" android:textAppearance="@style/TextAppearance.GestureTutorial.MainTitle" @@ -162,8 +161,6 @@ android:layout_marginTop="24dp" android:lineSpacingExtra="4sp" android:textAppearance="@style/TextAppearance.GestureTutorial.MainSubtitle" - android:accessibilityTraversalAfter="@id/gesture_tutorial_fragment_feedback_title" - android:accessibilityTraversalBefore="@id/gesture_tutorial_fragment_action_button" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/gesture_tutorial_fragment_feedback_title" /> diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialController.java b/quickstep/src/com/android/quickstep/interaction/TutorialController.java index 0fc95e2102..5c48668504 100644 --- a/quickstep/src/com/android/quickstep/interaction/TutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/TutorialController.java @@ -36,7 +36,6 @@ import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; -import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.widget.Button; import android.widget.FrameLayout; @@ -123,13 +122,10 @@ abstract class TutorialController implements BackGestureAttemptCallback, // These runnables should be used when posting callbacks to their views and cleared from their // views before posting new callbacks. - private final Runnable mTitleViewCallback; - private final Runnable mSubtitleViewCallback; @Nullable private Runnable mFeedbackViewCallback; @Nullable private Runnable mFakeTaskViewCallback; @Nullable private Runnable mFakeTaskbarViewCallback; private final Runnable mShowFeedbackRunnable; - private final AccessibilityManager mAccessibilityManager; TutorialController(TutorialFragment tutorialFragment, TutorialType tutorialType) { mTutorialFragment = tutorialFragment; @@ -185,17 +181,6 @@ abstract class TutorialController implements BackGestureAttemptCallback, outline.setRoundRect(mExitingAppRect, mExitingAppRadius); } }); - - mAccessibilityManager = AccessibilityManager.getInstance(mContext); - mTitleViewCallback = () -> { - mFeedbackTitleView.requestFocus(); - mFeedbackTitleView.sendAccessibilityEvent( - AccessibilityEvent.TYPE_VIEW_FOCUSED); - }; - mSubtitleViewCallback = () -> { - mFeedbackSubtitleView.requestFocus(); - mFeedbackSubtitleView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); - }; mShowFeedbackRunnable = () -> { mFeedbackView.setAlpha(0f); mFeedbackView.setScaleX(0.95f); @@ -214,14 +199,14 @@ abstract class TutorialController implements BackGestureAttemptCallback, mFeedbackViewCallback = mTutorialFragment::continueTutorial; mFeedbackView.postDelayed( mFeedbackViewCallback, - mAccessibilityManager.getRecommendedTimeoutMillis( - ADVANCE_TUTORIAL_TIMEOUT_MS, - AccessibilityManager.FLAG_CONTENT_TEXT + AccessibilityManager.getInstance(mContext) + .getRecommendedTimeoutMillis( + ADVANCE_TUTORIAL_TIMEOUT_MS, + AccessibilityManager.FLAG_CONTENT_TEXT | AccessibilityManager.FLAG_CONTENT_CONTROLS)); } }) .start(); - mFeedbackTitleView.postDelayed(mTitleViewCallback, FEEDBACK_ANIMATION_MS); }; } @@ -414,8 +399,6 @@ abstract class TutorialController implements BackGestureAttemptCallback, int titleResId, int subtitleResId, boolean isGestureSuccessful) { - mFeedbackTitleView.removeCallbacks(mTitleViewCallback); - mFeedbackSubtitleView.removeCallbacks(mSubtitleViewCallback); if (mFeedbackViewCallback != null) { mFeedbackView.removeCallbacks(mFeedbackViewCallback); mFeedbackViewCallback = null; @@ -423,15 +406,6 @@ abstract class TutorialController implements BackGestureAttemptCallback, mFeedbackTitleView.setText(titleResId); mFeedbackSubtitleView.setText(subtitleResId); - mFeedbackTitleView.postDelayed(mTitleViewCallback, mAccessibilityManager - .getRecommendedTimeoutMillis( - FEEDBACK_ANIMATION_MS, - AccessibilityManager.FLAG_CONTENT_TEXT)); - mFeedbackSubtitleView.postDelayed(mSubtitleViewCallback, mAccessibilityManager - .getRecommendedTimeoutMillis( - SUBTITLE_ANNOUNCE_DELAY_MS, - AccessibilityManager.FLAG_CONTENT_TEXT)); - if (isGestureSuccessful) { if (mTutorialFragment.isAtFinalStep()) { showActionButton(); @@ -487,8 +461,6 @@ abstract class TutorialController implements BackGestureAttemptCallback, mFakeTaskbarView.removeCallbacks(mFakeTaskbarViewCallback); mFakeTaskbarViewCallback = null; } - mFeedbackTitleView.removeCallbacks(mTitleViewCallback); - mFeedbackSubtitleView.removeCallbacks(mSubtitleViewCallback); } private void playFeedbackAnimation() { @@ -564,13 +536,6 @@ abstract class TutorialController implements BackGestureAttemptCallback, mSkipButton.setVisibility(GONE); mDoneButton.setVisibility(View.VISIBLE); mDoneButton.setOnClickListener(this::onActionButtonClicked); - mDoneButton.postDelayed(() -> { - mDoneButton.requestFocus(); - mDoneButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); - }, mAccessibilityManager - .getRecommendedTimeoutMillis( - DONE_BUTTON_ANNOUNCE_DELAY_MS, - AccessibilityManager.FLAG_CONTENT_CONTROLS)); } void hideFakeTaskbar(boolean animateToHotseat) {