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

Commit ec06c253 authored by Dario Freni's avatar Dario Freni Committed by Android (Google) Code Review
Browse files

Merge "Add Mock APIs for staged installs."

parents ab11e004 aac4ba4b
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -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);
@@ -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);
@@ -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
@@ -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
+2 −0
Original line number Original line Diff line number Diff line
@@ -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);


+3 −0
Original line number Original line Diff line number Diff line
@@ -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();
}
}
+55 −0
Original line number Original line Diff line number Diff line
@@ -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:
@@ -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} */
@@ -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.
@@ -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.
@@ -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();
        }
        }


        /**
        /**
@@ -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);
@@ -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();
        }
        }


@@ -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>
@@ -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;
@@ -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) {
@@ -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.
@@ -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);
        }
        }
+34 −0
Original line number Original line Diff line number Diff line
@@ -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<>();
@@ -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();
@@ -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(
@@ -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