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

Commit 6a85d75f authored by Holly Jiuyu Sun's avatar Holly Jiuyu Sun Committed by android-build-merger
Browse files

Merge "Merge EuiccProfile into EuiccProfileInfo." am: b01bd54b am: 6a5dc32a

am: 20f35f96

Change-Id: I8f7cc7e81fc163119ffa15666f054b298d47fff1
parents 9e684650 20f35f96
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -38001,6 +38001,7 @@ package android.service.carrier {
  public class CarrierIdentifier implements android.os.Parcelable {
    ctor public CarrierIdentifier(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    ctor public CarrierIdentifier(byte[], java.lang.String, java.lang.String);
    method public int describeContents();
    method public java.lang.String getGid1();
    method public java.lang.String getGid2();
+71 −6
Original line number Diff line number Diff line
@@ -16,9 +16,14 @@

package android.service.carrier;

import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;

import com.android.internal.telephony.uicc.IccUtils;

import java.util.Objects;

/**
 * Used to pass info to CarrierConfigService implementations so they can decide what values to
 * return.
@@ -40,13 +45,13 @@ public class CarrierIdentifier implements Parcelable {

    private String mMcc;
    private String mMnc;
    private String mSpn;
    private String mImsi;
    private String mGid1;
    private String mGid2;
    private @Nullable String mSpn;
    private @Nullable String mImsi;
    private @Nullable String mGid1;
    private @Nullable String mGid2;

    public CarrierIdentifier(String mcc, String mnc, String spn, String imsi, String gid1,
            String gid2) {
    public CarrierIdentifier(String mcc, String mnc, @Nullable String spn, @Nullable String imsi,
            @Nullable String gid1, @Nullable String gid2) {
        mMcc = mcc;
        mMnc = mnc;
        mSpn = spn;
@@ -55,6 +60,32 @@ public class CarrierIdentifier implements Parcelable {
        mGid2 = gid2;
    }

    /**
     * Creates a carrier identifier instance.
     *
     * @param mccMnc A 3-byte array as defined by 3GPP TS 24.008.
     * @param gid1 The group identifier level 1.
     * @param gid2 The group identifier level 2.
     * @throws IllegalArgumentException If the length of {@code mccMnc} is not 3.
     */
    public CarrierIdentifier(byte[] mccMnc, @Nullable String gid1, @Nullable String gid2) {
        if (mccMnc.length != 3) {
            throw new IllegalArgumentException(
                    "MCC & MNC must be set by a 3-byte array: byte[" + mccMnc.length + "]");
        }
        String hex = IccUtils.bytesToHexString(mccMnc);
        mMcc = new String(new char[] {hex.charAt(1), hex.charAt(0), hex.charAt(3)});
        if (hex.charAt(2) == 'F') {
            mMnc = new String(new char[] {hex.charAt(5), hex.charAt(4)});
        } else {
            mMnc = new String(new char[] {hex.charAt(5), hex.charAt(4), hex.charAt(2)});
        }
        mGid1 = gid1;
        mGid2 = gid2;
        mSpn = null;
        mImsi = null;
    }

    /** @hide */
    public CarrierIdentifier(Parcel parcel) {
        readFromParcel(parcel);
@@ -71,25 +102,59 @@ public class CarrierIdentifier implements Parcelable {
    }

    /** Get the service provider name. */
    @Nullable
    public String getSpn() {
        return mSpn;
    }

    /** Get the international mobile subscriber identity. */
    @Nullable
    public String getImsi() {
        return mImsi;
    }

    /** Get the group identifier level 1. */
    @Nullable
    public String getGid1() {
        return mGid1;
    }

    /** Get the group identifier level 2. */
    @Nullable
    public String getGid2() {
        return mGid2;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }

        CarrierIdentifier that = (CarrierIdentifier) obj;
        return Objects.equals(mMcc, that.mMcc)
                && Objects.equals(mMnc, that.mMnc)
                && Objects.equals(mSpn, that.mSpn)
                && Objects.equals(mImsi, that.mImsi)
                && Objects.equals(mGid1, that.mGid1)
                && Objects.equals(mGid2, that.mGid2);
    }

    @Override
    public int hashCode() {
        int result = 1;
        result = 31 * result + Objects.hashCode(mMcc);
        result = 31 * result + Objects.hashCode(mMnc);
        result = 31 * result + Objects.hashCode(mSpn);
        result = 31 * result + Objects.hashCode(mImsi);
        result = 31 * result + Objects.hashCode(mGid1);
        result = 31 * result + Objects.hashCode(mGid2);
        return result;
    }

    @Override
    public int describeContents() {
        return 0;
+357 −5
Original line number Diff line number Diff line
@@ -15,12 +15,19 @@
 */
package android.service.euicc;

import android.annotation.IntDef;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.service.carrier.CarrierIdentifier;
import android.telephony.UiccAccessRule;
import android.text.TextUtils;

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

/**
 * Information about an embedded profile (subscription) on an eUICC.
 *
@@ -30,18 +37,90 @@ import android.text.TextUtils;
 */
public final class EuiccProfileInfo implements Parcelable {

    /** Profile policy rules (bit mask) */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(flag = true, prefix = { "POLICY_RULE_" }, value = {
            POLICY_RULE_DO_NOT_DISABLE,
            POLICY_RULE_DO_NOT_DELETE,
            POLICY_RULE_DELETE_AFTER_DISABLING
    })
    public @interface PolicyRule {}
    /** Once this profile is enabled, it cannot be disabled. */
    public static final int POLICY_RULE_DO_NOT_DISABLE = 1;
    /** This profile cannot be deleted. */
    public static final int POLICY_RULE_DO_NOT_DELETE = 1 << 1;
    /** This profile should be deleted after being disabled. */
    public static final int POLICY_RULE_DELETE_AFTER_DISABLING = 1 << 2;

    /** Class of the profile */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = { "PROFILE_CLASS_" }, value = {
            PROFILE_CLASS_TESTING,
            PROFILE_CLASS_PROVISIONING,
            PROFILE_CLASS_OPERATIONAL,
            PROFILE_CLASS_UNSET
    })
    public @interface ProfileClass {}
    /** Testing profiles */
    public static final int PROFILE_CLASS_TESTING = 0;
    /** Provisioning profiles which are pre-loaded on eUICC */
    public static final int PROFILE_CLASS_PROVISIONING = 1;
    /** Operational profiles which can be pre-loaded or downloaded */
    public static final int PROFILE_CLASS_OPERATIONAL = 2;
    /**
     * Profile class not set.
     * @hide
     */
    public static final int PROFILE_CLASS_UNSET = -1;

    /** State of the profile */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = { "PROFILE_STATE_" }, value = {
            PROFILE_STATE_DISABLED,
            PROFILE_STATE_ENABLED,
            PROFILE_STATE_UNSET
    })
    public @interface ProfileState {}
    /** Disabled profiles */
    public static final int PROFILE_STATE_DISABLED = 0;
    /** Enabled profile */
    public static final int PROFILE_STATE_ENABLED = 1;
    /**
     * Profile state not set.
     * @hide
     */
    public static final int PROFILE_STATE_UNSET = -1;

    /** The iccid of the subscription. */
    public final String iccid;

    /** An optional nickname for the subscription. */
    public final @Nullable String nickname;

    /** The service provider name for the subscription. */
    public final String serviceProviderName;

    /** The profile name for the subscription. */
    public final String profileName;

    /** Profile class for the subscription. */
    @ProfileClass public final int profileClass;

    /** The profile state of the subscription. */
    @ProfileState public final int state;

    /** The operator Id of the subscription. */
    public final CarrierIdentifier carrierIdentifier;

    /** The policy rules of the subscription. */
    @PolicyRule public final int policyRules;

    /**
     * Optional access rules defining which apps can manage this subscription. If unset, only the
     * platform can manage it.
     */
    public final @Nullable UiccAccessRule[] accessRules;

    /** An optional nickname for the subscription. */
    public final @Nullable String nickname;

    public static final Creator<EuiccProfileInfo> CREATOR = new Creator<EuiccProfileInfo>() {
        @Override
        public EuiccProfileInfo createFromParcel(Parcel in) {
@@ -54,6 +133,12 @@ public final class EuiccProfileInfo implements Parcelable {
        }
    };

    // TODO(b/70292228): Remove this method when LPA can be updated.
    /**
     * @hide
     * @deprecated - Do not use.
     */
    @Deprecated
    public EuiccProfileInfo(String iccid, @Nullable UiccAccessRule[] accessRules,
            @Nullable String nickname) {
        if (!TextUtils.isDigitsOnly(iccid)) {
@@ -62,23 +147,290 @@ public final class EuiccProfileInfo implements Parcelable {
        this.iccid = iccid;
        this.accessRules = accessRules;
        this.nickname = nickname;

        this.serviceProviderName = null;
        this.profileName = null;
        this.profileClass = PROFILE_CLASS_UNSET;
        this.state = PROFILE_CLASS_UNSET;
        this.carrierIdentifier = null;
        this.policyRules = 0;
    }

    private EuiccProfileInfo(Parcel in) {
        iccid = in.readString();
        accessRules = in.createTypedArray(UiccAccessRule.CREATOR);
        nickname = in.readString();
        serviceProviderName = in.readString();
        profileName = in.readString();
        profileClass = in.readInt();
        state = in.readInt();
        byte exist = in.readByte();
        if (exist == (byte) 1) {
            carrierIdentifier = CarrierIdentifier.CREATOR.createFromParcel(in);
        } else {
            carrierIdentifier = null;
        }
        policyRules = in.readInt();
        accessRules = in.createTypedArray(UiccAccessRule.CREATOR);
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(iccid);
        dest.writeTypedArray(accessRules, flags);
        dest.writeString(nickname);
        dest.writeString(serviceProviderName);
        dest.writeString(profileName);
        dest.writeInt(profileClass);
        dest.writeInt(state);
        if (carrierIdentifier != null) {
            dest.writeByte((byte) 1);
            carrierIdentifier.writeToParcel(dest, flags);
        } else {
            dest.writeByte((byte) 0);
        }
        dest.writeInt(policyRules);
        dest.writeTypedArray(accessRules, flags);
    }

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

    /** The builder to build a new {@link EuiccProfileInfo} instance. */
    public static final class Builder {
        public String iccid;
        public UiccAccessRule[] accessRules;
        public String nickname;
        public String serviceProviderName;
        public String profileName;
        @ProfileClass public int profileClass;
        @ProfileState public int state;
        public CarrierIdentifier carrierIdentifier;
        @PolicyRule public int policyRules;

        public Builder() {}

        public Builder(EuiccProfileInfo baseProfile) {
            iccid = baseProfile.iccid;
            nickname = baseProfile.nickname;
            serviceProviderName = baseProfile.serviceProviderName;
            profileName = baseProfile.profileName;
            profileClass = baseProfile.profileClass;
            state = baseProfile.state;
            carrierIdentifier = baseProfile.carrierIdentifier;
            policyRules = baseProfile.policyRules;
            accessRules = baseProfile.accessRules;
        }

        /** Builds the profile instance. */
        public EuiccProfileInfo build() {
            if (iccid == null) {
                throw new IllegalStateException("ICCID must be set for a profile.");
            }
            return new EuiccProfileInfo(
                    iccid,
                    nickname,
                    serviceProviderName,
                    profileName,
                    profileClass,
                    state,
                    carrierIdentifier,
                    policyRules,
                    accessRules);
        }

        /** Sets the iccId of the subscription. */
        public Builder setIccid(String value) {
            if (!TextUtils.isDigitsOnly(value)) {
                throw new IllegalArgumentException("iccid contains invalid characters: " + value);
            }
            iccid = value;
            return this;
        }

        /** Sets the nickname of the subscription. */
        public Builder setNickname(String value) {
            nickname = value;
            return this;
        }

        /** Sets the service provider name of the subscription. */
        public Builder setServiceProviderName(String value) {
            serviceProviderName = value;
            return this;
        }

        /** Sets the profile name of the subscription. */
        public Builder setProfileName(String value) {
            profileName = value;
            return this;
        }

        /** Sets the profile class of the subscription. */
        public Builder setProfileClass(@ProfileClass int value) {
            profileClass = value;
            return this;
        }

        /** Sets the state of the subscription. */
        public Builder setState(@ProfileState int value) {
            state = value;
            return this;
        }

        /** Sets the carrier identifier of the subscription. */
        public Builder setCarrierIdentifier(CarrierIdentifier value) {
            carrierIdentifier = value;
            return this;
        }

        /** Sets the policy rules of the subscription. */
        public Builder setPolicyRules(@PolicyRule int value) {
            policyRules = value;
            return this;
        }

        /** Sets the access rules of the subscription. */
        public Builder setUiccAccessRule(@Nullable UiccAccessRule[] value) {
            accessRules = value;
            return this;
        }
    }

    private EuiccProfileInfo(
            String iccid,
            @Nullable String nickname,
            String serviceProviderName,
            String profileName,
            @ProfileClass int profileClass,
            @ProfileState int state,
            CarrierIdentifier carrierIdentifier,
            @PolicyRule int policyRules,
            @Nullable UiccAccessRule[] accessRules) {
        this.iccid = iccid;
        this.nickname = nickname;
        this.serviceProviderName = serviceProviderName;
        this.profileName = profileName;
        this.profileClass = profileClass;
        this.state = state;
        this.carrierIdentifier = carrierIdentifier;
        this.policyRules = policyRules;
        this.accessRules = accessRules;
    }

    /** Gets the ICCID string. */
    public String getIccid() {
        return iccid;
    }

    /** Gets the access rules. */
    @Nullable
    public UiccAccessRule[] getUiccAccessRules() {
        return accessRules;
    }

    /** Gets the nickname. */
    public String getNickname() {
        return nickname;
    }

    /** Gets the service provider name. */
    public String getServiceProviderName() {
        return serviceProviderName;
    }

    /** Gets the profile name. */
    public String getProfileName() {
        return profileName;
    }

    /** Gets the profile class. */
    @ProfileClass
    public int getProfileClass() {
        return profileClass;
    }

    /** Gets the state of the subscription. */
    @ProfileState
    public int getState() {
        return state;
    }

    /** Gets the carrier identifier. */
    public CarrierIdentifier getCarrierIdentifier() {
        return carrierIdentifier;
    }

    /** Gets the policy rules. */
    @PolicyRule
    public int getPolicyRules() {
        return policyRules;
    }

    /** Returns whether any policy rule exists. */
    public boolean hasPolicyRules() {
        return policyRules != 0;
    }

    /** Checks whether a certain policy rule exists. */
    public boolean hasPolicyRule(@PolicyRule int policy) {
        return (policyRules & policy) != 0;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }

        EuiccProfileInfo that = (EuiccProfileInfo) obj;
        return Objects.equals(iccid, that.iccid)
                && Objects.equals(nickname, that.nickname)
                && Objects.equals(serviceProviderName, that.serviceProviderName)
                && Objects.equals(profileName, that.profileName)
                && profileClass == that.profileClass
                && state == that.state
                && Objects.equals(carrierIdentifier, that.carrierIdentifier)
                && policyRules == that.policyRules
                && Arrays.equals(accessRules, that.accessRules);
    }

    @Override
    public int hashCode() {
        int result = 1;
        result = 31 * result + Objects.hashCode(iccid);
        result = 31 * result + Objects.hashCode(nickname);
        result = 31 * result + Objects.hashCode(serviceProviderName);
        result = 31 * result + Objects.hashCode(profileName);
        result = 31 * result + profileClass;
        result = 31 * result + state;
        result = 31 * result + Objects.hashCode(carrierIdentifier);
        result = 31 * result + policyRules;
        result = 31 * result + Arrays.hashCode(accessRules);
        return result;
    }

    @Override
    public String toString() {
        return "EuiccProfileInfo (nickname="
                + nickname
                + ", serviceProviderName="
                + serviceProviderName
                + ", profileName="
                + profileName
                + ", profileClass="
                + profileClass
                + ", state="
                + state
                + ", CarrierIdentifier="
                + carrierIdentifier.toString()
                + ", policyRules="
                + policyRules
                + ", accessRules="
                + Arrays.toString(accessRules)
                + ")";
    }
}
+247 −0

File added.

Preview size limit exceeded, changes collapsed.

+16 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Objects;

/**
 * Describes a single UICC access rule according to the GlobalPlatform Secure Element Access Control
@@ -204,6 +205,21 @@ public final class UiccAccessRule implements Parcelable {
                (TextUtils.isEmpty(this.mPackageName) || this.mPackageName.equals(packageName));
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }

        UiccAccessRule that = (UiccAccessRule) obj;
        return Arrays.equals(mCertificateHash, that.mCertificateHash)
                && Objects.equals(mPackageName, that.mPackageName)
                && mAccessType == that.mAccessType;
    }

    @Override
    public String toString() {
        return "cert: " + IccUtils.bytesToHexString(mCertificateHash) + " pkg: " +