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

Commit c17bbf82 authored by Patrick Baumann's avatar Patrick Baumann
Browse files

Addresses unresolved comments for silent updates

Bug: 182487678
Test: atest CtsSilentUpdateHostTestCases
Change-Id: I2019213a8b45c23ba2c519a2457aae45081616f9
parent 01af039b
Loading
Loading
Loading
Loading
+32 −37
Original line number Diff line number Diff line
@@ -1566,7 +1566,7 @@ public class PackageInstaller {
        /** {@hide} */
        public boolean forceQueryableOverride;
        /** {@hide} */
        public Boolean requireUserAction;
        public int requireUserAction = SessionInfo.USER_ACTION_UNSPECIFIED;

        /**
         * Construct parameters for a new package install session.
@@ -1609,12 +1609,7 @@ public class PackageInstaller {
                dataLoaderParams = new DataLoaderParams(dataLoaderParamsParcel);
            }
            rollbackDataPolicy = source.readInt();
            int requireUserActionInt = source.readInt();
            requireUserAction = requireUserActionInt == 0
                    ? Boolean.FALSE
                    : requireUserActionInt == 1
                            ? Boolean.TRUE : null;

            requireUserAction = source.readInt();
        }

        /** {@hide} */
@@ -2045,31 +2040,34 @@ public class PackageInstaller {
         * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES android.permission
         * #REQUEST_INSTALL_PACKAGES} permission, and {@code false} otherwise. When {@code true},
         * installers will receive a {@link #STATUS_PENDING_USER_ACTION} callback once the
         * session is committed, indicating that the user is required for the install to proceed.
         * session is committed, indicating that user action is required for the install to proceed.
         * <p>
         * For installers using the {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES
         * android.permission.REQUEST_INSTALL_PACKAGES} permission, user action will not be
         * required when the following conditions are met:
         * For installers that have been granted the
         * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES android.permission
         * .REQUEST_INSTALL_PACKAGES} permission, user action will not be required when all of
         * the following conditions are met:
         *
         * <ul>
         *     <li>{@code requireUserAction} is set to {@code false}.</li>
         *     <li>The being installed targets {@link android.os.Build.VERSION_CODES#Q API 29} or
         *     higher.</li>
         *     <li>The app being installed targets {@link android.os.Build.VERSION_CODES#Q API 29}
         *     or higher.</li>
         *     <li>The installer is the {@link InstallSourceInfo#getInstallingPackageName()
         *     installer of record} of an existing version of the app (i.e.: this install session
         *     is an app update or the installer is updating itself).</li>
         *     is an app update) or the installer is updating itself.</li>
         *     <li>The installer declares the
         *     {@link android.Manifest.permission#UPDATE_PACKAGES_WITHOUT_USER_ACTION android
         *     .permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION} permission.</li>
         * </ul>
         * <p>
         * Note: The target API level requirement will advance in future Android versions.
         * Session owners should always be prepared to handle {@link #STATUS_PENDING_USER_ACTION}
         * Session owners should always be prepared to handle {@link #STATUS_PENDING_USER_ACTION}.
         *
         * @param requireUserAction whether user action should be required.
         */
        public void setRequireUserAction(boolean requireUserAction) {
            this.requireUserAction = requireUserAction;
            this.requireUserAction = requireUserAction
                    ? SessionInfo.USER_ACTION_REQUIRED
                    : SessionInfo.USER_ACTION_NOT_REQUIRED;
        }

        /**
@@ -2102,7 +2100,7 @@ public class PackageInstaller {
            pw.printPair("isMultiPackage", isMultiPackage);
            pw.printPair("isStaged", isStaged);
            pw.printPair("forceQueryable", forceQueryableOverride);
            pw.printPair("requireUserAction", requireUserAction);
            pw.printPair("requireUserAction", SessionInfo.userActionToString(requireUserAction));
            pw.printPair("requiredInstalledVersionCode", requiredInstalledVersionCode);
            pw.printPair("dataLoaderParams", dataLoaderParams);
            pw.printPair("rollbackDataPolicy", rollbackDataPolicy);
@@ -2144,10 +2142,7 @@ public class PackageInstaller {
                dest.writeParcelable(null, flags);
            }
            dest.writeInt(rollbackDataPolicy);
            dest.writeInt(requireUserAction == Boolean.TRUE
                    ? 1
                    : requireUserAction == Boolean.FALSE
                            ? 0 : 2);
            dest.writeInt(requireUserAction);
        }

        public static final Parcelable.Creator<SessionParams>
@@ -2224,7 +2219,7 @@ public class PackageInstaller {
        public @interface UserActionRequirement {}

        /**
         * The installer did not calling {@link SessionParams#setRequireUserAction(boolean)} to
         * The installer did not call {@link SessionParams#setRequireUserAction(boolean)} to
         * specify whether user action should be required for the install.
         */
        public static final int USER_ACTION_UNSPECIFIED = 0;
@@ -2239,6 +2234,17 @@ public class PackageInstaller {
         */
        public static final int USER_ACTION_NOT_REQUIRED = 2;

        private static String userActionToString(int requireUserAction) {
            switch(requireUserAction) {
                case SessionInfo.USER_ACTION_REQUIRED:
                    return "REQUIRED";
                case SessionInfo.USER_ACTION_NOT_REQUIRED:
                    return "NOT_REQUIRED";
                default:
                    return "UNSPECIFIED";
            }
        }

        /** {@hide} */
        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
        public int sessionId;
@@ -2331,7 +2337,7 @@ public class PackageInstaller {
        public int rollbackDataPolicy;

        /** {@hide} */
        public Boolean requireUserAction;
        public int requireUserAction;

        /** {@hide} */
        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
@@ -2382,11 +2388,7 @@ public class PackageInstaller {
            isCommitted = source.readBoolean();
            rollbackDataPolicy = source.readInt();
            createdMillis = source.readLong();
            int requireUserActionInt = source.readInt();
            requireUserAction = requireUserActionInt == 0
                    ? Boolean.FALSE
                    : requireUserActionInt == 1
                            ? Boolean.TRUE : null;
            requireUserAction = source.readInt();
        }

        /**
@@ -2898,11 +2900,7 @@ public class PackageInstaller {
         */
        @UserActionRequirement
        public int getRequireUserAction() {
            return requireUserAction == null
                    ? USER_ACTION_UNSPECIFIED
                    : requireUserAction == Boolean.TRUE
                            ? USER_ACTION_REQUIRED
                            : USER_ACTION_NOT_REQUIRED;
            return requireUserAction;
        }

        @Override
@@ -2950,10 +2948,7 @@ public class PackageInstaller {
            dest.writeBoolean(isCommitted);
            dest.writeInt(rollbackDataPolicy);
            dest.writeLong(createdMillis);
            dest.writeInt(requireUserAction == Boolean.TRUE
                    ? 1
                    : requireUserAction == Boolean.FALSE
                            ? 0 : 2);
            dest.writeInt(requireUserAction);
        }

        public static final Parcelable.Creator<SessionInfo>
+3 −7
Original line number Diff line number Diff line
@@ -5688,13 +5688,9 @@
    <permission android:name="android.permission.SET_CLIP_SOURCE"
                android:protectionLevel="signature|recents" />

    <!-- Allows an application to request installs that update existing packages do so without
         user action via
         {@link android.content.pm.PackageInstaller.SessionParams#setRequireUserAction(boolean)}.
         This permission only grants the ability to make the request and is not a guarantee that the
         request will be honored. In order to execute the install, the caller must also have the
         "android.permission.REQUEST_INSTALL_PACKAGES" or "android.permission.INSTALL_PACKAGES"
         permissions.
    <!-- Allows an application to indicate via
         {@link android.content.pm.PackageInstaller.SessionParams#setRequireUserAction(boolean)}
         that user action should not be required for an app update.
         <p>Protection level: normal
    -->
    <permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION"
+2 −2
Original line number Diff line number Diff line
@@ -927,7 +927,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

        final boolean forcePermissionPrompt =
                (params.installFlags & PackageManager.INSTALL_FORCE_PERMISSION_PROMPT) != 0
                        || params.requireUserAction == Boolean.TRUE;
                        || params.requireUserAction == SessionInfo.USER_ACTION_REQUIRED;
        if (forcePermissionPrompt) {
            return USER_ACTION_REQUIRED;
        }
@@ -976,7 +976,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            return USER_ACTION_REQUIRED;
        }

        if (params.requireUserAction == Boolean.FALSE
        if (params.requireUserAction == SessionInfo.USER_ACTION_NOT_REQUIRED
                && isUpdateWithoutUserActionPermissionGranted
                && (isInstallerOfRecord || isSelfUpdate)) {
            return USER_ACTION_PENDING_APK_PARSING;