From 96d28aae022f7947f6d95cd8d5aa78183c807a57 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Wed, 4 Jan 2023 08:30:16 +0000 Subject: [PATCH] Map META (upon release) to launching all apps Fixes: 246661170 Test: Tap meta key, and see all apps launched upon release Change-Id: I717899b6f72dabf36312db9f02d61eb761ee852f --- .../AccessibilityManagerService.java | 5 +++++ .../server/AccessibilityManagerInternal.java | 7 +++++++ .../server/policy/PhoneWindowManager.java | 19 ++++++++++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 1183d6b96b02c..c5598cbaeeafe 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -368,6 +368,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mService.scheduleStartInput(remoteAccessibilityInputConnection, editorInfo, restarting); } + @Override + public void performSystemAction(int actionId) { + mService.getSystemActionPerformer().performSystemAction(actionId); + } + @Override public boolean isTouchExplorationEnabled(@UserIdInt int userId) { synchronized (mService.mLock) { diff --git a/services/core/java/com/android/server/AccessibilityManagerInternal.java b/services/core/java/com/android/server/AccessibilityManagerInternal.java index faa45ca558a3f..e26e9f6f0b919 100644 --- a/services/core/java/com/android/server/AccessibilityManagerInternal.java +++ b/services/core/java/com/android/server/AccessibilityManagerInternal.java @@ -50,6 +50,9 @@ public abstract class AccessibilityManagerInternal { IRemoteAccessibilityInputConnection remoteAccessibilityInputConnection, EditorInfo editorInfo, boolean restarting); + /** Trigger a system action with the provided {@code actionId}. */ + public abstract void performSystemAction(int actionId); + /** * Queries whether touch-exploration mode is enabled or not for the specified user. * @@ -86,6 +89,10 @@ public abstract class AccessibilityManagerInternal { public boolean isTouchExplorationEnabled(int userId) { return false; } + + @Override + public void performSystemAction(int actionId) { + } }; /** diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index fe0fe29d7b50d..c0509bcbc6629 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -86,6 +86,7 @@ import static com.android.server.wm.WindowManagerPolicyProto.ROTATION_MODE; import static com.android.server.wm.WindowManagerPolicyProto.SCREEN_ON_FULLY; import static com.android.server.wm.WindowManagerPolicyProto.WINDOW_MANAGER_DRAW_COMPLETE; +import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; import android.annotation.Nullable; import android.app.ActivityManager; @@ -200,6 +201,7 @@ import com.android.internal.policy.PhoneWindow; import com.android.internal.policy.TransitionAnimation; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.ArrayUtils; +import com.android.server.AccessibilityManagerInternal; import com.android.server.ExtconStateObserver; import com.android.server.ExtconUEventObserver; import com.android.server.GestureLauncherService; @@ -404,6 +406,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { Vibrator mVibrator; // Vibrator for giving feedback of orientation changes SearchManager mSearchManager; AccessibilityManager mAccessibilityManager; + AccessibilityManagerInternal mAccessibilityManagerInternal; BurnInProtectionHelper mBurnInProtectionHelper; private DisplayFoldController mDisplayFoldController; AppOpsManager mAppOpsManager; @@ -851,6 +854,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + AccessibilityManagerInternal getAccessibilityManagerInternal() { + synchronized (mServiceAcquireLock) { + if (mAccessibilityManagerInternal == null) { + mAccessibilityManagerInternal = + LocalServices.getService(AccessibilityManagerInternal.class); + } + return mAccessibilityManagerInternal; + } + } // returns true if the key was handled and should not be passed to the user private boolean backKeyPress() { @@ -1710,6 +1722,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { startActivityAsUser(intent, UserHandle.CURRENT); } + private void launchAllAppsViaA11y() { + getAccessibilityManagerInternal().performSystemAction( + AccessibilityService.GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS); + } + private void toggleNotificationPanel() { IStatusBarService statusBarService = getStatusBarService(); if (isUserSetupComplete() && statusBarService != null) { @@ -3138,7 +3155,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mPendingCapsLockToggle = false; } else if (mPendingMetaAction) { if (!canceled) { - // TODO: launch all apps here. + launchAllAppsViaA11y(); } mPendingMetaAction = false; }