diff options
| -rw-r--r-- | api/current.txt | 2 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageInstaller.java | 42 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageInstallerSession.java | 1 |
3 files changed, 45 insertions, 0 deletions
diff --git a/api/current.txt b/api/current.txt index 8192762c4d63..5664d4f65cc4 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11384,6 +11384,7 @@ package android.content.pm { public class PackageInstaller { method public void abandonSession(int); method public int createSession(@NonNull android.content.pm.PackageInstaller.SessionParams) throws java.io.IOException; + method @Nullable public android.content.pm.PackageInstaller.SessionInfo getActiveStagedSession(); method @NonNull public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllSessions(); method @NonNull public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getMySessions(); method @Nullable public android.content.pm.PackageInstaller.SessionInfo getSessionInfo(int); @@ -11468,6 +11469,7 @@ package android.content.pm { method @NonNull public String getStagedSessionErrorMessage(); method @NonNull public android.os.UserHandle getUser(); method public boolean isActive(); + method public boolean isCommitted(); method public boolean isMultiPackage(); method public boolean isSealed(); method public boolean isStaged(); diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 3edd17a4bb1f..1e6cea39b44d 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -497,6 +497,36 @@ public class PackageInstaller { } /** + * Returns an active staged session, or {@code null} if there is none. + * + * <p>Staged session is active iff: + * <ul> + * <li>It is committed. + * <li>It is not applied. + * <li>It is not failed. + * </ul> + * + * <p>In case of a multi-apk session, parent session will be returned. + */ + public @Nullable SessionInfo getActiveStagedSession() { + final List<SessionInfo> stagedSessions = getStagedSessions(); + for (SessionInfo s : stagedSessions) { + if (s.isStagedSessionApplied() || s.isStagedSessionFailed()) { + // Finalized session. + continue; + } + if (s.getParentSessionId() != SessionInfo.INVALID_ID) { + // Child session. + continue; + } + if (s.isCommitted()) { + return s; + } + } + return null; + } + + /** * Uninstall the given package, removing it completely from the device. This * method is available to: * <ul> @@ -1770,6 +1800,9 @@ public class PackageInstaller { private String mStagedSessionErrorMessage; /** {@hide} */ + public boolean isCommitted; + + /** {@hide} */ @UnsupportedAppUsage public SessionInfo() { } @@ -1809,6 +1842,7 @@ public class PackageInstaller { isStagedSessionFailed = source.readBoolean(); mStagedSessionErrorCode = source.readInt(); mStagedSessionErrorMessage = source.readString(); + isCommitted = source.readBoolean(); } /** @@ -2181,6 +2215,13 @@ public class PackageInstaller { mStagedSessionErrorMessage = errorMessage; } + /** + * Whenever this session was committed. + */ + public boolean isCommitted() { + return isCommitted; + } + @Override public int describeContents() { return 0; @@ -2218,6 +2259,7 @@ public class PackageInstaller { dest.writeBoolean(isStagedSessionFailed); dest.writeInt(mStagedSessionErrorCode); dest.writeString(mStagedSessionErrorMessage); + dest.writeBoolean(isCommitted); } public static final Parcelable.Creator<SessionInfo> diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 66b530f19ed8..f1d4524cccac 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -476,6 +476,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { mResolvedBaseFile.getAbsolutePath() : null; info.progress = mProgress; info.sealed = mSealed; + info.isCommitted = mCommitted; info.active = mActiveCount.get() > 0; info.mode = params.mode; |