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

Commit 3baeec55 authored by Jakob Schneider's avatar Jakob Schneider
Browse files

Introduce an install flag for unarchivals after all.

This will make logic in launcher3 a lot simpler and faster because we
don't need to fetch ApplicationInfo to check if an app is archived.

Test: PackageInstallerArchiveTest
Change-Id: I2f3d7a23809eed09eb79c5c7f7cb2a540ca106a9
parent d31ed40a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -12605,6 +12605,7 @@ package android.content.pm {
    method public boolean isStagedSessionApplied();
    method public boolean isStagedSessionFailed();
    method public boolean isStagedSessionReady();
    method @FlaggedApi("android.content.pm.archiving") public boolean isUnarchival();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.pm.PackageInstaller.SessionInfo> CREATOR;
    field public static final int INVALID_ID = -1; // 0xffffffff
+11 −0
Original line number Diff line number Diff line
@@ -4381,6 +4381,17 @@ public class PackageInstaller {
            return pendingUserActionReason;
        }

        /**
         * Returns true if the session is an unarchival.
         *
         * @see PackageInstaller#requestUnarchive
         */
        @FlaggedApi(Flags.FLAG_ARCHIVING)
        public boolean isUnarchival() {
            return (installFlags & PackageManager.INSTALL_UNARCHIVE) != 0;
        }


        @Override
        public int describeContents() {
            return 0;
+11 −1
Original line number Diff line number Diff line
@@ -1519,6 +1519,7 @@ public abstract class PackageManager {
            INSTALL_REQUEST_UPDATE_OWNERSHIP,
            INSTALL_IGNORE_DEXOPT_PROFILE,
            INSTALL_UNARCHIVE_DRAFT,
            INSTALL_UNARCHIVE,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface InstallFlags {}
@@ -1766,12 +1767,21 @@ public abstract class PackageManager {
     * If set, then the session is a draft session created for an upcoming unarchival by its
     * installer.
     *
     * @see PackageInstaller#requestUnarchive(String)
     * @see PackageInstaller#requestUnarchive
     *
     * @hide
     */
    public static final int INSTALL_UNARCHIVE_DRAFT = 1 << 29;

    /**
     * If set, then the {@link PackageInstaller.Session} is an unarchival.
     *
     * @see PackageInstaller#requestUnarchive
     *
     * @hide
     */
    public static final int INSTALL_UNARCHIVE = 1 << 30;

    /**
     * Flag parameter for {@link #installPackage} to force a non-staged update of an APEX. This is
     * a development-only feature and should not be used on end user devices.
+12 −0
Original line number Diff line number Diff line
@@ -821,6 +821,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
            params.installFlags &= ~PackageManager.INSTALL_BYPASS_LOW_TARGET_SDK_BLOCK;
        }

        params.installFlags &= ~PackageManager.INSTALL_UNARCHIVE;
        if (Flags.archiving() && params.appPackageName != null) {
            PackageStateInternal ps = mPm.snapshotComputer().getPackageStateInternal(
                    params.appPackageName, SYSTEM_UID);
            if (ps != null
                    && PackageArchiver.isArchived(ps.getUserStateOrDefault(userId))
                    && PackageArchiver.getResponsibleInstallerPackage(ps)
                            .equals(requestedInstallerPackageName)) {
                params.installFlags |= PackageManager.INSTALL_UNARCHIVE;
            }
        }

        if ((params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0
                && !PackageManagerServiceUtils.isSystemOrRootOrShell(callingUid)
                && (snapshot.getFlagsForUid(callingUid) & ApplicationInfo.FLAG_SYSTEM)