Merge "Add an api to get active staged session"
diff --git a/api/current.txt b/api/current.txt
index 8192762..5664d4f 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11384,6 +11384,7 @@
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 @@
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 3edd17a..1e6cea3 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -497,6 +497,36 @@
}
/**
+ * 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 @@
private String mStagedSessionErrorMessage;
/** {@hide} */
+ public boolean isCommitted;
+
+ /** {@hide} */
@UnsupportedAppUsage
public SessionInfo() {
}
@@ -1809,6 +1842,7 @@
isStagedSessionFailed = source.readBoolean();
mStagedSessionErrorCode = source.readInt();
mStagedSessionErrorMessage = source.readString();
+ isCommitted = source.readBoolean();
}
/**
@@ -2181,6 +2215,13 @@
mStagedSessionErrorMessage = errorMessage;
}
+ /**
+ * Whenever this session was committed.
+ */
+ public boolean isCommitted() {
+ return isCommitted;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -2218,6 +2259,7 @@
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 66b530f..f1d4524 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 @@
mResolvedBaseFile.getAbsolutePath() : null;
info.progress = mProgress;
info.sealed = mSealed;
+ info.isCommitted = mCommitted;
info.active = mActiveCount.get() > 0;
info.mode = params.mode;