Loading api/current.txt +4 −0 Original line number Original line Diff line number Diff line Loading @@ -11235,6 +11235,7 @@ package android.content.pm { method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllSessions(); method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllSessions(); method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getMySessions(); method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getMySessions(); method public android.content.pm.PackageInstaller.SessionInfo getSessionInfo(int); method public android.content.pm.PackageInstaller.SessionInfo getSessionInfo(int); method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getStagedSessions(); method public android.content.pm.PackageInstaller.Session openSession(int) throws java.io.IOException; method public android.content.pm.PackageInstaller.Session openSession(int) throws java.io.IOException; method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback); method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback); method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback, android.os.Handler); method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback, android.os.Handler); Loading Loading @@ -11273,6 +11274,7 @@ package android.content.pm { method public java.lang.String[] getNames() throws java.io.IOException; method public java.lang.String[] getNames() throws java.io.IOException; method public int getParentSessionId(); method public int getParentSessionId(); method public boolean isMultiPackage(); method public boolean isMultiPackage(); method public boolean isStaged(); method public java.io.InputStream openRead(java.lang.String) throws java.io.IOException; method public java.io.InputStream openRead(java.lang.String) throws java.io.IOException; method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException; method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException; method public void removeChildSessionId(int); method public void removeChildSessionId(int); Loading Loading @@ -11311,6 +11313,7 @@ package android.content.pm { method public boolean isActive(); method public boolean isActive(); method public boolean isMultiPackage(); method public boolean isMultiPackage(); method public boolean isSealed(); method public boolean isSealed(); method public boolean isStaged(); method public void writeToParcel(android.os.Parcel, int); 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 android.os.Parcelable.Creator<android.content.pm.PackageInstaller.SessionInfo> CREATOR; field public static final int INVALID_ID = -1; // 0xffffffff field public static final int INVALID_ID = -1; // 0xffffffff Loading @@ -11329,6 +11332,7 @@ package android.content.pm { method public void setOriginatingUri(android.net.Uri); method public void setOriginatingUri(android.net.Uri); method public void setReferrerUri(android.net.Uri); method public void setReferrerUri(android.net.Uri); method public void setSize(long); method public void setSize(long); method public void setStaged(); method public void writeToParcel(android.os.Parcel, int); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.content.pm.PackageInstaller.SessionParams> CREATOR; field public static final android.os.Parcelable.Creator<android.content.pm.PackageInstaller.SessionParams> CREATOR; field public static final int MODE_FULL_INSTALL = 1; // 0x1 field public static final int MODE_FULL_INSTALL = 1; // 0x1 core/java/android/content/pm/IPackageInstaller.aidl +2 −0 Original line number Original line Diff line number Diff line Loading @@ -42,6 +42,8 @@ interface IPackageInstaller { ParceledListSlice getAllSessions(int userId); ParceledListSlice getAllSessions(int userId); ParceledListSlice getMySessions(String installerPackageName, int userId); ParceledListSlice getMySessions(String installerPackageName, int userId); ParceledListSlice getStagedSessions(); void registerCallback(IPackageInstallerCallback callback, int userId); void registerCallback(IPackageInstallerCallback callback, int userId); void unregisterCallback(IPackageInstallerCallback callback); void unregisterCallback(IPackageInstallerCallback callback); Loading core/java/android/content/pm/IPackageInstallerSession.aidl +3 −0 Original line number Original line Diff line number Diff line Loading @@ -38,9 +38,12 @@ interface IPackageInstallerSession { void commit(in IntentSender statusReceiver, boolean forTransferred); void commit(in IntentSender statusReceiver, boolean forTransferred); void transfer(in String packageName); void transfer(in String packageName); void abandon(); void abandon(); boolean isMultiPackage(); boolean isMultiPackage(); int[] getChildSessionIds(); int[] getChildSessionIds(); void addChildSessionId(in int sessionId); void addChildSessionId(in int sessionId); void removeChildSessionId(in int sessionId); void removeChildSessionId(in int sessionId); int getParentSessionId(); int getParentSessionId(); boolean isStaged(); } } core/java/android/content/pm/PackageInstaller.java +55 −0 Original line number Original line Diff line number Diff line Loading @@ -462,6 +462,18 @@ public class PackageInstaller { } } } } /** * Return list of all staged install sessions. */ public @NonNull List<SessionInfo> getStagedSessions() { try { // TODO: limit this to the mUserId? return mInstaller.getStagedSessions().getList(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** /** * Uninstall the given package, removing it completely from the device. This * Uninstall the given package, removing it completely from the device. This * method is available to: * method is available to: Loading Loading @@ -779,6 +791,11 @@ public class PackageInstaller { * individual session IDs can be added with {@link #addChildSessionId(int)} * individual session IDs can be added with {@link #addChildSessionId(int)} * and commit of the multi-package session will result in all child sessions * and commit of the multi-package session will result in all child sessions * being committed atomically. * being committed atomically. * <p> * If a package requires to be installed only at reboot, the session should * be marked as a staged session by calling {@link SessionParams#setStaged()} * with {@code true}. This can also apply to a multi-package session, in * which case all the packages in the session will be applied at reboot. */ */ public static class Session implements Closeable { public static class Session implements Closeable { /** {@hide} */ /** {@hide} */ Loading Loading @@ -1104,6 +1121,17 @@ public class PackageInstaller { } } } } /** * @return {@code true} if this session will be staged and applied at next reboot. */ public boolean isStaged() { try { return mSession.isStaged(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** /** * @return the session ID of the multi-package session that this belongs to or * @return the session ID of the multi-package session that this belongs to or * {@link SessionInfo#INVALID_ID} if it does not belong to a multi-package session. * {@link SessionInfo#INVALID_ID} if it does not belong to a multi-package session. Loading Loading @@ -1227,6 +1255,8 @@ public class PackageInstaller { public String installerPackageName; public String installerPackageName; /** {@hide} */ /** {@hide} */ public boolean isMultiPackage; public boolean isMultiPackage; /** {@hide} */ public boolean isStaged; /** /** * Construct parameters for a new package install session. * Construct parameters for a new package install session. Loading Loading @@ -1257,6 +1287,7 @@ public class PackageInstaller { grantedRuntimePermissions = source.readStringArray(); grantedRuntimePermissions = source.readStringArray(); installerPackageName = source.readString(); installerPackageName = source.readString(); isMultiPackage = source.readBoolean(); isMultiPackage = source.readBoolean(); isStaged = source.readBoolean(); } } /** /** Loading Loading @@ -1471,6 +1502,17 @@ public class PackageInstaller { this.isMultiPackage = true; this.isMultiPackage = true; } } /** * Set this session to be staged to be installed at reboot. * * Staged sessions are scheduled to be installed at next reboot. Staged sessions can also be * multi-package. In that case, if any of the children sessions fail to install at reboot, * all the other children sessions are aborted as well. */ public void setStaged() { this.isStaged = true; } /** {@hide} */ /** {@hide} */ public void dump(IndentingPrintWriter pw) { public void dump(IndentingPrintWriter pw) { pw.printPair("mode", mode); pw.printPair("mode", mode); Loading @@ -1488,6 +1530,7 @@ public class PackageInstaller { pw.printPair("grantedRuntimePermissions", grantedRuntimePermissions); pw.printPair("grantedRuntimePermissions", grantedRuntimePermissions); pw.printPair("installerPackageName", installerPackageName); pw.printPair("installerPackageName", installerPackageName); pw.printPair("isMultiPackage", isMultiPackage); pw.printPair("isMultiPackage", isMultiPackage); pw.printPair("isStaged", isStaged); pw.println(); pw.println(); } } Loading @@ -1514,6 +1557,7 @@ public class PackageInstaller { dest.writeStringArray(grantedRuntimePermissions); dest.writeStringArray(grantedRuntimePermissions); dest.writeString(installerPackageName); dest.writeString(installerPackageName); dest.writeBoolean(isMultiPackage); dest.writeBoolean(isMultiPackage); dest.writeBoolean(isStaged); } } public static final Parcelable.Creator<SessionParams> public static final Parcelable.Creator<SessionParams> Loading Loading @@ -1593,6 +1637,8 @@ public class PackageInstaller { /** {@hide} */ /** {@hide} */ public boolean isMultiPackage; public boolean isMultiPackage; /** {@hide} */ /** {@hide} */ public boolean isStaged; /** {@hide} */ public int parentSessionId = INVALID_ID; public int parentSessionId = INVALID_ID; /** {@hide} */ /** {@hide} */ public int[] childSessionIds = NO_SESSIONS; public int[] childSessionIds = NO_SESSIONS; Loading Loading @@ -1625,6 +1671,7 @@ public class PackageInstaller { grantedRuntimePermissions = source.readStringArray(); grantedRuntimePermissions = source.readStringArray(); installFlags = source.readInt(); installFlags = source.readInt(); isMultiPackage = source.readBoolean(); isMultiPackage = source.readBoolean(); isStaged = source.readBoolean(); parentSessionId = source.readInt(); parentSessionId = source.readInt(); childSessionIds = source.createIntArray(); childSessionIds = source.createIntArray(); if (childSessionIds == null) { if (childSessionIds == null) { Loading Loading @@ -1891,6 +1938,13 @@ public class PackageInstaller { return isMultiPackage; return isMultiPackage; } } /** * Returns true if this session is a staged session which will be applied at next reboot. */ public boolean isStaged() { return isStaged; } /** /** * Returns the parent multi-package session ID if this session belongs to one, * Returns the parent multi-package session ID if this session belongs to one, * {@link #INVALID_ID} otherwise. * {@link #INVALID_ID} otherwise. Loading Loading @@ -1935,6 +1989,7 @@ public class PackageInstaller { dest.writeStringArray(grantedRuntimePermissions); dest.writeStringArray(grantedRuntimePermissions); dest.writeInt(installFlags); dest.writeInt(installFlags); dest.writeBoolean(isMultiPackage); dest.writeBoolean(isMultiPackage); dest.writeBoolean(isStaged); dest.writeInt(parentSessionId); dest.writeInt(parentSessionId); dest.writeIntArray(childSessionIds); dest.writeIntArray(childSessionIds); } } Loading services/core/java/com/android/server/pm/PackageInstallerService.java +34 −0 Original line number Original line Diff line number Diff line Loading @@ -164,6 +164,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements @GuardedBy("mSessions") @GuardedBy("mSessions") private final SparseArray<PackageInstallerSession> mSessions = new SparseArray<>(); private final SparseArray<PackageInstallerSession> mSessions = new SparseArray<>(); // STOPSHIP: This is a temporary mock implementation of staged sessions. This variable // shouldn't be needed at all. @GuardedBy("mStagedSessions") private final SparseArray<PackageInstallerSession> mStagedSessions = new SparseArray<>(); /** Historical sessions kept around for debugging purposes */ /** Historical sessions kept around for debugging purposes */ @GuardedBy("mSessions") @GuardedBy("mSessions") private final List<String> mHistoricalSessions = new ArrayList<>(); private final List<String> mHistoricalSessions = new ArrayList<>(); Loading Loading @@ -536,6 +541,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements synchronized (mSessions) { synchronized (mSessions) { mSessions.put(sessionId, session); mSessions.put(sessionId, session); } } if (params.isStaged) { synchronized (mStagedSessions) { mStagedSessions.put(sessionId, session); } } mCallbacks.notifySessionCreated(session.sessionId, session.userId); mCallbacks.notifySessionCreated(session.sessionId, session.userId); writeSessionsAsync(); writeSessionsAsync(); Loading Loading @@ -665,6 +675,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } } } @Override public ParceledListSlice<SessionInfo> getStagedSessions() { final List<SessionInfo> result = new ArrayList<>(); synchronized (mStagedSessions) { for (int i = 0; i < mStagedSessions.size(); i++) { final PackageInstallerSession session = mStagedSessions.valueAt(i); result.add(session.generateInfo(false)); } } return new ParceledListSlice<>(result); } @Override @Override public ParceledListSlice<SessionInfo> getAllSessions(int userId) { public ParceledListSlice<SessionInfo> getAllSessions(int userId) { mPermissionManager.enforceCrossUserPermission( mPermissionManager.enforceCrossUserPermission( Loading Loading @@ -1110,6 +1132,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mInstallHandler.post(new Runnable() { mInstallHandler.post(new Runnable() { @Override @Override public void run() { public void run() { // TODO: remove this mock implementation. if (session.isStaged()) { // If the session is aborted, don't keep it in memory. Only store // sessions successfully staged. if (!success) { synchronized (mStagedSessions) { mStagedSessions.remove(session.sessionId); } } else { return; } } synchronized (mSessions) { synchronized (mSessions) { mSessions.remove(session.sessionId); mSessions.remove(session.sessionId); addHistoricalSessionLocked(session); addHistoricalSessionLocked(session); Loading Loading
api/current.txt +4 −0 Original line number Original line Diff line number Diff line Loading @@ -11235,6 +11235,7 @@ package android.content.pm { method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllSessions(); method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllSessions(); method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getMySessions(); method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getMySessions(); method public android.content.pm.PackageInstaller.SessionInfo getSessionInfo(int); method public android.content.pm.PackageInstaller.SessionInfo getSessionInfo(int); method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getStagedSessions(); method public android.content.pm.PackageInstaller.Session openSession(int) throws java.io.IOException; method public android.content.pm.PackageInstaller.Session openSession(int) throws java.io.IOException; method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback); method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback); method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback, android.os.Handler); method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback, android.os.Handler); Loading Loading @@ -11273,6 +11274,7 @@ package android.content.pm { method public java.lang.String[] getNames() throws java.io.IOException; method public java.lang.String[] getNames() throws java.io.IOException; method public int getParentSessionId(); method public int getParentSessionId(); method public boolean isMultiPackage(); method public boolean isMultiPackage(); method public boolean isStaged(); method public java.io.InputStream openRead(java.lang.String) throws java.io.IOException; method public java.io.InputStream openRead(java.lang.String) throws java.io.IOException; method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException; method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException; method public void removeChildSessionId(int); method public void removeChildSessionId(int); Loading Loading @@ -11311,6 +11313,7 @@ package android.content.pm { method public boolean isActive(); method public boolean isActive(); method public boolean isMultiPackage(); method public boolean isMultiPackage(); method public boolean isSealed(); method public boolean isSealed(); method public boolean isStaged(); method public void writeToParcel(android.os.Parcel, int); 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 android.os.Parcelable.Creator<android.content.pm.PackageInstaller.SessionInfo> CREATOR; field public static final int INVALID_ID = -1; // 0xffffffff field public static final int INVALID_ID = -1; // 0xffffffff Loading @@ -11329,6 +11332,7 @@ package android.content.pm { method public void setOriginatingUri(android.net.Uri); method public void setOriginatingUri(android.net.Uri); method public void setReferrerUri(android.net.Uri); method public void setReferrerUri(android.net.Uri); method public void setSize(long); method public void setSize(long); method public void setStaged(); method public void writeToParcel(android.os.Parcel, int); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.content.pm.PackageInstaller.SessionParams> CREATOR; field public static final android.os.Parcelable.Creator<android.content.pm.PackageInstaller.SessionParams> CREATOR; field public static final int MODE_FULL_INSTALL = 1; // 0x1 field public static final int MODE_FULL_INSTALL = 1; // 0x1
core/java/android/content/pm/IPackageInstaller.aidl +2 −0 Original line number Original line Diff line number Diff line Loading @@ -42,6 +42,8 @@ interface IPackageInstaller { ParceledListSlice getAllSessions(int userId); ParceledListSlice getAllSessions(int userId); ParceledListSlice getMySessions(String installerPackageName, int userId); ParceledListSlice getMySessions(String installerPackageName, int userId); ParceledListSlice getStagedSessions(); void registerCallback(IPackageInstallerCallback callback, int userId); void registerCallback(IPackageInstallerCallback callback, int userId); void unregisterCallback(IPackageInstallerCallback callback); void unregisterCallback(IPackageInstallerCallback callback); Loading
core/java/android/content/pm/IPackageInstallerSession.aidl +3 −0 Original line number Original line Diff line number Diff line Loading @@ -38,9 +38,12 @@ interface IPackageInstallerSession { void commit(in IntentSender statusReceiver, boolean forTransferred); void commit(in IntentSender statusReceiver, boolean forTransferred); void transfer(in String packageName); void transfer(in String packageName); void abandon(); void abandon(); boolean isMultiPackage(); boolean isMultiPackage(); int[] getChildSessionIds(); int[] getChildSessionIds(); void addChildSessionId(in int sessionId); void addChildSessionId(in int sessionId); void removeChildSessionId(in int sessionId); void removeChildSessionId(in int sessionId); int getParentSessionId(); int getParentSessionId(); boolean isStaged(); } }
core/java/android/content/pm/PackageInstaller.java +55 −0 Original line number Original line Diff line number Diff line Loading @@ -462,6 +462,18 @@ public class PackageInstaller { } } } } /** * Return list of all staged install sessions. */ public @NonNull List<SessionInfo> getStagedSessions() { try { // TODO: limit this to the mUserId? return mInstaller.getStagedSessions().getList(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** /** * Uninstall the given package, removing it completely from the device. This * Uninstall the given package, removing it completely from the device. This * method is available to: * method is available to: Loading Loading @@ -779,6 +791,11 @@ public class PackageInstaller { * individual session IDs can be added with {@link #addChildSessionId(int)} * individual session IDs can be added with {@link #addChildSessionId(int)} * and commit of the multi-package session will result in all child sessions * and commit of the multi-package session will result in all child sessions * being committed atomically. * being committed atomically. * <p> * If a package requires to be installed only at reboot, the session should * be marked as a staged session by calling {@link SessionParams#setStaged()} * with {@code true}. This can also apply to a multi-package session, in * which case all the packages in the session will be applied at reboot. */ */ public static class Session implements Closeable { public static class Session implements Closeable { /** {@hide} */ /** {@hide} */ Loading Loading @@ -1104,6 +1121,17 @@ public class PackageInstaller { } } } } /** * @return {@code true} if this session will be staged and applied at next reboot. */ public boolean isStaged() { try { return mSession.isStaged(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** /** * @return the session ID of the multi-package session that this belongs to or * @return the session ID of the multi-package session that this belongs to or * {@link SessionInfo#INVALID_ID} if it does not belong to a multi-package session. * {@link SessionInfo#INVALID_ID} if it does not belong to a multi-package session. Loading Loading @@ -1227,6 +1255,8 @@ public class PackageInstaller { public String installerPackageName; public String installerPackageName; /** {@hide} */ /** {@hide} */ public boolean isMultiPackage; public boolean isMultiPackage; /** {@hide} */ public boolean isStaged; /** /** * Construct parameters for a new package install session. * Construct parameters for a new package install session. Loading Loading @@ -1257,6 +1287,7 @@ public class PackageInstaller { grantedRuntimePermissions = source.readStringArray(); grantedRuntimePermissions = source.readStringArray(); installerPackageName = source.readString(); installerPackageName = source.readString(); isMultiPackage = source.readBoolean(); isMultiPackage = source.readBoolean(); isStaged = source.readBoolean(); } } /** /** Loading Loading @@ -1471,6 +1502,17 @@ public class PackageInstaller { this.isMultiPackage = true; this.isMultiPackage = true; } } /** * Set this session to be staged to be installed at reboot. * * Staged sessions are scheduled to be installed at next reboot. Staged sessions can also be * multi-package. In that case, if any of the children sessions fail to install at reboot, * all the other children sessions are aborted as well. */ public void setStaged() { this.isStaged = true; } /** {@hide} */ /** {@hide} */ public void dump(IndentingPrintWriter pw) { public void dump(IndentingPrintWriter pw) { pw.printPair("mode", mode); pw.printPair("mode", mode); Loading @@ -1488,6 +1530,7 @@ public class PackageInstaller { pw.printPair("grantedRuntimePermissions", grantedRuntimePermissions); pw.printPair("grantedRuntimePermissions", grantedRuntimePermissions); pw.printPair("installerPackageName", installerPackageName); pw.printPair("installerPackageName", installerPackageName); pw.printPair("isMultiPackage", isMultiPackage); pw.printPair("isMultiPackage", isMultiPackage); pw.printPair("isStaged", isStaged); pw.println(); pw.println(); } } Loading @@ -1514,6 +1557,7 @@ public class PackageInstaller { dest.writeStringArray(grantedRuntimePermissions); dest.writeStringArray(grantedRuntimePermissions); dest.writeString(installerPackageName); dest.writeString(installerPackageName); dest.writeBoolean(isMultiPackage); dest.writeBoolean(isMultiPackage); dest.writeBoolean(isStaged); } } public static final Parcelable.Creator<SessionParams> public static final Parcelable.Creator<SessionParams> Loading Loading @@ -1593,6 +1637,8 @@ public class PackageInstaller { /** {@hide} */ /** {@hide} */ public boolean isMultiPackage; public boolean isMultiPackage; /** {@hide} */ /** {@hide} */ public boolean isStaged; /** {@hide} */ public int parentSessionId = INVALID_ID; public int parentSessionId = INVALID_ID; /** {@hide} */ /** {@hide} */ public int[] childSessionIds = NO_SESSIONS; public int[] childSessionIds = NO_SESSIONS; Loading Loading @@ -1625,6 +1671,7 @@ public class PackageInstaller { grantedRuntimePermissions = source.readStringArray(); grantedRuntimePermissions = source.readStringArray(); installFlags = source.readInt(); installFlags = source.readInt(); isMultiPackage = source.readBoolean(); isMultiPackage = source.readBoolean(); isStaged = source.readBoolean(); parentSessionId = source.readInt(); parentSessionId = source.readInt(); childSessionIds = source.createIntArray(); childSessionIds = source.createIntArray(); if (childSessionIds == null) { if (childSessionIds == null) { Loading Loading @@ -1891,6 +1938,13 @@ public class PackageInstaller { return isMultiPackage; return isMultiPackage; } } /** * Returns true if this session is a staged session which will be applied at next reboot. */ public boolean isStaged() { return isStaged; } /** /** * Returns the parent multi-package session ID if this session belongs to one, * Returns the parent multi-package session ID if this session belongs to one, * {@link #INVALID_ID} otherwise. * {@link #INVALID_ID} otherwise. Loading Loading @@ -1935,6 +1989,7 @@ public class PackageInstaller { dest.writeStringArray(grantedRuntimePermissions); dest.writeStringArray(grantedRuntimePermissions); dest.writeInt(installFlags); dest.writeInt(installFlags); dest.writeBoolean(isMultiPackage); dest.writeBoolean(isMultiPackage); dest.writeBoolean(isStaged); dest.writeInt(parentSessionId); dest.writeInt(parentSessionId); dest.writeIntArray(childSessionIds); dest.writeIntArray(childSessionIds); } } Loading
services/core/java/com/android/server/pm/PackageInstallerService.java +34 −0 Original line number Original line Diff line number Diff line Loading @@ -164,6 +164,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements @GuardedBy("mSessions") @GuardedBy("mSessions") private final SparseArray<PackageInstallerSession> mSessions = new SparseArray<>(); private final SparseArray<PackageInstallerSession> mSessions = new SparseArray<>(); // STOPSHIP: This is a temporary mock implementation of staged sessions. This variable // shouldn't be needed at all. @GuardedBy("mStagedSessions") private final SparseArray<PackageInstallerSession> mStagedSessions = new SparseArray<>(); /** Historical sessions kept around for debugging purposes */ /** Historical sessions kept around for debugging purposes */ @GuardedBy("mSessions") @GuardedBy("mSessions") private final List<String> mHistoricalSessions = new ArrayList<>(); private final List<String> mHistoricalSessions = new ArrayList<>(); Loading Loading @@ -536,6 +541,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements synchronized (mSessions) { synchronized (mSessions) { mSessions.put(sessionId, session); mSessions.put(sessionId, session); } } if (params.isStaged) { synchronized (mStagedSessions) { mStagedSessions.put(sessionId, session); } } mCallbacks.notifySessionCreated(session.sessionId, session.userId); mCallbacks.notifySessionCreated(session.sessionId, session.userId); writeSessionsAsync(); writeSessionsAsync(); Loading Loading @@ -665,6 +675,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } } } @Override public ParceledListSlice<SessionInfo> getStagedSessions() { final List<SessionInfo> result = new ArrayList<>(); synchronized (mStagedSessions) { for (int i = 0; i < mStagedSessions.size(); i++) { final PackageInstallerSession session = mStagedSessions.valueAt(i); result.add(session.generateInfo(false)); } } return new ParceledListSlice<>(result); } @Override @Override public ParceledListSlice<SessionInfo> getAllSessions(int userId) { public ParceledListSlice<SessionInfo> getAllSessions(int userId) { mPermissionManager.enforceCrossUserPermission( mPermissionManager.enforceCrossUserPermission( Loading Loading @@ -1110,6 +1132,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mInstallHandler.post(new Runnable() { mInstallHandler.post(new Runnable() { @Override @Override public void run() { public void run() { // TODO: remove this mock implementation. if (session.isStaged()) { // If the session is aborted, don't keep it in memory. Only store // sessions successfully staged. if (!success) { synchronized (mStagedSessions) { mStagedSessions.remove(session.sessionId); } } else { return; } } synchronized (mSessions) { synchronized (mSessions) { mSessions.remove(session.sessionId); mSessions.remove(session.sessionId); addHistoricalSessionLocked(session); addHistoricalSessionLocked(session); Loading