Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e04eb4fa authored by Daniel Norman's avatar Daniel Norman
Browse files

Uses PMI.PackageListObserver in AMS to listen to new packages.

PackageMonitor is BroadcastReceiver-based and occasionally takes a while
(30+seconds) before being notified about new packages, especially during
high-activity moments like CTS.

PMI.PackageListObserver is a way for system_server services to
directly listen to package changes without relying on broadcasts and does not suffer the same delays.

Bug: 261217661
Test: go/abtd to check flakiness in CtsAccessibilityServiceTestCases
Change-Id: I8b77c25de2f7f128f921f83ace9013e53dee1a6e
parent 48ae0d86
Loading
Loading
Loading
Loading
+29 −9
Original line number Diff line number Diff line
@@ -611,6 +611,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        }
    }

    private void onSomePackagesChangedLocked() {
        final AccessibilityUserState userState = getCurrentUserStateLocked();
        // Reload the installed services since some services may have different attributes
        // or resolve info (does not support equals), etc. Remove them then to force reload.
        userState.mInstalledServices.clear();
        if (readConfigurationForUserStateLocked(userState)) {
            onUserStateChangedLocked(userState);
        }
    }

    private void registerBroadcastReceivers() {
        PackageMonitor monitor = new PackageMonitor() {
            @Override
@@ -626,15 +636,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                    if (getChangingUserId() != mCurrentUserId) {
                        return;
                    }
                    // We will update when the automation service dies.
                    final AccessibilityUserState userState = getCurrentUserStateLocked();
                    // We have to reload the installed services since some services may
                    // have different attributes, resolve info (does not support equals),
                    // etc. Remove them then to force reload.
                    userState.mInstalledServices.clear();
                    if (readConfigurationForUserStateLocked(userState)) {
                        onUserStateChangedLocked(userState);
                    }
                    onSomePackagesChangedLocked();
                }
            }

@@ -766,6 +768,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        // package changes
        monitor.register(mContext, null,  UserHandle.ALL, true);

        // Register an additional observer for new packages using PackageManagerInternal, which
        // generally notifies observers much sooner than the BroadcastReceiver-based PackageMonitor.
        final PackageManagerInternal pm = LocalServices.getService(
                PackageManagerInternal.class);
        if (pm != null) {
            pm.getPackageList(new PackageManagerInternal.PackageListObserver() {
                @Override
                public void onPackageAdded(String packageName, int uid) {
                    final int userId = UserHandle.getUserId(uid);
                    synchronized (mLock) {
                        if (userId == mCurrentUserId) {
                            onSomePackagesChangedLocked();
                        }
                    }
                }
            });
        }

        // user change and unlock
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_USER_SWITCHED);