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

Commit 14c35bff authored by Alex Buynytskyy's avatar Alex Buynytskyy Committed by Android (Google) Code Review
Browse files

Merge "Broadcasts for: install archived." into main

parents 2632db84 43f50df2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -11094,6 +11094,7 @@ package android.content {
    field public static final String EXTRA_ALLOW_MULTIPLE = "android.intent.extra.ALLOW_MULTIPLE";
    field @Deprecated public static final String EXTRA_ALLOW_REPLACE = "android.intent.extra.ALLOW_REPLACE";
    field public static final String EXTRA_ALTERNATE_INTENTS = "android.intent.extra.ALTERNATE_INTENTS";
    field public static final String EXTRA_ARCHIVAL = "android.intent.extra.ARCHIVAL";
    field public static final String EXTRA_ASSIST_CONTEXT = "android.intent.extra.ASSIST_CONTEXT";
    field public static final String EXTRA_ASSIST_INPUT_DEVICE_ID = "android.intent.extra.ASSIST_INPUT_DEVICE_ID";
    field public static final String EXTRA_ASSIST_INPUT_HINT_KEYBOARD = "android.intent.extra.ASSIST_INPUT_HINT_KEYBOARD";
+8 −0
Original line number Diff line number Diff line
@@ -6269,6 +6269,14 @@ public class Intent implements Parcelable, Cloneable {
     */
    public static final String EXTRA_REPLACING = "android.intent.extra.REPLACING";
    /**
     * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_ADDED} and
     * {@link android.content.Intent#ACTION_PACKAGE_REMOVED} intents to indicate that
     * the package is being archived. Either by removing the existing APK, or by installing
     * a package without an APK.
     */
    public static final String EXTRA_ARCHIVAL = "android.intent.extra.ARCHIVAL";
    /**
     * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED}
     * intents to indicate that this is a system update uninstall.
+6 −4
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.server.pm;
import static android.os.PowerExemptionManager.REASON_LOCKED_BOOT_COMPLETED;
import static android.os.PowerExemptionManager.TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
import static android.safetylabel.SafetyLabelConstants.SAFETY_LABEL_CHANGE_NOTIFICATIONS_ENABLED;

import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL;
import static com.android.server.pm.PackageManagerService.PACKAGE_SCHEME;
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
@@ -323,14 +322,17 @@ public final class BroadcastHelper {
        }
    }

    public void sendPackageAddedForNewUsers(String packageName,
            @AppIdInt int appId, int[] userIds, int[] instantUserIds,
            int dataLoaderType, SparseArray<int[]> broadcastAllowlist) {
    public void sendPackageAddedForNewUsers(String packageName, @AppIdInt int appId, int[] userIds,
            int[] instantUserIds, boolean isArchived, int dataLoaderType,
            SparseArray<int[]> broadcastAllowlist) {
        Bundle extras = new Bundle(1);
        // Set to UID of the first user, EXTRA_UID is automatically updated in sendPackageBroadcast
        final int uid = UserHandle.getUid(
                (ArrayUtils.isEmpty(userIds) ? instantUserIds[0] : userIds[0]), appId);
        extras.putInt(Intent.EXTRA_UID, uid);
        if (isArchived) {
            extras.putBoolean(Intent.EXTRA_ARCHIVAL, true);
        }
        extras.putInt(PackageInstaller.EXTRA_DATA_LOADER_TYPE, dataLoaderType);

        sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED,
+3 −3
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ import static android.content.pm.PackageManager.DELETE_KEEP_DATA;
import static android.content.pm.PackageManager.DELETE_SUCCEEDED;
import static android.content.pm.PackageManager.MATCH_KNOWN_PACKAGES;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;

import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.PackageManagerService.DEBUG_COMPRESSION;
import static com.android.server.pm.PackageManagerService.DEBUG_REMOVE;
@@ -120,13 +119,14 @@ final class DeletePackageHelper {
     */
    public int deletePackageX(String packageName, long versionCode, int userId, int deleteFlags,
            boolean removedBySystem) {
        final boolean isArchived = false; // TODO(b/278553670) Pass true during archival.

        final PackageRemovedInfo info = new PackageRemovedInfo(mPm);
        final boolean res;

        final int removeUser = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0
                ? UserHandle.USER_ALL : userId;


        final PackageSetting uninstalledPs;
        final PackageSetting disabledSystemPs;
        final AndroidPackage pkg;
@@ -250,7 +250,7 @@ final class DeletePackageHelper {

        if (res) {
            final boolean killApp = (deleteFlags & PackageManager.DELETE_DONT_KILL_APP) == 0;
            info.sendPackageRemovedBroadcasts(killApp, removedBySystem);
            info.sendPackageRemovedBroadcasts(killApp, removedBySystem, isArchived);
            info.sendSystemPackageUpdatedBroadcasts();
            PackageMetrics.onUninstallSucceeded(info, deleteFlags, removeUser);
        }
+44 −22
Original line number Diff line number Diff line
@@ -729,8 +729,10 @@ final class InstallPackageHelper {
                        mAppDataHelper.prepareAppDataAfterInstallLIF(pkgSetting.getPkg());
                    }
                }
                // TODO(b/278553670) Store archive state for the user.
                boolean isArchived = (pkgSetting.getPkg() == null);
                mPm.sendPackageAddedForUser(mPm.snapshotComputer(), packageName, pkgSetting, userId,
                        DataLoaderType.NONE);
                        isArchived, DataLoaderType.NONE);
                synchronized (mPm.mLock) {
                    mPm.updateSequenceNumberLP(pkgSetting, new int[]{ userId });
                }
@@ -1713,7 +1715,6 @@ final class InstallPackageHelper {
                    installedUsers = ps.queryInstalledUsers(allUsers, true);
                    uninstalledUsers = ps.queryInstalledUsers(allUsers, false);


                    // don't allow an upgrade from full to ephemeral
                    if (isInstantApp) {
                        if (request.getUserId() == UserHandle.USER_ALL) {
@@ -2798,6 +2799,7 @@ final class InstallPackageHelper {
        final int dataLoaderType = request.getDataLoaderType();
        final boolean succeeded = request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED;
        final boolean update = request.isUpdate();
        final boolean archived = request.isArchived();
        final String packageName = request.getName();
        final PackageStateInternal pkgSetting =
                succeeded ? mPm.snapshotComputer().getPackageStateInternal(packageName) : null;
@@ -2837,7 +2839,7 @@ final class InstallPackageHelper {
                            false /* mediaStatus */, true /* replacing */, pkgNames, uids);
                }
                request.getRemovedInfo().sendPackageRemovedBroadcasts(
                        killApp, false /*removedBySystem*/);
                        killApp, false /*removedBySystem*/, false /*isArchived*/);
            }

            final String installerPackageName =
@@ -2896,6 +2898,9 @@ final class InstallPackageHelper {
            if (update) {
                extras.putBoolean(Intent.EXTRA_REPLACING, true);
            }
            if (archived) {
                extras.putBoolean(Intent.EXTRA_ARCHIVAL, true);
            }
            extras.putInt(PackageInstaller.EXTRA_DATA_LOADER_TYPE, dataLoaderType);

            // If a package is a static shared library, then only the installer of the package
@@ -2919,7 +2924,7 @@ final class InstallPackageHelper {
                boolean isSystem = request.isInstallSystem();
                mPm.sendPackageAddedForNewUsers(mPm.snapshotComputer(), packageName,
                        isSystem || virtualPreload, virtualPreload /*startReceiver*/, appId,
                        firstUserIds, firstInstantUserIds, dataLoaderType);
                        firstUserIds, firstInstantUserIds, archived, dataLoaderType);

                // Send PACKAGE_ADDED broadcast for users that don't see
                // the package for the first time
@@ -3034,6 +3039,7 @@ final class InstallPackageHelper {
                    if (DEBUG_INSTALL) {
                        Slog.i(TAG, "upgrading pkg " + request.getPkg() + " is external");
                    }
                    if (!archived) {
                        final String[] pkgNames = new String[]{packageName};
                        final int[] uids = new int[]{request.getPkg().getUid()};
                        mBroadcastHelper.sendResourcesChangedBroadcast(mPm::snapshotComputer,
@@ -3041,6 +3047,7 @@ final class InstallPackageHelper {
                        mPm.notifyResourcesChanged(true /* mediaStatus */, true /* replacing */,
                                pkgNames, uids);
                    }
                }
            } else if (!ArrayUtils.isEmpty(request.getLibraryConsumers())) { // if static shared lib
                // No need to kill consumers if it's installation of new version static shared lib.
                final Computer snapshot = mPm.snapshotComputer();
@@ -3092,6 +3099,7 @@ final class InstallPackageHelper {
                VMRuntime.getRuntime().requestConcurrentGC();
            }

            if (!archived) {
                final Computer snapshot = mPm.snapshotComputer();
                // Notify DexManager that the package was installed for new users.
                // The updated users should already be indexed and the package code paths
@@ -3106,6 +3114,20 @@ final class InstallPackageHelper {
                        mDexManager.notifyPackageInstalled(info, userId);
                    }
                }
            } else {
                // Now send PACKAGE_REMOVED + EXTRA_REPLACING broadcast.
                final PackageRemovedInfo info = new PackageRemovedInfo(mPm);
                info.mRemovedPackage = packageName;
                info.mInstallerPackageName = request.getInstallerPackageName();
                info.mRemovedUsers = firstUserIds;
                info.mBroadcastUsers = firstUserIds;
                info.mRemovedAppId = request.getAppId();
                info.mRemovedPackageVersionCode = request.getPkg().getLongVersionCode();
                info.mRemovedForAllUsers = true;

                info.sendPackageRemovedBroadcasts(false /*killApp*/,
                        false /*removedBySystem*/, true /*isArchived*/);
            }
        }

        final boolean deferInstallObserver = succeeded && update;
Loading