From f1507a6a647adde9a77db3efb2a92558c4dc2473 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 21 May 2018 11:59:48 -0700 Subject: [PATCH] Making overview panel accessible via Tab Keyboard navigation of AllAppsContainerView is broken in TOT; disabling focusing there is necessary for Recents. Bug: 72222505 Test: Manual Change-Id: I85d544f7c8dbdaf12e49de51c6626bbc3dc32917 --- quickstep/res/layout/task.xml | 5 +++- .../quickstep/views/ClearAllButton.java | 9 +++++++ .../android/quickstep/views/RecentsView.java | 25 +++++++++++++++++++ .../quickstep/views/RecentsViewContainer.java | 10 ++++++++ res/layout/all_apps.xml | 3 +-- .../android/launcher3/views/ScrimView.java | 1 + 6 files changed, 50 insertions(+), 3 deletions(-) diff --git a/quickstep/res/layout/task.xml b/quickstep/res/layout/task.xml index 429f3a28ea..f163872161 100644 --- a/quickstep/res/layout/task.xml +++ b/quickstep/res/layout/task.xml @@ -13,9 +13,11 @@ See the License for the specific language governing permissions and limitations under the License. --> - \ No newline at end of file diff --git a/quickstep/src/com/android/quickstep/views/ClearAllButton.java b/quickstep/src/com/android/quickstep/views/ClearAllButton.java index d5c43a0f56..25e3dc6c14 100644 --- a/quickstep/src/com/android/quickstep/views/ClearAllButton.java +++ b/quickstep/src/com/android/quickstep/views/ClearAllButton.java @@ -19,6 +19,7 @@ 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; @@ -43,4 +44,12 @@ public class ClearAllButton extends Button { } return res; } + + @Override + protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { + super.onFocusChanged(focused, direction, previouslyFocusedRect); + if (focused) { + mRecentsView.revealClearAllButton(); + } + } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index a6da89f205..0d8a601352 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -41,6 +41,7 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; import android.os.UserHandle; +import android.support.annotation.Nullable; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -967,6 +968,13 @@ public abstract class RecentsView extends PagedView impl 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; case KeyEvent.KEYCODE_DPAD_RIGHT: @@ -992,6 +1000,22 @@ public abstract class RecentsView extends PagedView impl return super.dispatchKeyEvent(event); } + @Override + protected void onFocusChanged(boolean gainFocus, int direction, + @Nullable Rect previouslyFocusedRect) { + super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); + if (gainFocus && getChildCount() > 0) { + switch (direction) { + case FOCUS_FORWARD: + setCurrentPage(0); + break; + case FOCUS_BACKWARD: + setCurrentPage(getChildCount() - 1); + break; + } + } + } + public void snapToTaskAfterNext() { snapToPageRelative(1); } @@ -1303,6 +1327,7 @@ public abstract class RecentsView extends PagedView impl } public void revealClearAllButton() { + setCurrentPage(getChildCount() - 1); // Loads tasks info if needed. scrollTo(mIsRtl ? 0 : computeMaxScrollX(), 0); } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index 429432b2fa..06e2e89037 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -25,10 +25,13 @@ import android.util.AttributeSet; import android.util.FloatProperty; import android.view.Gravity; import android.view.MotionEvent; +import android.view.View; import com.android.launcher3.InsettableFrameLayout; import com.android.launcher3.R; +import java.util.ArrayList; + public class RecentsViewContainer extends InsettableFrameLayout { public static final FloatProperty CONTENT_ALPHA = new FloatProperty("contentAlpha") { @@ -104,4 +107,11 @@ public class RecentsViewContainer extends InsettableFrameLayout { mRecentsView.setContentAlpha(alpha); setVisibility(alpha > 0 ? VISIBLE : GONE); } + + @Override + public void addFocusables(ArrayList views, int direction, int focusableMode) { + // Carousel is first in tab order. + views.add(mRecentsView); + views.add(mClearAllButton); + } } \ No newline at end of file diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index 5e7b117c43..02d793e1c0 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -23,8 +23,7 @@ android:layout_height="match_parent" android:clipChildren="true" android:clipToPadding="false" - android:focusable="true" - android:focusableInTouchMode="true" + android:focusable="false" android:saveEnabled="false" > diff --git a/src/com/android/launcher3/views/ScrimView.java b/src/com/android/launcher3/views/ScrimView.java index 6bbce00fe1..ea05cdc5c8 100644 --- a/src/com/android/launcher3/views/ScrimView.java +++ b/src/com/android/launcher3/views/ScrimView.java @@ -118,6 +118,7 @@ public class ScrimView extends View implements Insettable, OnChangeListener, ViewCompat.setAccessibilityDelegate(this, mAccessibilityHelper); mAM = (AccessibilityManager) context.getSystemService(ACCESSIBILITY_SERVICE); + setFocusable(false); } @NonNull