256 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Java
		
	
	
	
/**
 | 
						|
 * Copyright (c) 2015, The Android Open Source Project
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
package android.service.carrier;
 | 
						|
 | 
						|
import android.annotation.NonNull;
 | 
						|
import android.annotation.Nullable;
 | 
						|
import android.os.Parcel;
 | 
						|
import android.os.Parcelable;
 | 
						|
import android.telephony.TelephonyManager;
 | 
						|
 | 
						|
import com.android.internal.telephony.uicc.IccUtils;
 | 
						|
import com.android.telephony.Rlog;
 | 
						|
 | 
						|
import java.util.Objects;
 | 
						|
 | 
						|
/**
 | 
						|
 * Used to pass info to CarrierConfigService implementations so they can decide what values to
 | 
						|
 * return. Instead of passing mcc, mnc, gid1, gid2, spn, imsi to locate carrier information,
 | 
						|
 * CarrierIdentifier also include carrier id {@link TelephonyManager#getSimCarrierId()},
 | 
						|
 * a platform-wide unique identifier for each carrier. CarrierConfigService can directly use
 | 
						|
 * carrier id as the key to look up the carrier info.
 | 
						|
 */
 | 
						|
public class CarrierIdentifier implements Parcelable {
 | 
						|
 | 
						|
    /** Used to create a {@link CarrierIdentifier} from a {@link Parcel}. */
 | 
						|
    public static final @android.annotation.NonNull Creator<CarrierIdentifier> CREATOR = new Creator<CarrierIdentifier>() {
 | 
						|
            @Override
 | 
						|
        public CarrierIdentifier createFromParcel(Parcel parcel) {
 | 
						|
            return new CarrierIdentifier(parcel);
 | 
						|
        }
 | 
						|
 | 
						|
            @Override
 | 
						|
        public CarrierIdentifier[] newArray(int i) {
 | 
						|
            return new CarrierIdentifier[i];
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    private String mMcc;
 | 
						|
    private String mMnc;
 | 
						|
    private @Nullable String mSpn;
 | 
						|
    private @Nullable String mImsi;
 | 
						|
    private @Nullable String mGid1;
 | 
						|
    private @Nullable String mGid2;
 | 
						|
    private int mCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
 | 
						|
    private int mSpecificCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
 | 
						|
 | 
						|
    public CarrierIdentifier(String mcc, String mnc, @Nullable String spn, @Nullable String imsi,
 | 
						|
            @Nullable String gid1, @Nullable String gid2) {
 | 
						|
        this(mcc, mnc, spn, imsi, gid1, gid2, TelephonyManager.UNKNOWN_CARRIER_ID,
 | 
						|
                TelephonyManager.UNKNOWN_CARRIER_ID);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param mcc mobile country code
 | 
						|
     * @param mnc mobile network code
 | 
						|
     * @param spn service provider name
 | 
						|
     * @param imsi International Mobile Subscriber Identity {@link TelephonyManager#getSubscriberId()}
 | 
						|
     * @param gid1 group id level 1 {@link TelephonyManager#getGroupIdLevel1()}
 | 
						|
     * @param gid2 group id level 2
 | 
						|
     * @param carrierid carrier unique identifier {@link TelephonyManager#getSimCarrierId()}, used
 | 
						|
     *                  to uniquely identify the carrier and look up the carrier configurations.
 | 
						|
     * @param specificCarrierId specific carrier identifier
 | 
						|
     * {@link TelephonyManager#getSimSpecificCarrierId()}
 | 
						|
     */
 | 
						|
    public CarrierIdentifier(@NonNull String mcc, @NonNull String mnc, @Nullable String spn,
 | 
						|
                             @Nullable String imsi, @Nullable String gid1, @Nullable String gid2,
 | 
						|
                             int carrierid, int specificCarrierId) {
 | 
						|
        mMcc = mcc;
 | 
						|
        mMnc = mnc;
 | 
						|
        mSpn = spn;
 | 
						|
        mImsi = imsi;
 | 
						|
        mGid1 = gid1;
 | 
						|
        mGid2 = gid2;
 | 
						|
        mCarrierId = carrierid;
 | 
						|
        mSpecificCarrierId = specificCarrierId;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 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);
 | 
						|
    }
 | 
						|
 | 
						|
    /** Get the mobile country code. */
 | 
						|
    public String getMcc() {
 | 
						|
        return mMcc;
 | 
						|
    }
 | 
						|
 | 
						|
    /** Get the mobile network code. */
 | 
						|
    public String getMnc() {
 | 
						|
        return mMnc;
 | 
						|
    }
 | 
						|
 | 
						|
    /** 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;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the carrier id.
 | 
						|
     * @see TelephonyManager#getSimCarrierId()
 | 
						|
     */
 | 
						|
    public int getCarrierId() {
 | 
						|
        return mCarrierId;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * A specific carrier ID returns the fine-grained carrier ID of the current subscription.
 | 
						|
     * It can represent the fact that a carrier may be in effect an aggregation of other carriers
 | 
						|
     * (ie in an MVNO type scenario) where each of these specific carriers which are used to make
 | 
						|
     * up the actual carrier service may have different carrier configurations.
 | 
						|
     * A specific carrier ID could also be used, for example, in a scenario where a carrier requires
 | 
						|
     * different carrier configuration for different service offering such as a prepaid plan.
 | 
						|
     *
 | 
						|
     * @see TelephonyManager#getSimSpecificCarrierId()
 | 
						|
     */
 | 
						|
    public int getSpecificCarrierId() {
 | 
						|
        return mSpecificCarrierId;
 | 
						|
    }
 | 
						|
 | 
						|
    @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)
 | 
						|
                && Objects.equals(mCarrierId, that.mCarrierId)
 | 
						|
                && Objects.equals(mSpecificCarrierId, that.mSpecificCarrierId);
 | 
						|
    }
 | 
						|
 | 
						|
    @Override
 | 
						|
    public int hashCode(){
 | 
						|
        return Objects.hash(mMcc, mMnc, mSpn, mImsi, mGid1, mGid2, mCarrierId, mSpecificCarrierId);
 | 
						|
    }
 | 
						|
 | 
						|
    @Override
 | 
						|
    public int describeContents() {
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
 | 
						|
    @Override
 | 
						|
    public void writeToParcel(Parcel out, int flags) {
 | 
						|
        out.writeString(mMcc);
 | 
						|
        out.writeString(mMnc);
 | 
						|
        out.writeString(mSpn);
 | 
						|
        out.writeString(mImsi);
 | 
						|
        out.writeString(mGid1);
 | 
						|
        out.writeString(mGid2);
 | 
						|
        out.writeInt(mCarrierId);
 | 
						|
        out.writeInt(mSpecificCarrierId);
 | 
						|
    }
 | 
						|
 | 
						|
    @Override
 | 
						|
    public String toString() {
 | 
						|
      return "CarrierIdentifier{"
 | 
						|
              + "mcc=" + mMcc
 | 
						|
              + ",mnc=" + mMnc
 | 
						|
              + ",spn=" + mSpn
 | 
						|
              + ",imsi=" + Rlog.pii(false, mImsi)
 | 
						|
              + ",gid1=" + mGid1
 | 
						|
              + ",gid2=" + mGid2
 | 
						|
              + ",carrierid=" + mCarrierId
 | 
						|
              + ",specificCarrierId=" + mSpecificCarrierId
 | 
						|
              + "}";
 | 
						|
    }
 | 
						|
 | 
						|
    /** @hide */
 | 
						|
    public void readFromParcel(Parcel in) {
 | 
						|
        mMcc = in.readString();
 | 
						|
        mMnc = in.readString();
 | 
						|
        mSpn = in.readString();
 | 
						|
        mImsi = in.readString();
 | 
						|
        mGid1 = in.readString();
 | 
						|
        mGid2 = in.readString();
 | 
						|
        mCarrierId = in.readInt();
 | 
						|
        mSpecificCarrierId = in.readInt();
 | 
						|
    }
 | 
						|
 | 
						|
    /** @hide */
 | 
						|
    public interface MatchType {
 | 
						|
        int ALL = 0;
 | 
						|
        int SPN = 1;
 | 
						|
        int IMSI_PREFIX = 2;
 | 
						|
        int GID1 = 3;
 | 
						|
        int GID2 = 4;
 | 
						|
    }
 | 
						|
}
 |