Enable accessibility of Clear All button.

The button appears in the accessibility hierarchy
as a child of RecentsView.

This makes both Talkback and Switch access
to work with it normally.

Bug: 80156299
Test: Manual

Change-Id: Ife2044b2ef78fb27b32f2d33fb17744662a2b054
diff --git a/quickstep/src/com/android/quickstep/views/ClearAllButton.java b/quickstep/src/com/android/quickstep/views/ClearAllButton.java
index 25e3dc6..0025df1 100644
--- a/quickstep/src/com/android/quickstep/views/ClearAllButton.java
+++ b/quickstep/src/com/android/quickstep/views/ClearAllButton.java
@@ -16,13 +16,11 @@
 
 package com.android.quickstep.views;
 
-import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS;
-
 import android.content.Context;
 import android.graphics.Rect;
-import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.util.AttributeSet;
+import android.view.accessibility.AccessibilityNodeInfo;
 import android.widget.Button;
 
 public class ClearAllButton extends Button {
@@ -37,12 +35,9 @@
     }
 
     @Override
-    public boolean performAccessibilityAction(int action, Bundle arguments) {
-        final boolean res = super.performAccessibilityAction(action, arguments);
-        if (action == ACTION_ACCESSIBILITY_FOCUS) {
-            mRecentsView.revealClearAllButton();
-        }
-        return res;
+    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+        super.onInitializeAccessibilityNodeInfo(info);
+        info.setParent(mRecentsView); // Pretend we are a part of the task carousel.
     }
 
     @Override
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 02cdd3a..e98b16a 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -39,6 +39,7 @@
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.UserHandle;
 import android.support.annotation.Nullable;
@@ -386,7 +387,13 @@
     private void updateClearAllButtonAlpha() {
         if (mClearAllButton != null) {
             final float alpha = calculateClearAllButtonAlpha();
-            mIsClearAllButtonFullyRevealed = alpha == 1;
+            final boolean revealed = alpha == 1;
+            if (mIsClearAllButtonFullyRevealed != revealed) {
+                mIsClearAllButtonFullyRevealed = revealed;
+                mClearAllButton.setImportantForAccessibility(revealed ?
+                        IMPORTANT_FOR_ACCESSIBILITY_YES :
+                        IMPORTANT_FOR_ACCESSIBILITY_NO);
+            }
             mClearAllButton.setAlpha(alpha * mContentAlpha);
         }
     }
@@ -1285,7 +1292,30 @@
     }
 
     @Override
+    public boolean performAccessibilityAction(int action, Bundle arguments) {
+        if (getChildCount() > 0) {
+            switch (action) {
+                case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
+                    if (!mIsClearAllButtonFullyRevealed && getCurrentPage() == getPageCount() - 1) {
+                        revealClearAllButton();
+                        return true;
+                    }
+                }
+                case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
+                    if (mIsClearAllButtonFullyRevealed) {
+                        setCurrentPage(getChildCount() - 1);
+                        return true;
+                    }
+                }
+                break;
+            }
+        }
+        return super.performAccessibilityAction(action, arguments);
+    }
+
+    @Override
     public void addChildrenForAccessibility(ArrayList<View> outChildren) {
+        outChildren.add(mClearAllButton);
         for (int i = getChildCount() - 1; i >= 0; --i) {
             outChildren.add(getChildAt(i));
         }
@@ -1295,6 +1325,13 @@
     public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
         super.onInitializeAccessibilityNodeInfo(info);
 
+        if (getChildCount() > 0) {
+            info.addAction(mIsClearAllButtonFullyRevealed ?
+                    AccessibilityNodeInfo.ACTION_SCROLL_FORWARD :
+                    AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
+            info.setScrollable(true);
+        }
+
         final AccessibilityNodeInfo.CollectionInfo
                 collectionInfo = AccessibilityNodeInfo.CollectionInfo.obtain(
                 1, getChildCount(), false,
@@ -1306,7 +1343,10 @@
     public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
         super.onInitializeAccessibilityEvent(event);
 
-        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
+        event.setScrollable(getPageCount() > 0);
+
+        if (!mIsClearAllButtonFullyRevealed
+                && event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
             final int childCount = getChildCount();
             final int[] visibleTasks = getVisibleChildrenRange();
             event.setFromIndex(childCount - visibleTasks[1] - 1);
diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java
index 31c8b64..c6cd527 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java
@@ -124,4 +124,9 @@
         return mRecentsView.requestFocus(direction, previouslyFocusedRect) ||
                 super.requestFocus(direction, previouslyFocusedRect);
     }
+
+    @Override
+    public void addChildrenForAccessibility(ArrayList<View> outChildren) {
+        outChildren.add(mRecentsView);
+    }
 }
\ No newline at end of file