summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riley Jones <jonesriley@google.com> 2025-03-14 14:57:48 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2025-03-14 14:57:48 -0700
commit749cf65a3b9e6ebff4c78a13106ab39c0c25ab27 (patch)
tree3b8a84550474c04ff271ab99be536314cc38f7f4
parentc9ed17d4f12540c24840a07eeae11371e2c84a29 (diff)
parent2dfa5c67b432c1e861fbf3ddd2fdb659080837af (diff)
Merge "Changing A11yManagerService to respond to user switching from Lifecycle instead of Intents." into main
-rw-r--r--services/accessibility/accessibility.aconfig10
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java19
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java32
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(