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

Commit 30348d5c authored by Songchun Fan's avatar Songchun Fan Committed by Android (Google) Code Review
Browse files

Merge "Persist destroyed staged sessions until they are cleaned up" into qt-dev

parents 5bf4a3f2 61519410
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -659,7 +659,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
        session = new PackageInstallerSession(mInternalCallback, mContext, mPm, this,
                mInstallThread.getLooper(), mStagingManager, sessionId, userId,
                installerPackageName, callingUid, params, createdMillis, stageDir, stageCid, false,
                false, false, null, SessionInfo.INVALID_ID, false, false, false,
                false, false, false, null, SessionInfo.INVALID_ID, false, false, false,
                SessionInfo.STAGED_SESSION_NO_ERROR, "");

        synchronized (mSessions) {
@@ -809,7 +809,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
        synchronized (mSessions) {
            final PackageInstallerSession session = mSessions.get(sessionId);

            return session != null
            return (session != null && !(session.isStaged() && session.isDestroyed()))
                    ? session.generateInfoForCaller(true /*withIcon*/, Binder.getCallingUid())
                    : null;
        }
@@ -830,7 +830,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
        synchronized (mSessions) {
            for (int i = 0; i < mSessions.size(); i++) {
                final PackageInstallerSession session = mSessions.valueAt(i);
                if (session.userId == userId && !session.hasParentSessionId()) {
                if (session.userId == userId && !session.hasParentSessionId()
                        && !(session.isStaged() && session.isDestroyed())) {
                    result.add(session.generateInfoForCaller(false, callingUid));
                }
            }
+16 −5
Original line number Diff line number Diff line
@@ -151,6 +151,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
    private static final String ATTR_SESSION_STAGE_CID = "sessionStageCid";
    private static final String ATTR_PREPARED = "prepared";
    private static final String ATTR_COMMITTED = "committed";
    private static final String ATTR_DESTROYED = "destroyed";
    private static final String ATTR_SEALED = "sealed";
    private static final String ATTR_MULTI_PACKAGE = "multiPackage";
    private static final String ATTR_PARENT_SESSION_ID = "parentSessionId";
@@ -413,8 +414,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            PackageSessionProvider sessionProvider, Looper looper, StagingManager stagingManager,
            int sessionId, int userId,
            String installerPackageName, int installerUid, SessionParams params, long createdMillis,
            File stageDir, String stageCid, boolean prepared, boolean committed, boolean sealed,
            @Nullable int[] childSessionIds, int parentSessionId, boolean isReady,
            File stageDir, String stageCid, boolean prepared, boolean committed, boolean destroyed,
            boolean sealed, @Nullable int[] childSessionIds, int parentSessionId, boolean isReady,
            boolean isFailed, boolean isApplied, int stagedSessionErrorCode,
            String stagedSessionErrorMessage) {
        mCallback = callback;
@@ -449,6 +450,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

        mPrepared = prepared;
        mCommitted = committed;
        mDestroyed = destroyed;
        mStagedSessionReady = isReady;
        mStagedSessionFailed = isFailed;
        mStagedSessionApplied = isApplied;
@@ -559,6 +561,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        }
    }

    /** {@hide} */
    boolean isDestroyed() {
        synchronized (mLock) {
            return mDestroyed;
        }
    }

    /** Returns true if a staged session has reached a final state and can be forgotten about  */
    public boolean isStagedAndInTerminalState() {
        synchronized (mLock) {
@@ -2421,7 +2430,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
     */
    void write(@NonNull XmlSerializer out, @NonNull File sessionsDir) throws IOException {
        synchronized (mLock) {
            if (mDestroyed) {
            if (mDestroyed && !params.isStaged) {
                return;
            }

@@ -2443,6 +2452,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            }
            writeBooleanAttribute(out, ATTR_PREPARED, isPrepared());
            writeBooleanAttribute(out, ATTR_COMMITTED, isCommitted());
            writeBooleanAttribute(out, ATTR_DESTROYED, isDestroyed());
            writeBooleanAttribute(out, ATTR_SEALED, isSealed());

            writeBooleanAttribute(out, ATTR_MULTI_PACKAGE, params.isMultiPackage);
@@ -2544,6 +2554,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        final String stageCid = readStringAttribute(in, ATTR_SESSION_STAGE_CID);
        final boolean prepared = readBooleanAttribute(in, ATTR_PREPARED, true);
        final boolean committed = readBooleanAttribute(in, ATTR_COMMITTED);
        final boolean destroyed = readBooleanAttribute(in, ATTR_DESTROYED);
        final boolean sealed = readBooleanAttribute(in, ATTR_SEALED);
        final int parentSessionId = readIntAttribute(in, ATTR_PARENT_SESSION_ID,
                SessionInfo.INVALID_ID);
@@ -2631,8 +2642,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        return new PackageInstallerSession(callback, context, pm, sessionProvider,
                installerThread, stagingManager, sessionId, userId, installerPackageName,
                installerUid, params, createdMillis, stageDir, stageCid, prepared, committed,
                sealed, childSessionIdsArray, parentSessionId, isReady, isFailed, isApplied,
                stagedSessionErrorCode, stagedSessionErrorMessage);
                destroyed, sealed, childSessionIdsArray, parentSessionId, isReady, isFailed,
                isApplied, stagedSessionErrorCode, stagedSessionErrorMessage);
    }

    /**
+3 −0
Original line number Diff line number Diff line
@@ -99,6 +99,9 @@ public class StagingManager {
        synchronized (mStagedSessions) {
            for (int i = 0; i < mStagedSessions.size(); i++) {
                final PackageInstallerSession stagedSession = mStagedSessions.valueAt(i);
                if (stagedSession.isDestroyed()) {
                    continue;
                }
                result.add(stagedSession.generateInfoForCaller(false /*icon*/, callingUid));
            }
        }
+1 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@ public class PackageInstallerSessionTest {
                /* stageCid */ null,
                /* prepared */ true,
                /* committed */ true,
                /* destroyed */ staged ? true : false,
                /* sealed */ false,  // Setting to true would trigger some PM logic.
                /* childSessionIds */ childSessionIds != null ? childSessionIds : new int[0],
                /* parentSessionId */ parentSessionId,