Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44b14508 authored by Matthew Ng's avatar Matthew Ng
Browse files

Added toggle overview custom action over home button for a11y

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
parent 04e1f8e6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -383,6 +383,8 @@
    <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>
+3 −0
Original line number Diff line number Diff line
@@ -862,6 +862,9 @@
    <!-- 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>

+13 −0
Original line number Diff line number Diff line
@@ -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();
+39 −2
Original line number Diff line number Diff line
@@ -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() {