diff options
author | 2025-03-14 14:57:48 -0700 | |
---|---|---|
committer | 2025-03-14 14:57:48 -0700 | |
commit | 749cf65a3b9e6ebff4c78a13106ab39c0c25ab27 (patch) | |
tree | 3b8a84550474c04ff271ab99be536314cc38f7f4 | |
parent | c9ed17d4f12540c24840a07eeae11371e2c84a29 (diff) | |
parent | 2dfa5c67b432c1e861fbf3ddd2fdb659080837af (diff) |
Merge "Changing A11yManagerService to respond to user switching from Lifecycle instead of Intents." into main
3 files changed, 60 insertions, 1 deletions
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 @@ -223,6 +223,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" description: "Fix the ACTION_CANCEL logic used in MotionEventInjector to avoid InputDispatcher inconsistency" 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)) { diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java index 2ccd33648c3e..e0bc3e76f31d 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java @@ -82,6 +82,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.content.pm.UserInfo; import android.content.res.XmlResourceParser; import android.graphics.drawable.Icon; import android.hardware.display.DisplayManager; @@ -131,6 +132,7 @@ import com.android.internal.accessibility.util.ShortcutUtils; import com.android.internal.compat.IPlatformCompat; import com.android.internal.content.PackageMonitor; import com.android.server.LocalServices; +import com.android.server.SystemService; import com.android.server.accessibility.AccessibilityManagerService.AccessibilityDisplayListener; import com.android.server.accessibility.magnification.FullScreenMagnificationController; import com.android.server.accessibility.magnification.MagnificationConnectionManager; @@ -2122,6 +2124,36 @@ public class AccessibilityManagerServiceTest { } @Test + @EnableFlags(Flags.FLAG_MANAGER_LIFECYCLE_USER_CHANGE) + public void lifecycle_onUserSwitching_switchesUser() throws RemoteException { + mA11yms.mUserInitializationCompleteCallbacks.add(mUserInitializationCompleteCallback); + AccessibilityManagerService.Lifecycle lifecycle = + new AccessibilityManagerService.Lifecycle(mTestableContext, mA11yms); + int newUserId = mA11yms.getCurrentUserIdLocked() + 1; + + lifecycle.onUserSwitching( + new SystemService.TargetUser(new UserInfo(0, "USER", 0)), + new SystemService.TargetUser(new UserInfo(newUserId, "USER", 0))); + mTestableLooper.processAllMessages(); + + verify(mUserInitializationCompleteCallback).onUserInitializationComplete(newUserId); + } + + @Test + @DisableFlags(Flags.FLAG_MANAGER_LIFECYCLE_USER_CHANGE) + public void intent_user_switched_switchesUser() throws RemoteException { + mA11yms.mUserInitializationCompleteCallbacks.add(mUserInitializationCompleteCallback); + int newUserId = mA11yms.getCurrentUserIdLocked() + 1; + final Intent intent = new Intent(Intent.ACTION_USER_SWITCHED); + intent.putExtra(Intent.EXTRA_USER_HANDLE, newUserId); + + sendBroadcastToAccessibilityManagerService(intent, mA11yms.getCurrentUserIdLocked()); + mTestableLooper.processAllMessages(); + + verify(mUserInitializationCompleteCallback).onUserInitializationComplete(newUserId); + } + + @Test @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void getShortcutTypeForGenericShortcutCalls_softwareType() { final AccessibilityUserState userState = new AccessibilityUserState( |