Loading services/core/java/com/android/server/pm/BroadcastHelper.java +22 −16 Original line number Original line Diff line number Diff line Loading @@ -78,6 +78,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Arrays; import java.util.Collections; import java.util.Collections; import java.util.function.BiFunction; import java.util.function.BiFunction; import java.util.function.Supplier; /** /** * Helper class to send broadcasts for various situations. * Helper class to send broadcasts for various situations. Loading Loading @@ -216,7 +217,7 @@ public final class BroadcastHelper { filterExtrasForReceiver, bOptions); filterExtrasForReceiver, bOptions); } } void sendResourcesChangedBroadcast(@NonNull Computer snapshot, void sendResourcesChangedBroadcast(@NonNull Supplier<Computer> snapshotSupplier, boolean mediaStatus, boolean mediaStatus, boolean replacing, boolean replacing, @NonNull String[] pkgNames, @NonNull String[] pkgNames, Loading @@ -236,7 +237,7 @@ public final class BroadcastHelper { null /* targetPkg */, null /* finishedReceiver */, null /* userIds */, null /* targetPkg */, null /* finishedReceiver */, null /* userIds */, null /* instantUserIds */, null /* broadcastAllowList */, null /* instantUserIds */, null /* broadcastAllowList */, (callingUid, intentExtras) -> filterExtrasChangedPackageList( (callingUid, intentExtras) -> filterExtrasChangedPackageList( snapshot, callingUid, intentExtras), snapshotSupplier, callingUid, intentExtras), null /* bOptions */, null /* requiredPermissions */); null /* bOptions */, null /* requiredPermissions */); } } Loading Loading @@ -544,7 +545,7 @@ public final class BroadcastHelper { }); }); } } void sendPostInstallBroadcasts(@NonNull Computer snapshot, void sendPostInstallBroadcasts(@NonNull Supplier<Computer> snapshotSupplier, @NonNull InstallRequest request, @NonNull InstallRequest request, @NonNull String packageName, @NonNull String packageName, @NonNull String requiredPermissionControllerPackage, @NonNull String requiredPermissionControllerPackage, Loading @@ -567,8 +568,8 @@ public final class BroadcastHelper { final int[] uids = new int[]{request.getRemovedInfo().mUid}; final int[] uids = new int[]{request.getRemovedInfo().mUid}; notifyResourcesChanged( notifyResourcesChanged( false /* mediaStatus */, true /* replacing */, pkgNames, uids); false /* mediaStatus */, true /* replacing */, pkgNames, uids); sendResourcesChangedBroadcast( sendResourcesChangedBroadcast(snapshotSupplier, snapshot, false /* mediaStatus */, true /* replacing */, pkgNames, uids); false /* mediaStatus */, true /* replacing */, pkgNames, uids); } } sendPackageRemovedBroadcasts( sendPackageRemovedBroadcasts( request.getRemovedInfo(), packageSender, isKillApp, false /*removedBySystem*/, request.getRemovedInfo(), packageSender, isKillApp, false /*removedBySystem*/, Loading Loading @@ -608,6 +609,7 @@ public final class BroadcastHelper { null /* broadcastAllowList */, null); null /* broadcastAllowList */, null); } } final Computer snapshot = snapshotSupplier.get(); // Send installed broadcasts if the package is not a static shared lib. // Send installed broadcasts if the package is not a static shared lib. if (staticSharedLibraryName == null) { if (staticSharedLibraryName == null) { // Send PACKAGE_ADDED broadcast for users that see the package for the first time // Send PACKAGE_ADDED broadcast for users that see the package for the first time Loading Loading @@ -732,7 +734,7 @@ public final class BroadcastHelper { if (!isArchived) { if (!isArchived) { final String[] pkgNames = new String[]{packageName}; final String[] pkgNames = new String[]{packageName}; final int[] uids = new int[]{request.getPkg().getUid()}; final int[] uids = new int[]{request.getPkg().getUid()}; sendResourcesChangedBroadcast(snapshot, sendResourcesChangedBroadcast(snapshotSupplier, true /* mediaStatus */, true /* replacing */, pkgNames, uids); true /* mediaStatus */, true /* replacing */, pkgNames, uids); notifyResourcesChanged(true /* mediaStatus */, notifyResourcesChanged(true /* mediaStatus */, true /* replacing */, pkgNames, uids); true /* replacing */, pkgNames, uids); Loading Loading @@ -860,8 +862,8 @@ public final class BroadcastHelper { * access all the packages in the extras. * access all the packages in the extras. */ */ @Nullable @Nullable private static Bundle filterExtrasChangedPackageList(@NonNull Computer snapshot, int callingUid, private static Bundle filterExtrasChangedPackageList( @NonNull Bundle extras) { @NonNull Supplier<Computer> snapshotSupplier, int callingUid, @NonNull Bundle extras) { if (UserHandle.isCore(callingUid)) { if (UserHandle.isCore(callingUid)) { // see all // see all return extras; return extras; Loading @@ -873,6 +875,7 @@ public final class BroadcastHelper { final int userId = extras.getInt( final int userId = extras.getInt( Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(callingUid)); Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(callingUid)); final int[] uids = extras.getIntArray(Intent.EXTRA_CHANGED_UID_LIST); final int[] uids = extras.getIntArray(Intent.EXTRA_CHANGED_UID_LIST); final Computer snapshot = snapshotSupplier.get(); final Pair<String[], int[]> filteredPkgs = final Pair<String[], int[]> filteredPkgs = filterPackages(snapshot, pkgs, uids, callingUid, userId); filterPackages(snapshot, pkgs, uids, callingUid, userId); if (ArrayUtils.isEmpty(filteredPkgs.first)) { if (ArrayUtils.isEmpty(filteredPkgs.first)) { Loading Loading @@ -952,10 +955,12 @@ public final class BroadcastHelper { final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; final SparseArray<int[]> broadcastAllowList = final SparseArray<int[]> broadcastAllowList = isInstantApp ? null : snapshot.getVisibilityAllowLists(packageName, userIds); isInstantApp ? null : snapshot.getVisibilityAllowLists(packageName, userIds); final String[] sharedUserPackages = snapshot.getSharedUserPackagesForPackage(packageName, userId); mHandler.post(() -> sendPackageChangedBroadcastInternal( mHandler.post(() -> sendPackageChangedBroadcastInternal( packageName, dontKillApp, componentNames, packageUid, reason, userIds, packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, setting.getPkg(), instantUserIds, broadcastAllowList, setting.getPkg(), snapshot.getSharedUserPackagesForPackage(packageName, userId))); sharedUserPackages)); mPackageMonitorCallbackHelper.notifyPackageChanged(packageName, dontKillApp, componentNames, mPackageMonitorCallbackHelper.notifyPackageChanged(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, mHandler); packageUid, reason, userIds, instantUserIds, broadcastAllowList, mHandler); } } Loading Loading @@ -1120,7 +1125,7 @@ public final class BroadcastHelper { * @param uidList The uids of packages which have suspension changes. * @param uidList The uids of packages which have suspension changes. * @param userId The user where packages reside. * @param userId The user where packages reside. */ */ void sendPackagesSuspendedOrUnsuspendedForUser(@NonNull Computer snapshot, void sendPackagesSuspendedOrUnsuspendedForUser(@NonNull Supplier<Computer> snapshotSupplier, @NonNull String intent, @NonNull String intent, @NonNull String[] pkgList, @NonNull String[] pkgList, @NonNull int[] uidList, @NonNull int[] uidList, Loading @@ -1138,7 +1143,7 @@ public final class BroadcastHelper { .toBundle(); .toBundle(); BiFunction<Integer, Bundle, Bundle> filterExtrasForReceiver = BiFunction<Integer, Bundle, Bundle> filterExtrasForReceiver = (callingUid, intentExtras) -> BroadcastHelper.filterExtrasChangedPackageList( (callingUid, intentExtras) -> BroadcastHelper.filterExtrasChangedPackageList( snapshot, callingUid, intentExtras); snapshotSupplier, callingUid, intentExtras); mHandler.post(() -> sendPackageBroadcast(intent, null /* pkg */, mHandler.post(() -> sendPackageBroadcast(intent, null /* pkg */, extras, flags, null /* targetPkg */, null /* finishedReceiver */, extras, flags, null /* targetPkg */, null /* finishedReceiver */, new int[]{userId}, null /* instantUserIds */, null /* broadcastAllowList */, new int[]{userId}, null /* instantUserIds */, null /* broadcastAllowList */, Loading @@ -1148,7 +1153,7 @@ public final class BroadcastHelper { null /* instantUserIds */, null /* broadcastAllowList */, filterExtrasForReceiver); null /* instantUserIds */, null /* broadcastAllowList */, filterExtrasForReceiver); } } void sendMyPackageSuspendedOrUnsuspended(@NonNull Computer snapshot, void sendMyPackageSuspendedOrUnsuspended(@NonNull Supplier<Computer> snapshotSupplier, @NonNull String[] affectedPackages, @NonNull String[] affectedPackages, boolean suspended, boolean suspended, int userId) { int userId) { Loading @@ -1163,6 +1168,7 @@ public final class BroadcastHelper { return; return; } } final int[] targetUserIds = new int[] {userId}; final int[] targetUserIds = new int[] {userId}; final Computer snapshot = snapshotSupplier.get(); for (String packageName : affectedPackages) { for (String packageName : affectedPackages) { final Bundle appExtras = suspended final Bundle appExtras = suspended ? SuspendPackageHelper.getSuspendedPackageAppExtras( ? SuspendPackageHelper.getSuspendedPackageAppExtras( Loading Loading @@ -1192,7 +1198,7 @@ public final class BroadcastHelper { * @param uidList The uids of packages which have suspension changes. * @param uidList The uids of packages which have suspension changes. * @param userId The user where packages reside. * @param userId The user where packages reside. */ */ void sendDistractingPackagesChanged(@NonNull Computer snapshot, void sendDistractingPackagesChanged(@NonNull Supplier<Computer> snapshotSupplier, @NonNull String[] pkgList, @NonNull String[] pkgList, @NonNull int[] uidList, @NonNull int[] uidList, int userId, int userId, Loading @@ -1208,11 +1214,11 @@ public final class BroadcastHelper { null /* finishedReceiver */, new int[]{userId}, null /* instantUserIds */, null /* finishedReceiver */, new int[]{userId}, null /* instantUserIds */, null /* broadcastAllowList */, null /* broadcastAllowList */, (callingUid, intentExtras) -> filterExtrasChangedPackageList( (callingUid, intentExtras) -> filterExtrasChangedPackageList( snapshot, callingUid, intentExtras), snapshotSupplier, callingUid, intentExtras), null /* bOptions */, null /* requiredPermissions */)); null /* bOptions */, null /* requiredPermissions */)); } } void sendResourcesChangedBroadcastAndNotify(@NonNull Computer snapshot, void sendResourcesChangedBroadcastAndNotify(@NonNull Supplier<Computer> snapshotSupplier, boolean mediaStatus, boolean mediaStatus, boolean replacing, boolean replacing, @NonNull ArrayList<AndroidPackage> packages) { @NonNull ArrayList<AndroidPackage> packages) { Loading @@ -1224,7 +1230,7 @@ public final class BroadcastHelper { packageNames[i] = pkg.getPackageName(); packageNames[i] = pkg.getPackageName(); packageUids[i] = pkg.getUid(); packageUids[i] = pkg.getUid(); } } sendResourcesChangedBroadcast(snapshot, mediaStatus, sendResourcesChangedBroadcast(snapshotSupplier, mediaStatus, replacing, packageNames, packageUids); replacing, packageNames, packageUids); notifyResourcesChanged(mediaStatus, replacing, packageNames, packageUids); notifyResourcesChanged(mediaStatus, replacing, packageNames, packageUids); } } Loading services/core/java/com/android/server/pm/DistractingPackageHelper.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -123,7 +123,7 @@ public final class DistractingPackageHelper { if (!changedPackagesList.isEmpty()) { if (!changedPackagesList.isEmpty()) { final String[] changedPackages = changedPackagesList.toArray( final String[] changedPackages = changedPackagesList.toArray( new String[changedPackagesList.size()]); new String[changedPackagesList.size()]); mBroadcastHelper.sendDistractingPackagesChanged(mPm.snapshotComputer(), mBroadcastHelper.sendDistractingPackagesChanged(mPm::snapshotComputer, changedPackages, changedUids.toArray(), userId, restrictionFlags); changedPackages, changedUids.toArray(), userId, restrictionFlags); mPm.scheduleWritePackageRestrictions(userId); mPm.scheduleWritePackageRestrictions(userId); } } Loading Loading @@ -198,7 +198,7 @@ public final class DistractingPackageHelper { if (!changedPackages.isEmpty()) { if (!changedPackages.isEmpty()) { final String[] packageArray = changedPackages.toArray( final String[] packageArray = changedPackages.toArray( new String[changedPackages.size()]); new String[changedPackages.size()]); mBroadcastHelper.sendDistractingPackagesChanged(mPm.snapshotComputer(), mBroadcastHelper.sendDistractingPackagesChanged(mPm::snapshotComputer, packageArray, changedUids.toArray(), userId, RESTRICTION_NONE); packageArray, changedUids.toArray(), userId, RESTRICTION_NONE); mPm.scheduleWritePackageRestrictions(userId); mPm.scheduleWritePackageRestrictions(userId); } } Loading services/core/java/com/android/server/pm/InstallPackageHelper.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -3084,7 +3084,7 @@ final class InstallPackageHelper { mPm.mProcessLoggingHandler.invalidateBaseApkHash(request.getPkg().getBaseApkPath()); mPm.mProcessLoggingHandler.invalidateBaseApkHash(request.getPkg().getBaseApkPath()); } } mBroadcastHelper.sendPostInstallBroadcasts(mPm.snapshotComputer(), request, packageName, mBroadcastHelper.sendPostInstallBroadcasts(mPm::snapshotComputer, request, packageName, mPm.mRequiredPermissionControllerPackage, mPm.mRequiredVerifierPackages, mPm.mRequiredPermissionControllerPackage, mPm.mRequiredVerifierPackages, mPm.mRequiredInstallerPackage, mPm.mRequiredInstallerPackage, /* packageSender= */ mPm, launchedForRestore, killApp, update, archived); /* packageSender= */ mPm, launchedForRestore, killApp, update, archived); Loading services/core/java/com/android/server/pm/StorageEventHelper.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -227,7 +227,7 @@ public final class StorageEventHelper extends StorageEventListener { } } if (DEBUG_INSTALL) Slog.d(TAG, "Loaded packages " + loaded); if (DEBUG_INSTALL) Slog.d(TAG, "Loaded packages " + loaded); mBroadcastHelper.sendResourcesChangedBroadcastAndNotify(mPm.snapshotComputer(), mBroadcastHelper.sendResourcesChangedBroadcastAndNotify(mPm::snapshotComputer, true /* mediaStatus */, false /* replacing */, loaded); true /* mediaStatus */, false /* replacing */, loaded); synchronized (mLoadedVolumes) { synchronized (mLoadedVolumes) { mLoadedVolumes.add(vol.getId()); mLoadedVolumes.add(vol.getId()); Loading Loading @@ -279,7 +279,7 @@ public final class StorageEventHelper extends StorageEventListener { } } if (DEBUG_INSTALL) Slog.d(TAG, "Unloaded packages " + unloaded); if (DEBUG_INSTALL) Slog.d(TAG, "Unloaded packages " + unloaded); mBroadcastHelper.sendResourcesChangedBroadcastAndNotify(mPm.snapshotComputer(), mBroadcastHelper.sendResourcesChangedBroadcastAndNotify(mPm::snapshotComputer, false /* mediaStatus */, false /* replacing */, unloaded); false /* mediaStatus */, false /* replacing */, unloaded); synchronized (mLoadedVolumes) { synchronized (mLoadedVolumes) { mLoadedVolumes.remove(vol.getId()); mLoadedVolumes.remove(vol.getId()); Loading services/core/java/com/android/server/pm/SuspendPackageHelper.java +7 −9 Original line number Original line Diff line number Diff line Loading @@ -192,21 +192,20 @@ public final class SuspendPackageHelper { } } }); }); final Computer newSnapshot = mPm.snapshotComputer(); if (!notifyPackagesList.isEmpty()) { if (!notifyPackagesList.isEmpty()) { final String[] changedPackages = final String[] changedPackages = notifyPackagesList.toArray(new String[0]); notifyPackagesList.toArray(new String[0]); mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(newSnapshot, mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(mPm::snapshotComputer, suspended ? Intent.ACTION_PACKAGES_SUSPENDED suspended ? Intent.ACTION_PACKAGES_SUSPENDED : Intent.ACTION_PACKAGES_UNSUSPENDED, : Intent.ACTION_PACKAGES_UNSUSPENDED, changedPackages, notifyUids.toArray(), quarantined, targetUserId); changedPackages, notifyUids.toArray(), quarantined, targetUserId); mBroadcastHelper.sendMyPackageSuspendedOrUnsuspended(newSnapshot, changedPackages, mBroadcastHelper.sendMyPackageSuspendedOrUnsuspended(mPm::snapshotComputer, suspended, targetUserId); changedPackages, suspended, targetUserId); mPm.scheduleWritePackageRestrictions(targetUserId); mPm.scheduleWritePackageRestrictions(targetUserId); } } // Send the suspension changed broadcast to ensure suspension state is not stale. // Send the suspension changed broadcast to ensure suspension state is not stale. if (!changedPackagesList.isEmpty()) { if (!changedPackagesList.isEmpty()) { mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(newSnapshot, mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(mPm::snapshotComputer, Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, changedPackagesList.toArray(new String[0]), changedUids.toArray(), quarantined, changedPackagesList.toArray(new String[0]), changedUids.toArray(), quarantined, targetUserId); targetUserId); Loading Loading @@ -343,13 +342,12 @@ public final class SuspendPackageHelper { }); }); mPm.scheduleWritePackageRestrictions(targetUserId); mPm.scheduleWritePackageRestrictions(targetUserId); final Computer newSnapshot = mPm.snapshotComputer(); if (!unsuspendedPackages.isEmpty()) { if (!unsuspendedPackages.isEmpty()) { final String[] packageArray = unsuspendedPackages.toArray( final String[] packageArray = unsuspendedPackages.toArray( new String[unsuspendedPackages.size()]); new String[unsuspendedPackages.size()]); mBroadcastHelper.sendMyPackageSuspendedOrUnsuspended(newSnapshot, packageArray, mBroadcastHelper.sendMyPackageSuspendedOrUnsuspended(mPm::snapshotComputer, false, targetUserId); packageArray, false, targetUserId); mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(newSnapshot, mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(mPm::snapshotComputer, Intent.ACTION_PACKAGES_UNSUSPENDED, Intent.ACTION_PACKAGES_UNSUSPENDED, packageArray, unsuspendedUids.toArray(), false, targetUserId); packageArray, unsuspendedUids.toArray(), false, targetUserId); } } Loading Loading
services/core/java/com/android/server/pm/BroadcastHelper.java +22 −16 Original line number Original line Diff line number Diff line Loading @@ -78,6 +78,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Arrays; import java.util.Collections; import java.util.Collections; import java.util.function.BiFunction; import java.util.function.BiFunction; import java.util.function.Supplier; /** /** * Helper class to send broadcasts for various situations. * Helper class to send broadcasts for various situations. Loading Loading @@ -216,7 +217,7 @@ public final class BroadcastHelper { filterExtrasForReceiver, bOptions); filterExtrasForReceiver, bOptions); } } void sendResourcesChangedBroadcast(@NonNull Computer snapshot, void sendResourcesChangedBroadcast(@NonNull Supplier<Computer> snapshotSupplier, boolean mediaStatus, boolean mediaStatus, boolean replacing, boolean replacing, @NonNull String[] pkgNames, @NonNull String[] pkgNames, Loading @@ -236,7 +237,7 @@ public final class BroadcastHelper { null /* targetPkg */, null /* finishedReceiver */, null /* userIds */, null /* targetPkg */, null /* finishedReceiver */, null /* userIds */, null /* instantUserIds */, null /* broadcastAllowList */, null /* instantUserIds */, null /* broadcastAllowList */, (callingUid, intentExtras) -> filterExtrasChangedPackageList( (callingUid, intentExtras) -> filterExtrasChangedPackageList( snapshot, callingUid, intentExtras), snapshotSupplier, callingUid, intentExtras), null /* bOptions */, null /* requiredPermissions */); null /* bOptions */, null /* requiredPermissions */); } } Loading Loading @@ -544,7 +545,7 @@ public final class BroadcastHelper { }); }); } } void sendPostInstallBroadcasts(@NonNull Computer snapshot, void sendPostInstallBroadcasts(@NonNull Supplier<Computer> snapshotSupplier, @NonNull InstallRequest request, @NonNull InstallRequest request, @NonNull String packageName, @NonNull String packageName, @NonNull String requiredPermissionControllerPackage, @NonNull String requiredPermissionControllerPackage, Loading @@ -567,8 +568,8 @@ public final class BroadcastHelper { final int[] uids = new int[]{request.getRemovedInfo().mUid}; final int[] uids = new int[]{request.getRemovedInfo().mUid}; notifyResourcesChanged( notifyResourcesChanged( false /* mediaStatus */, true /* replacing */, pkgNames, uids); false /* mediaStatus */, true /* replacing */, pkgNames, uids); sendResourcesChangedBroadcast( sendResourcesChangedBroadcast(snapshotSupplier, snapshot, false /* mediaStatus */, true /* replacing */, pkgNames, uids); false /* mediaStatus */, true /* replacing */, pkgNames, uids); } } sendPackageRemovedBroadcasts( sendPackageRemovedBroadcasts( request.getRemovedInfo(), packageSender, isKillApp, false /*removedBySystem*/, request.getRemovedInfo(), packageSender, isKillApp, false /*removedBySystem*/, Loading Loading @@ -608,6 +609,7 @@ public final class BroadcastHelper { null /* broadcastAllowList */, null); null /* broadcastAllowList */, null); } } final Computer snapshot = snapshotSupplier.get(); // Send installed broadcasts if the package is not a static shared lib. // Send installed broadcasts if the package is not a static shared lib. if (staticSharedLibraryName == null) { if (staticSharedLibraryName == null) { // Send PACKAGE_ADDED broadcast for users that see the package for the first time // Send PACKAGE_ADDED broadcast for users that see the package for the first time Loading Loading @@ -732,7 +734,7 @@ public final class BroadcastHelper { if (!isArchived) { if (!isArchived) { final String[] pkgNames = new String[]{packageName}; final String[] pkgNames = new String[]{packageName}; final int[] uids = new int[]{request.getPkg().getUid()}; final int[] uids = new int[]{request.getPkg().getUid()}; sendResourcesChangedBroadcast(snapshot, sendResourcesChangedBroadcast(snapshotSupplier, true /* mediaStatus */, true /* replacing */, pkgNames, uids); true /* mediaStatus */, true /* replacing */, pkgNames, uids); notifyResourcesChanged(true /* mediaStatus */, notifyResourcesChanged(true /* mediaStatus */, true /* replacing */, pkgNames, uids); true /* replacing */, pkgNames, uids); Loading Loading @@ -860,8 +862,8 @@ public final class BroadcastHelper { * access all the packages in the extras. * access all the packages in the extras. */ */ @Nullable @Nullable private static Bundle filterExtrasChangedPackageList(@NonNull Computer snapshot, int callingUid, private static Bundle filterExtrasChangedPackageList( @NonNull Bundle extras) { @NonNull Supplier<Computer> snapshotSupplier, int callingUid, @NonNull Bundle extras) { if (UserHandle.isCore(callingUid)) { if (UserHandle.isCore(callingUid)) { // see all // see all return extras; return extras; Loading @@ -873,6 +875,7 @@ public final class BroadcastHelper { final int userId = extras.getInt( final int userId = extras.getInt( Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(callingUid)); Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(callingUid)); final int[] uids = extras.getIntArray(Intent.EXTRA_CHANGED_UID_LIST); final int[] uids = extras.getIntArray(Intent.EXTRA_CHANGED_UID_LIST); final Computer snapshot = snapshotSupplier.get(); final Pair<String[], int[]> filteredPkgs = final Pair<String[], int[]> filteredPkgs = filterPackages(snapshot, pkgs, uids, callingUid, userId); filterPackages(snapshot, pkgs, uids, callingUid, userId); if (ArrayUtils.isEmpty(filteredPkgs.first)) { if (ArrayUtils.isEmpty(filteredPkgs.first)) { Loading Loading @@ -952,10 +955,12 @@ public final class BroadcastHelper { final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; final SparseArray<int[]> broadcastAllowList = final SparseArray<int[]> broadcastAllowList = isInstantApp ? null : snapshot.getVisibilityAllowLists(packageName, userIds); isInstantApp ? null : snapshot.getVisibilityAllowLists(packageName, userIds); final String[] sharedUserPackages = snapshot.getSharedUserPackagesForPackage(packageName, userId); mHandler.post(() -> sendPackageChangedBroadcastInternal( mHandler.post(() -> sendPackageChangedBroadcastInternal( packageName, dontKillApp, componentNames, packageUid, reason, userIds, packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, setting.getPkg(), instantUserIds, broadcastAllowList, setting.getPkg(), snapshot.getSharedUserPackagesForPackage(packageName, userId))); sharedUserPackages)); mPackageMonitorCallbackHelper.notifyPackageChanged(packageName, dontKillApp, componentNames, mPackageMonitorCallbackHelper.notifyPackageChanged(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, mHandler); packageUid, reason, userIds, instantUserIds, broadcastAllowList, mHandler); } } Loading Loading @@ -1120,7 +1125,7 @@ public final class BroadcastHelper { * @param uidList The uids of packages which have suspension changes. * @param uidList The uids of packages which have suspension changes. * @param userId The user where packages reside. * @param userId The user where packages reside. */ */ void sendPackagesSuspendedOrUnsuspendedForUser(@NonNull Computer snapshot, void sendPackagesSuspendedOrUnsuspendedForUser(@NonNull Supplier<Computer> snapshotSupplier, @NonNull String intent, @NonNull String intent, @NonNull String[] pkgList, @NonNull String[] pkgList, @NonNull int[] uidList, @NonNull int[] uidList, Loading @@ -1138,7 +1143,7 @@ public final class BroadcastHelper { .toBundle(); .toBundle(); BiFunction<Integer, Bundle, Bundle> filterExtrasForReceiver = BiFunction<Integer, Bundle, Bundle> filterExtrasForReceiver = (callingUid, intentExtras) -> BroadcastHelper.filterExtrasChangedPackageList( (callingUid, intentExtras) -> BroadcastHelper.filterExtrasChangedPackageList( snapshot, callingUid, intentExtras); snapshotSupplier, callingUid, intentExtras); mHandler.post(() -> sendPackageBroadcast(intent, null /* pkg */, mHandler.post(() -> sendPackageBroadcast(intent, null /* pkg */, extras, flags, null /* targetPkg */, null /* finishedReceiver */, extras, flags, null /* targetPkg */, null /* finishedReceiver */, new int[]{userId}, null /* instantUserIds */, null /* broadcastAllowList */, new int[]{userId}, null /* instantUserIds */, null /* broadcastAllowList */, Loading @@ -1148,7 +1153,7 @@ public final class BroadcastHelper { null /* instantUserIds */, null /* broadcastAllowList */, filterExtrasForReceiver); null /* instantUserIds */, null /* broadcastAllowList */, filterExtrasForReceiver); } } void sendMyPackageSuspendedOrUnsuspended(@NonNull Computer snapshot, void sendMyPackageSuspendedOrUnsuspended(@NonNull Supplier<Computer> snapshotSupplier, @NonNull String[] affectedPackages, @NonNull String[] affectedPackages, boolean suspended, boolean suspended, int userId) { int userId) { Loading @@ -1163,6 +1168,7 @@ public final class BroadcastHelper { return; return; } } final int[] targetUserIds = new int[] {userId}; final int[] targetUserIds = new int[] {userId}; final Computer snapshot = snapshotSupplier.get(); for (String packageName : affectedPackages) { for (String packageName : affectedPackages) { final Bundle appExtras = suspended final Bundle appExtras = suspended ? SuspendPackageHelper.getSuspendedPackageAppExtras( ? SuspendPackageHelper.getSuspendedPackageAppExtras( Loading Loading @@ -1192,7 +1198,7 @@ public final class BroadcastHelper { * @param uidList The uids of packages which have suspension changes. * @param uidList The uids of packages which have suspension changes. * @param userId The user where packages reside. * @param userId The user where packages reside. */ */ void sendDistractingPackagesChanged(@NonNull Computer snapshot, void sendDistractingPackagesChanged(@NonNull Supplier<Computer> snapshotSupplier, @NonNull String[] pkgList, @NonNull String[] pkgList, @NonNull int[] uidList, @NonNull int[] uidList, int userId, int userId, Loading @@ -1208,11 +1214,11 @@ public final class BroadcastHelper { null /* finishedReceiver */, new int[]{userId}, null /* instantUserIds */, null /* finishedReceiver */, new int[]{userId}, null /* instantUserIds */, null /* broadcastAllowList */, null /* broadcastAllowList */, (callingUid, intentExtras) -> filterExtrasChangedPackageList( (callingUid, intentExtras) -> filterExtrasChangedPackageList( snapshot, callingUid, intentExtras), snapshotSupplier, callingUid, intentExtras), null /* bOptions */, null /* requiredPermissions */)); null /* bOptions */, null /* requiredPermissions */)); } } void sendResourcesChangedBroadcastAndNotify(@NonNull Computer snapshot, void sendResourcesChangedBroadcastAndNotify(@NonNull Supplier<Computer> snapshotSupplier, boolean mediaStatus, boolean mediaStatus, boolean replacing, boolean replacing, @NonNull ArrayList<AndroidPackage> packages) { @NonNull ArrayList<AndroidPackage> packages) { Loading @@ -1224,7 +1230,7 @@ public final class BroadcastHelper { packageNames[i] = pkg.getPackageName(); packageNames[i] = pkg.getPackageName(); packageUids[i] = pkg.getUid(); packageUids[i] = pkg.getUid(); } } sendResourcesChangedBroadcast(snapshot, mediaStatus, sendResourcesChangedBroadcast(snapshotSupplier, mediaStatus, replacing, packageNames, packageUids); replacing, packageNames, packageUids); notifyResourcesChanged(mediaStatus, replacing, packageNames, packageUids); notifyResourcesChanged(mediaStatus, replacing, packageNames, packageUids); } } Loading
services/core/java/com/android/server/pm/DistractingPackageHelper.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -123,7 +123,7 @@ public final class DistractingPackageHelper { if (!changedPackagesList.isEmpty()) { if (!changedPackagesList.isEmpty()) { final String[] changedPackages = changedPackagesList.toArray( final String[] changedPackages = changedPackagesList.toArray( new String[changedPackagesList.size()]); new String[changedPackagesList.size()]); mBroadcastHelper.sendDistractingPackagesChanged(mPm.snapshotComputer(), mBroadcastHelper.sendDistractingPackagesChanged(mPm::snapshotComputer, changedPackages, changedUids.toArray(), userId, restrictionFlags); changedPackages, changedUids.toArray(), userId, restrictionFlags); mPm.scheduleWritePackageRestrictions(userId); mPm.scheduleWritePackageRestrictions(userId); } } Loading Loading @@ -198,7 +198,7 @@ public final class DistractingPackageHelper { if (!changedPackages.isEmpty()) { if (!changedPackages.isEmpty()) { final String[] packageArray = changedPackages.toArray( final String[] packageArray = changedPackages.toArray( new String[changedPackages.size()]); new String[changedPackages.size()]); mBroadcastHelper.sendDistractingPackagesChanged(mPm.snapshotComputer(), mBroadcastHelper.sendDistractingPackagesChanged(mPm::snapshotComputer, packageArray, changedUids.toArray(), userId, RESTRICTION_NONE); packageArray, changedUids.toArray(), userId, RESTRICTION_NONE); mPm.scheduleWritePackageRestrictions(userId); mPm.scheduleWritePackageRestrictions(userId); } } Loading
services/core/java/com/android/server/pm/InstallPackageHelper.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -3084,7 +3084,7 @@ final class InstallPackageHelper { mPm.mProcessLoggingHandler.invalidateBaseApkHash(request.getPkg().getBaseApkPath()); mPm.mProcessLoggingHandler.invalidateBaseApkHash(request.getPkg().getBaseApkPath()); } } mBroadcastHelper.sendPostInstallBroadcasts(mPm.snapshotComputer(), request, packageName, mBroadcastHelper.sendPostInstallBroadcasts(mPm::snapshotComputer, request, packageName, mPm.mRequiredPermissionControllerPackage, mPm.mRequiredVerifierPackages, mPm.mRequiredPermissionControllerPackage, mPm.mRequiredVerifierPackages, mPm.mRequiredInstallerPackage, mPm.mRequiredInstallerPackage, /* packageSender= */ mPm, launchedForRestore, killApp, update, archived); /* packageSender= */ mPm, launchedForRestore, killApp, update, archived); Loading
services/core/java/com/android/server/pm/StorageEventHelper.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -227,7 +227,7 @@ public final class StorageEventHelper extends StorageEventListener { } } if (DEBUG_INSTALL) Slog.d(TAG, "Loaded packages " + loaded); if (DEBUG_INSTALL) Slog.d(TAG, "Loaded packages " + loaded); mBroadcastHelper.sendResourcesChangedBroadcastAndNotify(mPm.snapshotComputer(), mBroadcastHelper.sendResourcesChangedBroadcastAndNotify(mPm::snapshotComputer, true /* mediaStatus */, false /* replacing */, loaded); true /* mediaStatus */, false /* replacing */, loaded); synchronized (mLoadedVolumes) { synchronized (mLoadedVolumes) { mLoadedVolumes.add(vol.getId()); mLoadedVolumes.add(vol.getId()); Loading Loading @@ -279,7 +279,7 @@ public final class StorageEventHelper extends StorageEventListener { } } if (DEBUG_INSTALL) Slog.d(TAG, "Unloaded packages " + unloaded); if (DEBUG_INSTALL) Slog.d(TAG, "Unloaded packages " + unloaded); mBroadcastHelper.sendResourcesChangedBroadcastAndNotify(mPm.snapshotComputer(), mBroadcastHelper.sendResourcesChangedBroadcastAndNotify(mPm::snapshotComputer, false /* mediaStatus */, false /* replacing */, unloaded); false /* mediaStatus */, false /* replacing */, unloaded); synchronized (mLoadedVolumes) { synchronized (mLoadedVolumes) { mLoadedVolumes.remove(vol.getId()); mLoadedVolumes.remove(vol.getId()); Loading
services/core/java/com/android/server/pm/SuspendPackageHelper.java +7 −9 Original line number Original line Diff line number Diff line Loading @@ -192,21 +192,20 @@ public final class SuspendPackageHelper { } } }); }); final Computer newSnapshot = mPm.snapshotComputer(); if (!notifyPackagesList.isEmpty()) { if (!notifyPackagesList.isEmpty()) { final String[] changedPackages = final String[] changedPackages = notifyPackagesList.toArray(new String[0]); notifyPackagesList.toArray(new String[0]); mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(newSnapshot, mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(mPm::snapshotComputer, suspended ? Intent.ACTION_PACKAGES_SUSPENDED suspended ? Intent.ACTION_PACKAGES_SUSPENDED : Intent.ACTION_PACKAGES_UNSUSPENDED, : Intent.ACTION_PACKAGES_UNSUSPENDED, changedPackages, notifyUids.toArray(), quarantined, targetUserId); changedPackages, notifyUids.toArray(), quarantined, targetUserId); mBroadcastHelper.sendMyPackageSuspendedOrUnsuspended(newSnapshot, changedPackages, mBroadcastHelper.sendMyPackageSuspendedOrUnsuspended(mPm::snapshotComputer, suspended, targetUserId); changedPackages, suspended, targetUserId); mPm.scheduleWritePackageRestrictions(targetUserId); mPm.scheduleWritePackageRestrictions(targetUserId); } } // Send the suspension changed broadcast to ensure suspension state is not stale. // Send the suspension changed broadcast to ensure suspension state is not stale. if (!changedPackagesList.isEmpty()) { if (!changedPackagesList.isEmpty()) { mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(newSnapshot, mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(mPm::snapshotComputer, Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, changedPackagesList.toArray(new String[0]), changedUids.toArray(), quarantined, changedPackagesList.toArray(new String[0]), changedUids.toArray(), quarantined, targetUserId); targetUserId); Loading Loading @@ -343,13 +342,12 @@ public final class SuspendPackageHelper { }); }); mPm.scheduleWritePackageRestrictions(targetUserId); mPm.scheduleWritePackageRestrictions(targetUserId); final Computer newSnapshot = mPm.snapshotComputer(); if (!unsuspendedPackages.isEmpty()) { if (!unsuspendedPackages.isEmpty()) { final String[] packageArray = unsuspendedPackages.toArray( final String[] packageArray = unsuspendedPackages.toArray( new String[unsuspendedPackages.size()]); new String[unsuspendedPackages.size()]); mBroadcastHelper.sendMyPackageSuspendedOrUnsuspended(newSnapshot, packageArray, mBroadcastHelper.sendMyPackageSuspendedOrUnsuspended(mPm::snapshotComputer, false, targetUserId); packageArray, false, targetUserId); mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(newSnapshot, mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(mPm::snapshotComputer, Intent.ACTION_PACKAGES_UNSUSPENDED, Intent.ACTION_PACKAGES_UNSUSPENDED, packageArray, unsuspendedUids.toArray(), false, targetUserId); packageArray, unsuspendedUids.toArray(), false, targetUserId); } } Loading