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
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user