Fixing arrow navigation in task carousel

Bug: 80155387
Change-Id: Icbdca2e8ad2a0e7e7dfbc8493942787d9fa58a62
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 829ed6c..0358028 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -930,11 +930,16 @@
         set.play(anim);
     }
 
-    private void snapToPageRelative(int delta) {
+    private boolean snapToPageRelative(int delta, boolean cycle) {
         if (getPageCount() == 0) {
-            return;
+            return false;
         }
-        snapToPage((getNextPage() + getPageCount() + delta) % getPageCount());
+        final int newPageUnbound = getNextPage() + delta;
+        if (!cycle && (newPageUnbound < 0 || newPageUnbound >= getChildCount())) {
+            return false;
+        }
+        snapToPage((newPageUnbound + getPageCount()) % getPageCount());
+        return true;
     }
 
     @Override
@@ -970,21 +975,12 @@
         if (event.getAction() == KeyEvent.ACTION_DOWN) {
             switch (event.getKeyCode()) {
                 case KeyEvent.KEYCODE_TAB:
-                    if (!event.isAltPressed() &&
-                            getNextPage() ==
-                                    (event.isShiftPressed() ? 0 : getChildCount() - 1)) {
-                        // If not Alt-Tab navigation, don't loop forever in the carousel and leave
-                        // it once we reached the end.
-                        return false;
-                    }
-                    snapToPageRelative(event.isShiftPressed() ? -1 : 1);
-                    return true;
+                    return snapToPageRelative(event.isShiftPressed() ? -1 : 1,
+                            event.isAltPressed() /* cycle */);
                 case KeyEvent.KEYCODE_DPAD_RIGHT:
-                    snapToPageRelative(mIsRtl ? -1 : 1);
-                    return true;
+                    return snapToPageRelative(mIsRtl ? -1 : 1, false /* cycle */);
                 case KeyEvent.KEYCODE_DPAD_LEFT:
-                    snapToPageRelative(mIsRtl ? 1 : -1);
-                    return true;
+                    return snapToPageRelative(mIsRtl ? 1 : -1, false /* cycle */);
                 case KeyEvent.KEYCODE_DEL:
                 case KeyEvent.KEYCODE_FORWARD_DEL:
                     dismissTask((TaskView) getChildAt(getNextPage()), true /*animateTaskView*/,
@@ -1012,16 +1008,14 @@
                     setCurrentPage(0);
                     break;
                 case FOCUS_BACKWARD:
+                case FOCUS_RIGHT:
+                case FOCUS_LEFT:
                     setCurrentPage(getChildCount() - 1);
                     break;
             }
         }
     }
 
-    public void snapToTaskAfterNext() {
-        snapToPageRelative(1);
-    }
-
     public float getContentAlpha() {
         return mContentAlpha;
     }
diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java
index 846c28b..3391214 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java
@@ -70,6 +70,14 @@
 
         mRecentsView.setClearAllButton(mClearAllButton);
         mClearAllButton.setRecentsView(mRecentsView);
+
+        if (mRecentsView.isRtl()) {
+            mClearAllButton.setNextFocusRightId(mRecentsView.getId());
+            mRecentsView.setNextFocusLeftId(mClearAllButton.getId());
+        } else {
+            mClearAllButton.setNextFocusLeftId(mRecentsView.getId());
+            mRecentsView.setNextFocusRightId(mClearAllButton.getId());
+        }
     }
 
     @Override