OSDN Git Service

Added toggle overview custom action over home button for a11y
authorMatthew Ng <ngmatthew@google.com>
Fri, 4 May 2018 18:10:14 +0000 (11:10 -0700)
committerMatthew Ng <ngmatthew@google.com>
Sat, 5 May 2018 00:54:07 +0000 (17:54 -0700)
The toggle overview custom action only appears when swipe up ui is shown
(2 buttons).

Change-Id: I8b3790c98b663dd04bec921a9f7372733c73ea4e
Fixes: 78177915
Test: use talkback, enable swipe up ui and toggle overview via home btn

packages/SystemUI/res/values/config.xml
packages/SystemUI/res/values/strings.xml
packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java

index b9cde7c..251589b 100644 (file)
     <item type="id" name="action_split_task_to_right" />
     <item type="id" name="action_split_task_to_top" />
 
+    <item type="id" name="action_toggle_overview"/>
+
     <!-- Whether or not the gear icon on notifications should be shown. The gear is shown when the
          the notification is not swiped enough to dismiss it. -->
     <bool name="config_showNotificationGear">true</bool>
index f1f80c7..58a6e8f 100644 (file)
     <!-- Recents: Accessibility split to the right -->
     <string name="recents_accessibility_split_screen_right">Split screen to the right</string>
 
+    <!-- QuickStep: Accessibility to toggle overview [CHAR LIMIT=40] -->
+    <string name="quick_step_accessibility_toggle_overview">Toggle Overview</string>
+
     <!-- Expanded Status Bar Header: Battery Charged [CHAR LIMIT=40] -->
     <string name="expanded_header_battery_charged">Charged</string>
 
index 2161655..fb94756 100644 (file)
@@ -19,6 +19,7 @@ import android.animation.AnimatorListenerAdapter;
 import android.animation.ValueAnimator;
 import android.view.View;
 
+import android.view.View.AccessibilityDelegate;
 import com.android.systemui.Interpolators;
 import com.android.systemui.plugins.statusbar.phone.NavBarButtonProvider.ButtonInterface;
 import com.android.systemui.statusbar.policy.KeyButtonDrawable;
@@ -50,6 +51,7 @@ public class ButtonDispatcher {
     private View mCurrentView;
     private boolean mVertical;
     private ValueAnimator mFadeAnimator;
+    private AccessibilityDelegate mAccessibilityDelegate;
 
     private final ValueAnimator.AnimatorUpdateListener mAlphaListener = animation ->
             setAlpha((float) animation.getAnimatedValue());
@@ -84,6 +86,9 @@ public class ButtonDispatcher {
         if (mVisibility != null && mVisibility != -1) {
             view.setVisibility(mVisibility);
         }
+        if (mAccessibilityDelegate != null) {
+            view.setAccessibilityDelegate(mAccessibilityDelegate);
+        }
         if (view instanceof ButtonInterface) {
             final ButtonInterface button = (ButtonInterface) view;
             if (mDarkIntensity != null) {
@@ -212,6 +217,14 @@ public class ButtonDispatcher {
         }
     }
 
+    public void setAccessibilityDelegate(AccessibilityDelegate delegate) {
+        mAccessibilityDelegate = delegate;
+        final int N = mViews.size();
+        for (int i = 0; i < N; i++) {
+            mViews.get(i).setAccessibilityDelegate(delegate);
+        }
+    }
+
     public void setClickable(boolean clickable) {
         abortCurrentGesture();
         final int N = mViews.size();
index 6cc96da..1c57017 100644 (file)
@@ -36,8 +36,10 @@ import android.graphics.Point;
 import android.graphics.Rect;
 import android.graphics.drawable.AnimatedVectorDrawable;
 import android.graphics.drawable.Drawable;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.support.annotation.ColorInt;
 import android.util.AttributeSet;
@@ -51,6 +53,8 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowInsets;
 import android.view.WindowManager;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.FrameLayout;
 
@@ -60,11 +64,14 @@ import com.android.systemui.DockedStackExistsListener;
 import com.android.systemui.OverviewProxyService;
 import com.android.systemui.R;
 import com.android.systemui.RecentsComponent;
+import com.android.systemui.SysUiServiceProvider;
 import com.android.systemui.plugins.PluginListener;
 import com.android.systemui.plugins.PluginManager;
 import com.android.systemui.plugins.statusbar.phone.NavGesture;
 import com.android.systemui.plugins.statusbar.phone.NavGesture.GestureHelper;
+import com.android.systemui.recents.Recents;
 import com.android.systemui.recents.RecentsOnboarding;
+import com.android.systemui.shared.recents.IOverviewProxy;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
 import com.android.systemui.shared.system.NavigationBarCompat;
 import com.android.systemui.shared.system.WindowManagerWrapper;
@@ -230,6 +237,34 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
         }
     }
 
+    private final AccessibilityDelegate mQuickStepAccessibilityDelegate
+            = new AccessibilityDelegate() {
+        private AccessibilityAction mToggleOverviewAction;
+
+        @Override
+        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+            super.onInitializeAccessibilityNodeInfo(host, info);
+            if (mToggleOverviewAction == null) {
+                mToggleOverviewAction = new AccessibilityAction(R.id.action_toggle_overview,
+                    getContext().getString(R.string.quick_step_accessibility_toggle_overview));
+            }
+            info.addAction(mToggleOverviewAction);
+        }
+
+        @Override
+        public boolean performAccessibilityAction(View host, int action, Bundle args) {
+            switch (action) {
+                case R.id.action_toggle_overview:
+                    SysUiServiceProvider.getComponent(getContext(), Recents.class)
+                            .toggleRecentApps();
+                    break;
+                default:
+                    return super.performAccessibilityAction(host, action, args);
+            }
+            return true;
+        }
+    };
+
     public NavigationBarView(Context context, AttributeSet attrs) {
         super(context, attrs);
 
@@ -679,12 +714,14 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
     }
 
     public void updateStates() {
+        final boolean showSwipeUpUI = mOverviewProxyService.shouldShowSwipeUpUI();
         updateSlippery();
         reloadNavIcons();
         updateNavButtonIcons();
         setUpSwipeUpOnboarding(isQuickStepSwipeUpEnabled());
-        WindowManagerWrapper.getInstance().setNavBarVirtualKeyHapticFeedbackEnabled(
-                !mOverviewProxyService.shouldShowSwipeUpUI());
+        WindowManagerWrapper.getInstance().setNavBarVirtualKeyHapticFeedbackEnabled(!showSwipeUpUI);
+        getHomeButton().setAccessibilityDelegate(
+                showSwipeUpUI ? mQuickStepAccessibilityDelegate : null);
     }
 
     private void updateSlippery() {