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

Commit 9cbc89c2 authored by Jackal Guo's avatar Jackal Guo Committed by Android (Google) Code Review
Browse files

Merge changes from topic "pre-commit-install"

* changes:
  Refactoring PackageInstallerSession (4/n)
  Handle pre-commit install session in PackageInstaller (3/n)
  Pre-commit install approval (2/n)
parents e9aca6c2 0016ca04
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -11596,6 +11596,7 @@ package android.content.pm {
    field public static final String ACTION_SESSION_UPDATED = "android.content.pm.action.SESSION_UPDATED";
    field public static final String ACTION_SESSION_UPDATED = "android.content.pm.action.SESSION_UPDATED";
    field public static final String EXTRA_OTHER_PACKAGE_NAME = "android.content.pm.extra.OTHER_PACKAGE_NAME";
    field public static final String EXTRA_OTHER_PACKAGE_NAME = "android.content.pm.extra.OTHER_PACKAGE_NAME";
    field public static final String EXTRA_PACKAGE_NAME = "android.content.pm.extra.PACKAGE_NAME";
    field public static final String EXTRA_PACKAGE_NAME = "android.content.pm.extra.PACKAGE_NAME";
    field public static final String EXTRA_PRE_APPROVAL = "android.content.pm.extra.PRE_APPROVAL";
    field public static final String EXTRA_SESSION = "android.content.pm.extra.SESSION";
    field public static final String EXTRA_SESSION = "android.content.pm.extra.SESSION";
    field public static final String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID";
    field public static final String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID";
    field public static final String EXTRA_STATUS = "android.content.pm.extra.STATUS";
    field public static final String EXTRA_STATUS = "android.content.pm.extra.STATUS";
@@ -11652,6 +11653,7 @@ package android.content.pm {
    method public void removeChildSessionId(int);
    method public void removeChildSessionId(int);
    method public void removeSplit(@NonNull String) throws java.io.IOException;
    method public void removeSplit(@NonNull String) throws java.io.IOException;
    method public void requestChecksums(@NonNull String, int, @NonNull java.util.List<java.security.cert.Certificate>, @NonNull java.util.concurrent.Executor, @NonNull android.content.pm.PackageManager.OnChecksumsReadyListener) throws java.security.cert.CertificateEncodingException, java.io.FileNotFoundException;
    method public void requestChecksums(@NonNull String, int, @NonNull java.util.List<java.security.cert.Certificate>, @NonNull java.util.concurrent.Executor, @NonNull android.content.pm.PackageManager.OnChecksumsReadyListener) throws java.security.cert.CertificateEncodingException, java.io.FileNotFoundException;
    method public void requestUserPreapproval(@NonNull android.content.pm.PackageInstaller.PreapprovalDetails, @NonNull android.content.IntentSender);
    method @Deprecated public void setChecksums(@NonNull String, @NonNull java.util.List<android.content.pm.Checksum>, @Nullable byte[]) throws java.io.IOException;
    method @Deprecated public void setChecksums(@NonNull String, @NonNull java.util.List<android.content.pm.Checksum>, @Nullable byte[]) throws java.io.IOException;
    method public void setStagingProgress(float);
    method public void setStagingProgress(float);
    method public void transfer(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public void transfer(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
+3 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.pm.Checksum;
import android.content.pm.DataLoaderParamsParcel;
import android.content.pm.DataLoaderParamsParcel;
import android.content.pm.IOnChecksumsReadyListener;
import android.content.pm.IOnChecksumsReadyListener;
import android.content.pm.IPackageInstallObserver2;
import android.content.pm.IPackageInstallObserver2;
import android.content.pm.PackageInstaller;
import android.content.IntentSender;
import android.content.IntentSender;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFileDescriptor;


@@ -58,4 +59,6 @@ interface IPackageInstallerSession {


    boolean isStaged();
    boolean isStaged();
    int getInstallFlags();
    int getInstallFlags();

    void requestUserPreapproval(in PackageInstaller.PreapprovalDetails details, in IntentSender statusReceiver);
}
}
+56 −1
Original line number Original line Diff line number Diff line
@@ -170,6 +170,10 @@ public class PackageInstaller {
    /** {@hide} */
    /** {@hide} */
    public static final String ACTION_CONFIRM_INSTALL = "android.content.pm.action.CONFIRM_INSTALL";
    public static final String ACTION_CONFIRM_INSTALL = "android.content.pm.action.CONFIRM_INSTALL";


    /** @hide */
    public static final String ACTION_CONFIRM_PRE_APPROVAL =
            "android.content.pm.action.CONFIRM_PRE_APPROVAL";

    /**
    /**
     * An integer session ID that an operation is working with.
     * An integer session ID that an operation is working with.
     *
     *
@@ -206,6 +210,17 @@ public class PackageInstaller {
     */
     */
    public static final String EXTRA_STATUS = "android.content.pm.extra.STATUS";
    public static final String EXTRA_STATUS = "android.content.pm.extra.STATUS";


    /**
     * Indicate if the status is for a pre-approval request.
     *
     * If callers use the same {@link IntentSender} for both
     * {@link Session#requestUserPreapproval(PreapprovalDetails, IntentSender)} and
     * {@link Session#commit(IntentSender)}, they can use this to differentiate between them.
     *
     * @see Intent#getBooleanExtra(String, boolean)
     */
    public static final String EXTRA_PRE_APPROVAL = "android.content.pm.extra.PRE_APPROVAL";

    /**
    /**
     * Detailed string representation of the status, including raw details that
     * Detailed string representation of the status, including raw details that
     * are useful for debugging.
     * are useful for debugging.
@@ -1667,6 +1682,41 @@ public class PackageInstaller {
                e.rethrowFromSystemServer();
                e.rethrowFromSystemServer();
            }
            }
        }
        }

        /**
         * Attempt to request the approval before committing this session.
         *
         * For installers that have been granted the
         * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES REQUEST_INSTALL_PACKAGES}
         * permission, they can request the approval from users before
         * {@link Session#commit(IntentSender)} is called. This may require user intervention as
         * well. The result of the request will be reported through the given callback.
         *
         * @param details the adequate context to this session for requesting the approval from
         *                users prior to commit.
         * @param statusReceiver called when the state of the session changes.
         *                       Intents sent to this receiver contain
         *                       {@link #EXTRA_STATUS}. Refer to the individual
         *                       status codes on how to handle them.
         *
         * @throws IllegalArgumentException when {@link PreapprovalDetails} is {@code null}.
         * @throws IllegalArgumentException if {@link IntentSender} is {@code null}.
         * @throws IllegalStateException if called on a multi-package session (no matter
         *                               the parent session or any of the children sessions).
         * @throws IllegalStateException if called again after this method has been called on
         *                               this session.
         * @throws SecurityException when the caller does not own this session.
         */
        public void requestUserPreapproval(@NonNull PreapprovalDetails details,
                @NonNull IntentSender statusReceiver) {
            Preconditions.checkArgument(details != null, "preapprovalDetails cannot be null.");
            Preconditions.checkArgument(statusReceiver != null, "statusReceiver cannot be null.");
            try {
                mSession.requestUserPreapproval(details, statusReceiver);
            } catch (RemoteException e) {
                e.rethrowFromSystemServer();
            }
        }
    }
    }


    /**
    /**
@@ -2631,6 +2681,9 @@ public class PackageInstaller {
        /** {@hide} */
        /** {@hide} */
        public int installerUid;
        public int installerUid;


        /** @hide */
        public boolean isPreapprovalRequested;

        /** {@hide} */
        /** {@hide} */
        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
        public SessionInfo() {
        public SessionInfo() {
@@ -2678,6 +2731,7 @@ public class PackageInstaller {
            mSessionErrorCode = source.readInt();
            mSessionErrorCode = source.readInt();
            mSessionErrorMessage = source.readString();
            mSessionErrorMessage = source.readString();
            isCommitted = source.readBoolean();
            isCommitted = source.readBoolean();
            isPreapprovalRequested = source.readBoolean();
            rollbackDataPolicy = source.readInt();
            rollbackDataPolicy = source.readInt();
            createdMillis = source.readLong();
            createdMillis = source.readLong();
            requireUserAction = source.readInt();
            requireUserAction = source.readInt();
@@ -3099,7 +3153,7 @@ public class PackageInstaller {
        }
        }


        /**
        /**
         * Returns the set of session IDs that will be committed when this session is commited if
         * Returns the set of session IDs that will be committed when this session is committed if
         * this session is a multi-package session.
         * this session is a multi-package session.
         */
         */
        @NonNull
        @NonNull
@@ -3257,6 +3311,7 @@ public class PackageInstaller {
            dest.writeInt(mSessionErrorCode);
            dest.writeInt(mSessionErrorCode);
            dest.writeString(mSessionErrorMessage);
            dest.writeString(mSessionErrorMessage);
            dest.writeBoolean(isCommitted);
            dest.writeBoolean(isCommitted);
            dest.writeBoolean(isPreapprovalRequested);
            dest.writeInt(rollbackDataPolicy);
            dest.writeInt(rollbackDataPolicy);
            dest.writeLong(createdMillis);
            dest.writeLong(createdMillis);
            dest.writeInt(requireUserAction);
            dest.writeInt(requireUserAction);
+4 −0
Original line number Original line Diff line number Diff line
@@ -59,6 +59,10 @@
                <action android:name="android.content.pm.action.CONFIRM_INSTALL" />
                <action android:name="android.content.pm.action.CONFIRM_INSTALL" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            </intent-filter>
            <intent-filter android:priority="1">
                <action android:name="android.content.pm.action.CONFIRM_PRE_APPROVAL" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        </activity>


        <activity android:name=".InstallStaging"
        <activity android:name=".InstallStaging"
+2 −1
Original line number Original line Diff line number Diff line
@@ -59,7 +59,8 @@ public class InstallStart extends Activity {
        String callingAttributionTag = null;
        String callingAttributionTag = null;


        final boolean isSessionInstall =
        final boolean isSessionInstall =
                PackageInstaller.ACTION_CONFIRM_INSTALL.equals(intent.getAction());
                PackageInstaller.ACTION_CONFIRM_PRE_APPROVAL.equals(intent.getAction())
                        || PackageInstaller.ACTION_CONFIRM_INSTALL.equals(intent.getAction());


        // If the activity was started via a PackageInstaller session, we retrieve the calling
        // If the activity was started via a PackageInstaller session, we retrieve the calling
        // package from that session
        // package from that session
Loading