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

Commit a7206681 authored by Mohammad Samiul Islam's avatar Mohammad Samiul Islam Committed by Android (Google) Code Review
Browse files

Merge "Move session contains apex/apk logic inside session object"

parents 005bfa11 5af2a7eb
Loading
Loading
Loading
Loading
+31 −6
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@ import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;

public class PackageInstallerSession extends IPackageInstallerSession.Stub {
    private static final String TAG = "PackageInstallerSession";
@@ -689,7 +690,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
                stagedSessionErrorMessage != null ? stagedSessionErrorMessage : "";

        if (isDataLoaderInstallation()) {
            if (isApexInstallation()) {
            if (isApexSession()) {
                throw new IllegalArgumentException(
                        "DataLoader installation of APEX modules is not allowed.");
            }
@@ -1576,7 +1577,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
                        return false;
                    }

                    if (isApexInstallation()) {
                    if (isApexSession()) {
                        validateApexInstallLocked();
                    } else {
                        validateApkInstallLocked();
@@ -1733,7 +1734,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            try {
                sealLocked();

                if (isApexInstallation()) {
                if (isApexSession()) {
                    // APEX installations rely on certain fields to be populated after reboot.
                    // E.g. mPackageName.
                    validateApexInstallLocked();
@@ -1809,7 +1810,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            return;
        }

        if (isApexInstallation()) {
        if (isApexSession()) {
            destroyInternal();
            dispatchSessionFinished(PackageManager.INSTALL_FAILED_INTERNAL_ERROR,
                    "APEX packages can only be installed using staged sessions.", null);
@@ -1986,7 +1987,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

        // TODO(b/136257624): Some logic in this if block probably belongs in
        //  makeInstallParams().
        if (!params.isMultiPackage && !isApexInstallation()) {
        if (!params.isMultiPackage && !isApexSession()) {
            Objects.requireNonNull(mPackageName);
            Objects.requireNonNull(mSigningDetails);
            Objects.requireNonNull(mResolvedBaseFile);
@@ -2215,10 +2216,34 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
    /**
     * Returns true if the session is installing an APEX package.
     */
    private boolean isApexInstallation() {
    boolean isApexSession() {
        return (params.installFlags & PackageManager.INSTALL_APEX) != 0;
    }

    private boolean sessionContains(Predicate<PackageInstallerSession> filter) {
        if (!isMultiPackage()) {
            return filter.test(this);
        }
        final List<PackageInstallerSession> childSessions;
        synchronized (mLock) {
            childSessions = getChildSessionsLocked();
        }
        for (PackageInstallerSession child: childSessions) {
            if (filter.test(child)) {
                return true;
            }
        }
        return false;
    }

    boolean containsApexSession() {
        return sessionContains((s) -> s.isApexSession());
    }

    boolean containsApkSession() {
        return sessionContains((s) -> !s.isApexSession());
    }

    /**
     * Validate apex install.
     * <p>
+10 −36
Original line number Diff line number Diff line
@@ -86,7 +86,6 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
@@ -226,7 +225,7 @@ public class StagingManager {
        final IntArray childSessionIds = new IntArray();
        if (session.isMultiPackage()) {
            for (PackageInstallerSession s : session.getChildSessions()) {
                if (isApexSession(s)) {
                if (s.isApexSession()) {
                    childSessionIds.add(s.sessionId);
                }
            }
@@ -329,31 +328,6 @@ public class StagingManager {
        }
    }

    private static boolean isApexSession(@NonNull PackageInstallerSession session) {
        return (session.params.installFlags & PackageManager.INSTALL_APEX) != 0;
    }

    private boolean sessionContains(@NonNull PackageInstallerSession session,
                                    Predicate<PackageInstallerSession> filter) {
        if (!session.isMultiPackage()) {
            return filter.test(session);
        }
        for (PackageInstallerSession s : session.getChildSessions()) {
            if (filter.test(s)) {
                return true;
            }
        }
        return false;
    }

    private boolean sessionContainsApex(@NonNull PackageInstallerSession session) {
        return sessionContains(session, (s) -> isApexSession(s));
    }

    private boolean sessionContainsApk(@NonNull PackageInstallerSession session) {
        return sessionContains(session, (s) -> !isApexSession(s));
    }

    // Reverts apex sessions and user data (if checkpoint is supported). Also reboots the device.
    private void abortCheckpoint(int sessionId, String errorMsg) {
        String failureReason = "Failed to install sessionId: " + sessionId + " Error: " + errorMsg;
@@ -400,7 +374,7 @@ public class StagingManager {
        List<PackageInstallerSession> apexSessions = new ArrayList<>();
        if (session.isMultiPackage()) {
            for (PackageInstallerSession s : session.getChildSessions()) {
                if (sessionContainsApex(s)) {
                if (s.containsApexSession()) {
                    apexSessions.add(s);
                }
            }
@@ -521,7 +495,7 @@ public class StagingManager {
    private void resumeSession(@NonNull PackageInstallerSession session) {
        Slog.d(TAG, "Resuming session " + session.sessionId);

        final boolean hasApex = sessionContainsApex(session);
        final boolean hasApex = session.containsApexSession();
        ApexSessionInfo apexSessionInfo = null;
        if (hasApex) {
            // Check with apexservice whether the apex packages have been activated.
@@ -740,7 +714,7 @@ public class StagingManager {
    @Nullable
    private PackageInstallerSession extractApksInSession(PackageInstallerSession session)
            throws PackageManagerException {
        if (!session.isMultiPackage() && !isApexSession(session)) {
        if (!session.isMultiPackage() && !session.isApexSession()) {
            return createAndWriteApkSession(session);
        } else if (session.isMultiPackage()) {
            // For multi-package staged sessions containing APKs, we identify which child sessions
@@ -749,7 +723,7 @@ public class StagingManager {
            // sessions will be installed atomically.
            final List<PackageInstallerSession> childSessions = new ArrayList<>();
            for (PackageInstallerSession s : session.getChildSessions()) {
                if (!isApexSession(s)) {
                if (!s.isApexSession()) {
                    childSessions.add(s);
                }
            }
@@ -798,7 +772,7 @@ public class StagingManager {
        }
        final Set<String> apkNames = new ArraySet<>();
        for (PackageInstallerSession s : session.getChildSessions()) {
            if (!isApexSession(s)) {
            if (!s.isApexSession()) {
                apkNames.add(s.getPackageName());
            }
        }
@@ -1020,7 +994,7 @@ public class StagingManager {
     * @return returns true if it is ensured that there is no active apex session, otherwise false
     */
    private boolean ensureActiveApexSessionIsAborted(PackageInstallerSession session) {
        if (!sessionContainsApex(session)) {
        if (!session.containsApexSession()) {
            return true;
        }
        final ApexSessionInfo apexSession = mApexManager.getStagedSessionInfo(session.sessionId);
@@ -1342,7 +1316,7 @@ public class StagingManager {
         */
        private void handlePreRebootVerification_Apex(
                @NonNull PackageInstallerSession session, int rollbackId) {
            final boolean hasApex = sessionContainsApex(session);
            final boolean hasApex = session.containsApexSession();

            // APEX checks. For single-package sessions, check if they contain an APEX. For
            // multi-package sessions, find all the child sessions that contain an APEX.
@@ -1372,7 +1346,7 @@ public class StagingManager {
         * {@link #notifyPreRebootVerification_Apk_Complete}
         */
        private void handlePreRebootVerification_Apk(@NonNull PackageInstallerSession session) {
            if (!sessionContainsApk(session)) {
            if (!session.containsApkSession()) {
                notifyPreRebootVerification_Apk_Complete(session);
                return;
            }
@@ -1421,7 +1395,7 @@ public class StagingManager {
            Slog.d(TAG, "Marking session " + session.sessionId + " as ready");
            session.setStagedSessionReady();
            if (session.isStagedSessionReady()) {
                final boolean hasApex = sessionContainsApex(session);
                final boolean hasApex = session.containsApexSession();
                if (hasApex) {
                    try {
                        mApexManager.markStagedSessionReady(session.sessionId);