diff options
| author | 2019-02-24 21:01:29 +0000 | |
|---|---|---|
| committer | 2019-02-25 13:09:48 +0000 | |
| commit | 60a96c17918f2e3792b10a102571c769a1a8807b (patch) | |
| tree | 42fa37f95d41cf2e3316391022a57e3670abfdec | |
| parent | b953577b2784bebfc47ca8ad31fa55f2ea9808d1 (diff) | |
Add "Staged" to API related to staged sessions.
Also, throw an IllegalArgumentException is these APIs are called on
sessions that are not marked as staged.
Test: tested new apis with an ad-hoc app. atest RollbackTest
StagedRollbackTest
Fix: 124507718
Change-Id: I3529aaff404d644ab6dad98f29411141e8df865d
7 files changed, 45 insertions, 34 deletions
diff --git a/api/current.txt b/api/current.txt index 7e0156ff0bda..46d1f910e1f9 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11457,10 +11457,10 @@ package android.content.pm { method public boolean isActive(); method public boolean isMultiPackage(); method public boolean isSealed(); - method public boolean isSessionApplied(); - method public boolean isSessionFailed(); - method public boolean isSessionReady(); method public boolean isStaged(); + method public boolean isStagedSessionApplied(); + method public boolean isStagedSessionFailed(); + method public boolean isStagedSessionReady(); 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 diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 63020712acce..0304f19cc5b4 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -1743,11 +1743,11 @@ public class PackageInstaller { public int[] childSessionIds = NO_SESSIONS; /** {@hide} */ - public boolean isSessionApplied; + public boolean isStagedSessionApplied; /** {@hide} */ - public boolean isSessionReady; + public boolean isStagedSessionReady; /** {@hide} */ - public boolean isSessionFailed; + public boolean isStagedSessionFailed; private int mStagedSessionErrorCode; private String mStagedSessionErrorMessage; @@ -1786,9 +1786,9 @@ public class PackageInstaller { if (childSessionIds == null) { childSessionIds = NO_SESSIONS; } - isSessionApplied = source.readBoolean(); - isSessionReady = source.readBoolean(); - isSessionFailed = source.readBoolean(); + isStagedSessionApplied = source.readBoolean(); + isStagedSessionReady = source.readBoolean(); + isStagedSessionFailed = source.readBoolean(); mStagedSessionErrorCode = source.readInt(); mStagedSessionErrorMessage = source.readString(); } @@ -2082,36 +2082,46 @@ public class PackageInstaller { return childSessionIds; } + private void checkSessionIsStaged() { + if (!isStaged) { + throw new IllegalStateException("Session is not marked as staged."); + } + } + /** * Whether the staged session has been applied successfully, meaning that all of its * packages have been activated and no further action is required. * Only meaningful if {@code isStaged} is true. */ - public boolean isSessionApplied() { - return isSessionApplied; + public boolean isStagedSessionApplied() { + checkSessionIsStaged(); + return isStagedSessionApplied; } /** * Whether the staged session is ready to be applied at next reboot. Only meaningful if * {@code isStaged} is true. */ - public boolean isSessionReady() { - return isSessionReady; + public boolean isStagedSessionReady() { + checkSessionIsStaged(); + return isStagedSessionReady; } /** * Whether something went wrong and the staged session is declared as failed, meaning that * it will be ignored at next reboot. Only meaningful if {@code isStaged} is true. */ - public boolean isSessionFailed() { - return isSessionFailed; + public boolean isStagedSessionFailed() { + checkSessionIsStaged(); + return isStagedSessionFailed; } /** * If something went wrong with a staged session, clients can check this error code to * understand which kind of failure happened. Only meaningful if {@code isStaged} is true. */ - public int getStagedSessionErrorCode() { + public @StagedSessionErrorCode int getStagedSessionErrorCode() { + checkSessionIsStaged(); return mStagedSessionErrorCode; } @@ -2120,6 +2130,7 @@ public class PackageInstaller { * empty string if no error was encountered. */ public String getStagedSessionErrorMessage() { + checkSessionIsStaged(); return mStagedSessionErrorMessage; } @@ -2162,9 +2173,9 @@ public class PackageInstaller { dest.writeBoolean(isStaged); dest.writeInt(parentSessionId); dest.writeIntArray(childSessionIds); - dest.writeBoolean(isSessionApplied); - dest.writeBoolean(isSessionReady); - dest.writeBoolean(isSessionFailed); + dest.writeBoolean(isStagedSessionApplied); + dest.writeBoolean(isStagedSessionReady); + dest.writeBoolean(isStagedSessionFailed); dest.writeInt(mStagedSessionErrorCode); dest.writeString(mStagedSessionErrorMessage); } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index be2b985145ce..675a8c08839d 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -490,9 +490,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { if (info.childSessionIds == null) { info.childSessionIds = EMPTY_CHILD_SESSION_ARRAY; } - info.isSessionApplied = mStagedSessionApplied; - info.isSessionReady = mStagedSessionReady; - info.isSessionFailed = mStagedSessionFailed; + info.isStagedSessionApplied = mStagedSessionApplied; + info.isStagedSessionReady = mStagedSessionReady; + info.isStagedSessionFailed = mStagedSessionFailed; info.setStagedSessionErrorCode(mStagedSessionErrorCode, mStagedSessionErrorMessage); } return info; diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 52169676dab1..114810d9127b 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -300,9 +300,9 @@ class PackageManagerShellCommand extends ShellCommand { pw.println("appPackageName = " + session.getAppPackageName() + "; sessionId = " + session.getSessionId() + "; isStaged = " + session.isStaged() - + "; isSessionReady = " + session.isSessionReady() - + "; isSessionApplied = " + session.isSessionApplied() - + "; isSessionFailed = " + session.isSessionFailed() + ";"); + + "; isStagedSessionReady = " + session.isStagedSessionReady() + + "; isStagedSessionApplied = " + session.isStagedSessionApplied() + + "; isStagedSessionFailed = " + session.isStagedSessionFailed() + ";"); } } catch (RemoteException e) { pw.println("Failure [" diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 11839a52d939..d2c0ee3f5196 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -528,7 +528,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { PackageInstaller.SessionInfo session = installer.getSessionInfo( data.stagedSessionId); if (session != null) { - if (session.isSessionApplied()) { + if (session.isStagedSessionApplied()) { synchronized (mLock) { data.isAvailable = true; } @@ -538,7 +538,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { Log.e(TAG, "Unable to save rollback info for : " + data.rollbackId, ioe); } - } else if (session.isSessionFailed()) { + } else if (session.isStagedSessionFailed()) { // TODO: Do we need to remove this from // mAvailableRollbacks, or is it okay to leave as // unavailable until the next reboot when it will go @@ -1195,13 +1195,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } if (pi.isStaged()) { - if (!pi.isSessionFailed()) { + if (!pi.isStagedSessionFailed()) { // TODO: The session really isn't "enabled" at this point, since more work might // be required post reboot. // TODO: We need to make this case consistent with the call from onFinished. // Ideally, we'd call completeEnableRollback excatly once per multi-package session // with the parentSessionId only. - completeEnableRollback(pi.sessionId, pi.isSessionReady()); + completeEnableRollback(pi.sessionId, pi.isStagedSessionReady()); } else { // TODO: Clean up the saved rollback when the session fails. This may need to be // unified with the case where things fail post reboot. diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java index 3a2b69f8a6e1..d24f21781b39 100644 --- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java @@ -218,10 +218,10 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve && (sessionId != PackageInstaller.SessionInfo.INVALID_ID)) { PackageInstaller.SessionInfo sessionInfo = packageInstaller.getSessionInfo(sessionId); - if (sessionInfo.isSessionReady()) { + if (sessionInfo.isStagedSessionReady()) { mContext.unregisterReceiver(listener); mContext.getSystemService(PowerManager.class).reboot("Rollback staged install"); - } else if (sessionInfo.isSessionFailed()) { + } else if (sessionInfo.isStagedSessionFailed()) { mContext.unregisterReceiver(listener); } } diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java index 097d33d729f3..def5b8ead283 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java @@ -345,7 +345,7 @@ class RollbackTestUtils { PackageInstaller.SessionInfo info = intent.getParcelableExtra(PackageInstaller.EXTRA_SESSION); if (info != null && info.getSessionId() == sessionId) { - if (info.isSessionReady() || info.isSessionFailed()) { + if (info.isStagedSessionReady() || info.isStagedSessionFailed()) { try { sessionStatus.put(info); } catch (InterruptedException e) { @@ -365,13 +365,13 @@ class RollbackTestUtils { PackageInstaller.SessionInfo info = installer.getSessionInfo(sessionId); try { - if (info.isSessionReady() || info.isSessionFailed()) { + if (info.isStagedSessionReady() || info.isStagedSessionFailed()) { sessionStatus.put(info); } info = sessionStatus.take(); context.unregisterReceiver(sessionUpdatedReceiver); - if (info.isSessionFailed()) { + if (info.isStagedSessionFailed()) { throw new AssertionError(info.getStagedSessionErrorMessage()); } } catch (InterruptedException e) { |