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

Commit 60845919 authored by Song Chun Fan's avatar Song Chun Fan
Browse files

[ADI][29/N] addressing API feedback

FLAG: android.content.pm.verification_service

API-Coverage-Bug: 420966373

BUG: 423898085
FIXES: 423898085
BUG: 360129657

Test: atest android.content.pm.verify.developer.DeveloperVerificationStatusTest

Change-Id: I6915046ecc038e583b5dfe86392e1b0ba9dbfe87
parent f7084543
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -4776,22 +4776,22 @@ package android.content.pm.verify.developer {
  @FlaggedApi("android.content.pm.verification_service") public final class DeveloperVerificationStatus implements android.os.Parcelable {
    method public int describeContents();
    method public int getAslStatus();
    method @NonNull public String getFailureMessage();
    method public int getAppMetadataVerificationStatus();
    method @Nullable public String getFailureMessage();
    method public boolean isLiteVerification();
    method public boolean isVerified();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field public static final int APP_METADATA_VERIFICATION_STATUS_BAD = 2; // 0x2
    field public static final int APP_METADATA_VERIFICATION_STATUS_GOOD = 1; // 0x1
    field public static final int APP_METADATA_VERIFICATION_STATUS_UNDEFINED = 0; // 0x0
    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.verify.developer.DeveloperVerificationStatus> CREATOR;
    field public static final int DEVELOPER_VERIFIER_STATUS_ASL_BAD = 2; // 0x2
    field public static final int DEVELOPER_VERIFIER_STATUS_ASL_GOOD = 1; // 0x1
    field public static final int DEVELOPER_VERIFIER_STATUS_ASL_UNDEFINED = 0; // 0x0
  }
  public static final class DeveloperVerificationStatus.Builder {
    ctor public DeveloperVerificationStatus.Builder();
    method @NonNull public android.content.pm.verify.developer.DeveloperVerificationStatus build();
    method @NonNull public android.content.pm.verify.developer.DeveloperVerificationStatus.Builder setAslStatus(int);
    method @NonNull public android.content.pm.verify.developer.DeveloperVerificationStatus.Builder setFailureMessage(@NonNull String);
    method @NonNull public android.content.pm.verify.developer.DeveloperVerificationStatus.Builder setAppMetadataVerificationStatus(int);
    method @NonNull public android.content.pm.verify.developer.DeveloperVerificationStatus.Builder setFailureMessage(@Nullable String);
    method @NonNull public android.content.pm.verify.developer.DeveloperVerificationStatus.Builder setLiteVerification(boolean);
    method @NonNull public android.content.pm.verify.developer.DeveloperVerificationStatus.Builder setVerified(boolean);
  }
+45 −38
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.content.pm.verify.developer;
import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.content.pm.Flags;
import android.os.Parcel;
@@ -26,7 +27,6 @@ import android.os.Parcelable;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;

/**
 * This class is used by the developer verifier to describe the status of the verification request,
@@ -37,48 +37,48 @@ import java.util.Objects;
@FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
public final class DeveloperVerificationStatus implements Parcelable {
    /**
     * The ASL status has not been determined.
     * The verification status of the App Metadata associated with the app has not been
     * determined.
     * <p>This happens in situations where the verification
     * service is not monitoring ASLs, and means the ASL data in the app is not necessarily bad but
     * can't be trusted.
     * service is not monitoring App Metadata for the app, and means the App Metadata of the app is
     * not necessarily bad but can't be trusted.
     * </p>
     */
    public static final int DEVELOPER_VERIFIER_STATUS_ASL_UNDEFINED = 0;
    public static final int APP_METADATA_VERIFICATION_STATUS_UNDEFINED = 0;

    /**
     * The app's ASL data is considered to be in a good state.
     * The app's App Metadata is considered to be in a good state. This can be used by
     * the system to inform the user that the App Metadata of the app can be trusted.
     */
    public static final int DEVELOPER_VERIFIER_STATUS_ASL_GOOD = 1;
    public static final int APP_METADATA_VERIFICATION_STATUS_GOOD = 1;

    /**
     * There is something bad in the app's ASL data.
     * <p>
     * The user should be warned about this when shown
     * the ASL data and/or appropriate decisions made about the use of this data by the platform.
     * </p>
     * There is something bad in the app's App Metadata. This can be used by the system to warn
     * the user or make appropriate decisions about the app.
     */
    public static final int DEVELOPER_VERIFIER_STATUS_ASL_BAD = 2;
    public static final int APP_METADATA_VERIFICATION_STATUS_BAD = 2;

    /** @hide */
    @IntDef(prefix = {"DEVELOPER_VERIFIER_STATUS_ASL_"}, value = {
            DEVELOPER_VERIFIER_STATUS_ASL_UNDEFINED,
            DEVELOPER_VERIFIER_STATUS_ASL_GOOD,
            DEVELOPER_VERIFIER_STATUS_ASL_BAD,
    @IntDef(prefix = {"APP_METADATA_VERIFICATION_STATUS_"}, value = {
            APP_METADATA_VERIFICATION_STATUS_UNDEFINED,
            APP_METADATA_VERIFICATION_STATUS_GOOD,
            APP_METADATA_VERIFICATION_STATUS_BAD,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface DeveloperVerifierStatusAsl {}
    public @interface AppMetadataVerificationStatus {}

    private final boolean mIsVerified;
    private final boolean mIsLiteVerification;
    private final @DeveloperVerifierStatusAsl int mAslStatus;
    @NonNull
    private final @AppMetadataVerificationStatus int mAppMetadataVerificationStatus;
    @Nullable
    private final String mFailuresMessage;

    private DeveloperVerificationStatus(boolean isVerified, boolean isLiteVerification,
            @DeveloperVerifierStatusAsl int aslStatus, @NonNull String failuresMessage) {
            @AppMetadataVerificationStatus int appMetadataVerificationStatus,
            @Nullable String failuresMessage) {
        mIsVerified = isVerified;
        mIsLiteVerification = isLiteVerification;
        mAslStatus = aslStatus;
        mAppMetadataVerificationStatus = appMetadataVerificationStatus;
        mFailuresMessage = failuresMessage;
    }

@@ -97,18 +97,19 @@ public final class DeveloperVerificationStatus implements Parcelable {
    }

    /**
     * @return the failure message associated with the failure status.
     * @return the developer-facing failure message associated with the failure status.
     * Null if there is no failure.
     */
    @NonNull
    @Nullable
    public String getFailureMessage() {
        return mFailuresMessage;
    }

    /**
     * @return the asl status.
     * @return the verification status of the App Metadata associated with the app.
     */
    public @DeveloperVerifierStatusAsl int getAslStatus() {
        return mAslStatus;
    public @AppMetadataVerificationStatus int getAppMetadataVerificationStatus() {
        return mAppMetadataVerificationStatus;
    }

    /**
@@ -117,9 +118,9 @@ public final class DeveloperVerificationStatus implements Parcelable {
    public static final class Builder {
        private boolean mIsVerified = false;
        private boolean mIsLiteVerification = false;
        private @DeveloperVerifierStatusAsl int mAslStatus =
                DEVELOPER_VERIFIER_STATUS_ASL_UNDEFINED;
        private String mFailuresMessage = "";
        private @AppMetadataVerificationStatus int mAppMetadataVerificationStatus =
                APP_METADATA_VERIFICATION_STATUS_UNDEFINED;
        private @Nullable String mFailuresMessage = null;

        /**
         * Set in the status whether the verification has succeeded or failed.
@@ -144,18 +145,23 @@ public final class DeveloperVerificationStatus implements Parcelable {
         * Set a developer-facing failure message to include in the verification failure status.
         */
        @NonNull
        public Builder setFailureMessage(@NonNull String failureMessage) {
            Objects.requireNonNull(failureMessage, "failureMessage cannot be null");
        public Builder setFailureMessage(@Nullable String failureMessage) {
            mFailuresMessage = failureMessage;
            return this;
        }

        /**
         * Set the ASL status, as defined in {@link DeveloperVerifierStatusAsl}.
         * Set the verification status of the App Metadata associated with the app, which can be
         * one of {@link #APP_METADATA_VERIFICATION_STATUS_UNDEFINED},
         * {@link #APP_METADATA_VERIFICATION_STATUS_GOOD},
         * or {@link #APP_METADATA_VERIFICATION_STATUS_BAD}.
         * @see <a href="https://developer.android.com/about/versions/14/features/app-metadata">
         * the Android Developer Site</a> for more information on App Metadata.
         */
        @NonNull
        public Builder setAslStatus(@DeveloperVerifierStatusAsl int aslStatus) {
            mAslStatus = aslStatus;
        public Builder setAppMetadataVerificationStatus(
                @AppMetadataVerificationStatus int appMetadataVerificationStatus) {
            this.mAppMetadataVerificationStatus = appMetadataVerificationStatus;
            return this;
        }

@@ -164,7 +170,8 @@ public final class DeveloperVerificationStatus implements Parcelable {
         */
        @NonNull
        public DeveloperVerificationStatus build() {
            return new DeveloperVerificationStatus(mIsVerified, mIsLiteVerification, mAslStatus,
            return new DeveloperVerificationStatus(mIsVerified, mIsLiteVerification,
                    mAppMetadataVerificationStatus,
                    mFailuresMessage);
        }
    }
@@ -172,7 +179,7 @@ public final class DeveloperVerificationStatus implements Parcelable {
    private DeveloperVerificationStatus(Parcel in) {
        mIsVerified = in.readBoolean();
        mIsLiteVerification = in.readBoolean();
        mAslStatus = in.readInt();
        mAppMetadataVerificationStatus = in.readInt();
        mFailuresMessage = in.readString8();
    }

@@ -180,7 +187,7 @@ public final class DeveloperVerificationStatus implements Parcelable {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeBoolean(mIsVerified);
        dest.writeBoolean(mIsLiteVerification);
        dest.writeInt(mAslStatus);
        dest.writeInt(mAppMetadataVerificationStatus);
        dest.writeString8(mFailuresMessage);
    }

+20 −5
Original line number Diff line number Diff line
@@ -35,8 +35,8 @@ import org.junit.runner.RunWith;
public class DeveloperVerificationStatusTest {
    private static final boolean TEST_VERIFIED = true;
    private static final boolean TEST_LITE = true;
    private static final int TEST_ASL_STATUS =
            DeveloperVerificationStatus.DEVELOPER_VERIFIER_STATUS_ASL_GOOD;
    private static final int TEST_APP_METADATA_VERIFICATION_STATUS =
            DeveloperVerificationStatus.APP_METADATA_VERIFICATION_STATUS_GOOD;
    private static final String TEST_FAILURE_MESSAGE = "test test";
    private static final String TEST_KEY = "test key";
    private static final String TEST_VALUE = "test value";
@@ -47,7 +47,7 @@ public class DeveloperVerificationStatusTest {
    public void setUpWithBuilder() {
        mTestExtras.putString(TEST_KEY, TEST_VALUE);
        mStatus = new DeveloperVerificationStatus.Builder()
                .setAslStatus(TEST_ASL_STATUS)
                .setAppMetadataVerificationStatus(TEST_APP_METADATA_VERIFICATION_STATUS)
                .setFailureMessage(TEST_FAILURE_MESSAGE)
                .setVerified(TEST_VERIFIED)
                .setLiteVerification(TEST_LITE)
@@ -57,7 +57,8 @@ public class DeveloperVerificationStatusTest {
    @Test
    public void testGetters() {
        assertThat(mStatus.isVerified()).isEqualTo(TEST_VERIFIED);
        assertThat(mStatus.getAslStatus()).isEqualTo(TEST_ASL_STATUS);
        assertThat(mStatus.getAppMetadataVerificationStatus()).isEqualTo(
                TEST_APP_METADATA_VERIFICATION_STATUS);
        assertThat(mStatus.getFailureMessage()).isEqualTo(TEST_FAILURE_MESSAGE);
        assertThat(mStatus.isLiteVerification()).isEqualTo(TEST_LITE);
    }
@@ -70,8 +71,22 @@ public class DeveloperVerificationStatusTest {
        DeveloperVerificationStatus statusFromParcel =
                DeveloperVerificationStatus.CREATOR.createFromParcel(parcel);
        assertThat(statusFromParcel.isVerified()).isEqualTo(TEST_VERIFIED);
        assertThat(statusFromParcel.getAslStatus()).isEqualTo(TEST_ASL_STATUS);
        assertThat(statusFromParcel.getAppMetadataVerificationStatus()).isEqualTo(
                TEST_APP_METADATA_VERIFICATION_STATUS);
        assertThat(statusFromParcel.getFailureMessage()).isEqualTo(TEST_FAILURE_MESSAGE);
        assertThat(statusFromParcel.isLiteVerification()).isEqualTo(TEST_LITE);
    }

    @Test
    public void testParcelWithNullFailureMessage() {
        DeveloperVerificationStatus status = new DeveloperVerificationStatus.Builder()
                .setFailureMessage(null)
                .build();
        Parcel parcel = Parcel.obtain();
        status.writeToParcel(parcel, 0);
        parcel.setDataPosition(0);
        DeveloperVerificationStatus statusFromParcel =
                DeveloperVerificationStatus.CREATOR.createFromParcel(parcel);
        assertThat(statusFromParcel.getFailureMessage()).isEqualTo(null);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -3301,7 +3301,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
                    mMetrics.onDeveloperVerifierResponseReceived(statusReceived.isVerified()
                            ? SessionMetrics.DeveloperVerifierResponse.COMPLETE_WITH_PASS
                            : SessionMetrics.DeveloperVerifierResponse.COMPLETE_WITH_REJECT);
                    mMetrics.onAslStatusReceived(statusReceived.getAslStatus());
                    mMetrics.onAslStatusReceived(statusReceived.getAppMetadataVerificationStatus());
                }
                if (mCurrentVerificationPolicy.get() == DEVELOPER_VERIFICATION_POLICY_NONE) {
                    // No policy applied. Continue with the rest of the verification and install.
+5 −5
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ final class SessionMetrics {
    private boolean mIsDeveloperVerificationPolicyOverridden = false;
    @Nullable
    private DeveloperVerifierResponse mDeveloperVerifierResponse = null;
    private @DeveloperVerificationStatus.DeveloperVerifierStatusAsl int mAslStatus;
    private @DeveloperVerificationStatus.AppMetadataVerificationStatus int mAslStatus;
    private @PackageInstaller.DeveloperVerificationPolicy int mDeveloperVerificationPolicyOverride;
    private boolean mWasDeveloperVerificationUserActionRequired = false;
    private @PackageInstaller.DeveloperVerificationUserConfirmationInfo.UserActionNeededReason int
@@ -250,7 +250,7 @@ final class SessionMetrics {
    }

    public void onAslStatusReceived(
            @DeveloperVerificationStatus.DeveloperVerifierStatusAsl int aslStatus) {
            @DeveloperVerificationStatus.AppMetadataVerificationStatus int aslStatus) {
        mAslStatus = aslStatus;
    }

@@ -475,11 +475,11 @@ final class SessionMetrics {
    }

    private static int getTranslatedAslStatusForStats(
            @DeveloperVerificationStatus.DeveloperVerifierStatusAsl int aslStatus) {
            @DeveloperVerificationStatus.AppMetadataVerificationStatus int aslStatus) {
        return switch (aslStatus) {
            case DeveloperVerificationStatus.DEVELOPER_VERIFIER_STATUS_ASL_GOOD ->
            case DeveloperVerificationStatus.APP_METADATA_VERIFICATION_STATUS_GOOD ->
                FrameworkStatsLog.PACKAGE_INSTALLER_SESSION_REPORTED__ASL_STATUS__ASL_STATUS_GOOD;
            case DeveloperVerificationStatus.DEVELOPER_VERIFIER_STATUS_ASL_BAD ->
            case DeveloperVerificationStatus.APP_METADATA_VERIFICATION_STATUS_BAD ->
                FrameworkStatsLog.PACKAGE_INSTALLER_SESSION_REPORTED__ASL_STATUS__ASL_STATUS_BAD;
            default ->
                FrameworkStatsLog.PACKAGE_INSTALLER_SESSION_REPORTED__ASL_STATUS__ASL_STATUS_UNSPECIFIED;