From 2dfa5c67b432c1e861fbf3ddd2fdb659080837af Mon Sep 17 00:00:00 2001 From: Riley Jones Date: Wed, 12 Mar 2025 23:03:21 +0000 Subject: Changing A11yManagerService to respond to user switching from Lifecycle instead of Intents. This shrinks the window in which AMS holds an incorrect userId to near non-existence, preventing most if not all user-incurred bugs regarding wrong userIds. Test: atest AccessibilityManagerServiceTest Flag: com.android.server.accessibility.manager_lifecycle_user_change Bug: 393626471 Change-Id: I9a8d21a7449da9f27cbf283584e0960d8c79d37e --- services/accessibility/accessibility.aconfig | 10 ++++++++++ .../accessibility/AccessibilityManagerService.java | 19 ++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) (limited to 'services/accessibility') diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig index 35db3c6f0a6d..a133131a1d3f 100644 --- a/services/accessibility/accessibility.aconfig +++ b/services/accessibility/accessibility.aconfig @@ -222,6 +222,16 @@ flag { } } +flag { + name: "manager_lifecycle_user_change" + namespace: "accessibility" + description: "Use A11yManagerService's Lifecycle to change users, instead of listening for user changed events." + bug: "393626471" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "motion_event_injector_cancel_fix" namespace: "accessibility" diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 703e37fad5ad..69ea12d86d47 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -500,6 +500,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mService = new AccessibilityManagerService(context); } + @VisibleForTesting + public Lifecycle(Context context, AccessibilityManagerService service) { + super(context); + mService = service; + } + @Override public void onStart() { LocalServices.addService(AccessibilityManagerInternal.class, @@ -511,6 +517,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub public void onBootPhase(int phase) { mService.onBootPhase(phase); } + + @Override + public void onUserSwitching(@androidx.annotation.Nullable TargetUser from, + @androidx.annotation.NonNull TargetUser to) { + super.onUserSwitching(from, to); + if (Flags.managerLifecycleUserChange()) { + mService.switchUser(to.getUserIdentifier()); + } + } } private InputManager.KeyGestureEventHandler mKeyGestureEventHandler = @@ -1055,7 +1070,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub String action = intent.getAction(); if (Intent.ACTION_USER_SWITCHED.equals(action)) { - switchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); + if (!Flags.managerLifecycleUserChange()) { + switchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); + } } else if (Intent.ACTION_USER_UNLOCKED.equals(action)) { unlockUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); } else if (Intent.ACTION_USER_REMOVED.equals(action)) { -- cgit v1.2.3-59-g8ed1b