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

Commit a0809968 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Avoid lambda code to cache computer snapshot" into main

parents dfa6e25b 1fafab3b
Loading
Loading
Loading
Loading
+22 −16
Original line number Original line Diff line number Diff line
@@ -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.
@@ -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,
@@ -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 */);
    }
    }


@@ -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,
@@ -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*/,
@@ -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
@@ -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);
@@ -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;
@@ -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)) {
@@ -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);
    }
    }
@@ -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,
@@ -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 */,
@@ -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) {
@@ -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(
@@ -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,
@@ -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) {
@@ -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);
    }
    }
+2 −2
Original line number Original line Diff line number Diff line
@@ -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);
        }
        }
@@ -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);
        }
        }
+1 −1
Original line number Original line Diff line number Diff line
@@ -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);
+2 −2
Original line number Original line Diff line number Diff line
@@ -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());
@@ -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());
+7 −9
Original line number Original line Diff line number Diff line
@@ -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);
@@ -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