diff options
3 files changed, 30 insertions, 0 deletions
diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig index 1c57dd3f5d5a..93531508b3eb 100644 --- a/services/accessibility/accessibility.aconfig +++ b/services/accessibility/accessibility.aconfig @@ -220,3 +220,13 @@ flag { description: "Feature allows users to change color correction saturation for daltonizer." bug: "322829049" } + +flag { + name: "skip_package_change_before_user_switch" + namespace: "accessibility" + description: "Skip onSomePackageChanged callback if the SwitchUser signal is not received yet." + bug: "340927041" + metadata { + purpose: PURPOSE_BUGFIX + } +} diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 053a1a7c4ae9..20b727cd6f09 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -588,6 +588,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return Thread.holdsLock(mLock); } + /** + * Returns if the service is initialized. + * + * The service is considered initialized when the user switch happened. + */ + private boolean isServiceInitializedLocked() { + return mInitialized; + } + @Override public int getCurrentUserIdLocked() { return mCurrentUserId; @@ -6234,6 +6243,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (userId != mManagerService.getCurrentUserIdLocked()) { return; } + + // Only continue setting up the packages if the service has been initialized. + // See: b/340927041 + if (Flags.skipPackageChangeBeforeUserSwitch() + && !mManagerService.isServiceInitializedLocked()) { + Slog.w(LOG_TAG, + "onSomePackagesChanged: service not initialized, skip the callback."); + return; + } mManagerService.onSomePackagesChangedLocked(parsedAccessibilityServiceInfos, parsedAccessibilityShortcutInfos); } 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 f971f0e6d4fb..4e8c75559f3b 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java @@ -923,6 +923,8 @@ public class AccessibilityManagerServiceTest { ResolveInfo resolveInfo1 = installedService1.getResolveInfo(); AccessibilityServiceInfo installedService2 = mA11yms.getCurrentUserState().mInstalledServices.getLast(); + // Invokes client change to trigger onUserStateChanged. + mA11yms.onClientChangeLocked(false); // Disables `installedService2` when(mMockPackageManager.queryIntentServicesAsUser(any(), anyInt(), anyInt())) |