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

Commit 39964a18 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "adi-pia" into main

* changes:
  [ADI][UserConfirmation][4/4] Implement ADI on Pia V2
  [ADI][UserConfirmation][3/4] Add unit tests for ConfirmVerification dialogs
  [ADI][UserConfirmation][2/4] Implement new dialogs in Pia to handle incomplete and failed verification
  [ADI][UserConfirmation][1/4] Communicate the verification result to the installer and get user response
parents 32748b57 1671605c
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -399,6 +399,7 @@ package android {
    field public static final String SET_SCREEN_COMPATIBILITY = "android.permission.SET_SCREEN_COMPATIBILITY";
    field public static final String SET_SYSTEM_AUDIO_CAPTION = "android.permission.SET_SYSTEM_AUDIO_CAPTION";
    field public static final String SET_UNRESTRICTED_KEEP_CLEAR_AREAS = "android.permission.SET_UNRESTRICTED_KEEP_CLEAR_AREAS";
    field @FlaggedApi("android.content.pm.verification_service") public static final String SET_VERIFICATION_USER_RESPONSE = "android.permission.SET_VERIFICATION_USER_RESPONSE";
    field public static final String SET_VOLUME_KEY_LONG_PRESS_LISTENER = "android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER";
    field public static final String SET_WALLPAPER_COMPONENT = "android.permission.SET_WALLPAPER_COMPONENT";
    field public static final String SET_WALLPAPER_DIM_AMOUNT = "android.permission.SET_WALLPAPER_DIM_AMOUNT";
@@ -4286,13 +4287,16 @@ package android.content.pm {
  public class PackageInstaller {
    method @FlaggedApi("android.content.pm.verification_service") @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public final int getVerificationPolicy();
    method @FlaggedApi("android.content.pm.verification_service") @Nullable public android.content.pm.PackageInstaller.VerificationUserConfirmationInfo getVerificationUserConfirmationInfo(int);
    method @NonNull public android.content.pm.PackageInstaller.InstallInfo readInstallInfo(@NonNull java.io.File, int) throws android.content.pm.PackageInstaller.PackageParsingException;
    method @FlaggedApi("android.content.pm.read_install_info") @NonNull public android.content.pm.PackageInstaller.InstallInfo readInstallInfo(@NonNull android.os.ParcelFileDescriptor, @Nullable String, int) throws android.content.pm.PackageInstaller.PackageParsingException;
    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setPermissionsResult(int, boolean);
    method @FlaggedApi("android.content.pm.verification_service") @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public final boolean setVerificationPolicy(int);
    method @FlaggedApi("android.content.pm.verification_service") @RequiresPermission(android.Manifest.permission.SET_VERIFICATION_USER_RESPONSE) public void setVerificationUserResponse(int, int);
    field public static final String ACTION_CONFIRM_INSTALL = "android.content.pm.action.CONFIRM_INSTALL";
    field public static final String ACTION_CONFIRM_PRE_APPROVAL = "android.content.pm.action.CONFIRM_PRE_APPROVAL";
    field @FlaggedApi("android.content.pm.sdk_dependency_installer") public static final String ACTION_INSTALL_DEPENDENCY = "android.content.pm.action.INSTALL_DEPENDENCY";
    field @FlaggedApi("android.content.pm.verification_service") public static final String ACTION_NOTIFY_VERIFICATION_INCOMPLETE = "android.content.pm.action.NOTIFY_VERIFICATION_INCOMPLETE";
    field public static final int DATA_LOADER_TYPE_INCREMENTAL = 2; // 0x2
    field public static final int DATA_LOADER_TYPE_NONE = 0; // 0x0
    field public static final int DATA_LOADER_TYPE_STREAMING = 1; // 0x1
@@ -4311,6 +4315,11 @@ package android.content.pm {
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_POLICY_BLOCK_FAIL_OPEN = 1; // 0x1
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_POLICY_BLOCK_FAIL_WARN = 2; // 0x2
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_POLICY_NONE = 0; // 0x0
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_USER_RESPONSE_CANCEL = 1; // 0x1
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_USER_RESPONSE_ERROR = 0; // 0x0
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_USER_RESPONSE_INSTALL_ANYWAY = 4; // 0x4
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_USER_RESPONSE_OK = 2; // 0x2
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_USER_RESPONSE_RETRY = 3; // 0x3
  }
  public static class PackageInstaller.InstallInfo {
@@ -4365,6 +4374,16 @@ package android.content.pm {
    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setStaged();
  }
  @FlaggedApi("android.content.pm.verification_service") public static final class PackageInstaller.VerificationUserConfirmationInfo implements android.os.Parcelable {
    ctor public PackageInstaller.VerificationUserConfirmationInfo();
    ctor public PackageInstaller.VerificationUserConfirmationInfo(int, int);
    method public int describeContents();
    method public int getVerificationFailureReason();
    method public int getVerificationPolicy();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.PackageInstaller.VerificationUserConfirmationInfo> CREATOR;
  }
  public class PackageItemInfo {
    method public static void forceSafeLabels();
    method @Deprecated @NonNull public CharSequence loadSafeLabel(@NonNull android.content.pm.PackageManager);
+7 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.pm.IPackageDeleteObserver2;
import android.content.pm.IPackageInstallerCallback;
import android.content.pm.IPackageInstallerSession;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageInstaller.VerificationUserConfirmationInfo;
import android.content.pm.ParceledListSlice;
import android.content.pm.VersionedPackage;
import android.content.IntentSender;
@@ -99,4 +100,10 @@ interface IPackageInstaller {
    @EnforcePermission("VERIFICATION_AGENT")
    boolean setVerificationPolicy(int policy, int userId);
    String getVerificationServiceProvider();

    @EnforcePermission("SET_VERIFICATION_USER_RESPONSE")
    void setVerificationUserResponse(int sessionId, int verificationUserResponse);

    @EnforcePermission("SET_VERIFICATION_USER_RESPONSE")
    VerificationUserConfirmationInfo getVerificationUserConfirmationInfo(int sessionId);
}
+1 −0
Original line number Diff line number Diff line
@@ -20,3 +20,4 @@ parcelable PackageInstaller.InstallConstraints;
parcelable PackageInstaller.SessionParams;
parcelable PackageInstaller.SessionInfo;
parcelable PackageInstaller.PreapprovalDetails;
parcelable PackageInstaller.VerificationUserConfirmationInfo;
+181 −2
Original line number Diff line number Diff line
@@ -231,6 +231,17 @@ public class PackageInstaller {
    public static final String ACTION_INSTALL_DEPENDENCY =
            "android.content.pm.action.INSTALL_DEPENDENCY";

    /**
     * Intent sent to the installer to indicate user action is required to proceed with the
     * verification.
     *
     * @hide
     */
    @SystemApi
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    public static final String ACTION_NOTIFY_VERIFICATION_INCOMPLETE =
            "android.content.pm.action.NOTIFY_VERIFICATION_INCOMPLETE";

    /**
     * An integer session ID that an operation is working with.
     *
@@ -827,6 +838,7 @@ public class PackageInstaller {
            VERIFICATION_FAILED_REASON_NETWORK_UNAVAILABLE,
            VERIFICATION_FAILED_REASON_PACKAGE_BLOCKED,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface VerificationFailedReason {
    }

@@ -872,6 +884,58 @@ public class PackageInstaller {
    public @interface VerificationPolicy {
    }

    /**
     * This response code indicates that there was some error while showing a user confirmation
     * dialog.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_USER_RESPONSE_ERROR = 0;
    /**
     * This indicates that the user has confirmed not to proceed with the installation.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_USER_RESPONSE_CANCEL = 1;
    /**
     * This indicates that the user has acknowledged that installation cannot be completed due to
     * a failed / incomplete verification.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_USER_RESPONSE_OK = 2;
    /**
     * For an incomplete verification, the user has asked to retry the verification.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_USER_RESPONSE_RETRY = 3;
    /**
     * For an incomplete verification, the user has confirmed proceeding with the installation
     * anyway.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_USER_RESPONSE_INSTALL_ANYWAY = 4;
    /**
     * @hide
     */
    @IntDef(value = {
            VERIFICATION_USER_RESPONSE_ERROR,
            VERIFICATION_USER_RESPONSE_CANCEL,
            VERIFICATION_USER_RESPONSE_OK,
            VERIFICATION_USER_RESPONSE_RETRY,
            VERIFICATION_USER_RESPONSE_INSTALL_ANYWAY,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface VerificationUserResponse {
    }

    /** Default set of checksums - includes all available checksums.
     * @see Session#requestChecksums  */
    private static final int DEFAULT_CHECKSUMS =
@@ -1013,6 +1077,27 @@ public class PackageInstaller {
        }
    }

    /**
     * Returns the details about an incomplete or failed verification. Used by the default
     * PackageInstaller app on the device to show appropriate informational dialogs to the user,
     * when a user action is required.
     *
     * @return details for the requested session, or {@code null} if the session
     *          does not exist.
     *
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public @Nullable VerificationUserConfirmationInfo getVerificationUserConfirmationInfo(
            int sessionId) {
        try {
            return mInstaller.getVerificationUserConfirmationInfo(sessionId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Return list of all known install sessions, regardless of the installer. Callers need to
     * either declare &lt;queries&gt; element with the specific  package name in the app's manifest,
@@ -1663,6 +1748,24 @@ public class PackageInstaller {
        }
    }

    /**
     * Set user's response to an incomplete verification, regarding proceeding with the
     * installation
     *
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    @RequiresPermission(android.Manifest.permission.SET_VERIFICATION_USER_RESPONSE)
    public void setVerificationUserResponse(int sessionId,
            @VerificationUserResponse int verificationUserResponse) {
        try {
            mInstaller.setVerificationUserResponse(sessionId, verificationUserResponse);
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
    }

    /**
     * An installation that is being actively staged. For an install to succeed,
     * all existing and new packages must have identical package names, version
@@ -4877,6 +4980,78 @@ public class PackageInstaller {
                };
    }

    /**
     * Details about an incomplete or failed verification.
     *
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final class VerificationUserConfirmationInfo implements Parcelable {

        @VerificationPolicy
        private int mVerificationPolicy;

        @VerificationFailedReason
        private int mVerificationFailureReason;

        public VerificationUserConfirmationInfo() {
        }

        public VerificationUserConfirmationInfo(@VerificationPolicy int policy,
                @VerificationFailedReason int failureReason) {
            mVerificationPolicy = policy;
            mVerificationFailureReason = failureReason;
        }

        private VerificationUserConfirmationInfo(@NonNull Parcel in) {
            mVerificationPolicy = in.readInt();
            mVerificationFailureReason = in.readInt();
        }

        @VerificationPolicy
        public int getVerificationPolicy() {
            return mVerificationPolicy;
        }

        @VerificationFailedReason
        public int getVerificationFailureReason() {
            return mVerificationFailureReason;
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(@NonNull Parcel dest, int flags) {
            dest.writeInt(mVerificationPolicy);
            dest.writeInt(mVerificationFailureReason);
        }

        public static final @NonNull Parcelable.Creator<VerificationUserConfirmationInfo>
                CREATOR = new Parcelable.Creator<>() {
                    @Override
                    public VerificationUserConfirmationInfo createFromParcel(@NonNull Parcel p) {
                        return new VerificationUserConfirmationInfo(p);
                    }

                    @Override
                    public VerificationUserConfirmationInfo[] newArray(int size) {
                        return new VerificationUserConfirmationInfo[size];
                    }
                };

        @Override
        public String toString() {
            return "VerificationUserConfirmationInfo{"
                    + "verificationPolicy=" + mVerificationPolicy
                    + ", vericationFailureReason=" + mVerificationFailureReason
                    + '}';
        }
    }

    /**
     * Details for requesting the pre-commit install approval.
     */
@@ -4933,9 +5108,13 @@ public class PackageInstaller {
        @Override
        public void writeToParcel(@NonNull Parcel dest, int flags) {
            byte flg = 0;
            if (mIcon != null) flg |= 0x1;
            if (mIcon != null) {
                flg |= 0x1;
            }
            dest.writeByte(flg);
            if (mIcon != null) mIcon.writeToParcel(dest, flags);
            if (mIcon != null) {
                mIcon.writeToParcel(dest, flags);
            }
            dest.writeCharSequence(mLabel);
            dest.writeString8(mLocale.toString());
            dest.writeString8(mPackageName);
+11 −0
Original line number Diff line number Diff line
@@ -9187,6 +9187,17 @@
        android:protectionLevel="internal"
        android:featureFlag="android.content.pm.verification_service" />

     <!-- @SystemApi
        @FlaggedApi(android.content.pm.Flags.FLAG_VERIFICATION_SERVICE)
        Allows only the default PackageInstaller app to set user's response for
        an incomplete verification.
        <p>Protection level: internal|installer
        @hide
    -->
    <permission android:name="android.permission.SET_VERIFICATION_USER_RESPONSE"
        android:protectionLevel="internal|installer"
        android:featureFlag="android.content.pm.verification_service" />

    <!-- Attribution for Geofencing service. -->
    <attribution android:tag="GeofencingService" android:label="@string/geofencing_service"/>
    <!-- Attribution for Country Detector. -->
Loading