19a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri/**
29a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * Copyright (c) 2015, The Android Open Source Project
39a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri *
49a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * Licensed under the Apache License, Version 2.0 (the "License");
59a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * you may not use this file except in compliance with the License.
69a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * You may obtain a copy of the License at
79a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri *
89a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri *     http://www.apache.org/licenses/LICENSE-2.0
99a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri *
109a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * Unless required by applicable law or agreed to in writing, software
119a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * distributed under the License is distributed on an "AS IS" BASIS,
129a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * See the License for the specific language governing permissions and
149a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * limitations under the License.
159a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri */
169a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
179a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseripackage android.service.carrier;
189a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
19e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sunimport android.annotation.Nullable;
209a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseriimport android.os.Parcel;
219a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseriimport android.os.Parcelable;
229a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
23e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sunimport com.android.internal.telephony.uicc.IccUtils;
24e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun
25e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sunimport java.util.Objects;
26e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun
279a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri/**
289a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * Used to pass info to CarrierConfigService implementations so they can decide what values to
299a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri * return.
309a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri */
319a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseripublic class CarrierIdentifier implements Parcelable {
329a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
339a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    /** Used to create a {@link CarrierIdentifier} from a {@link Parcel}. */
349a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public static final Creator<CarrierIdentifier> CREATOR = new Creator<CarrierIdentifier>() {
359a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri            @Override
369a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        public CarrierIdentifier createFromParcel(Parcel parcel) {
379a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri            return new CarrierIdentifier(parcel);
389a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        }
399a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
409a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri            @Override
419a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        public CarrierIdentifier[] newArray(int i) {
429a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri            return new CarrierIdentifier[i];
439a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        }
449a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    };
459a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
469a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    private String mMcc;
479a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    private String mMnc;
48e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    private @Nullable String mSpn;
49e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    private @Nullable String mImsi;
50e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    private @Nullable String mGid1;
51e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    private @Nullable String mGid2;
529a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
53e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    public CarrierIdentifier(String mcc, String mnc, @Nullable String spn, @Nullable String imsi,
54e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun            @Nullable String gid1, @Nullable String gid2) {
559a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mMcc = mcc;
569a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mMnc = mnc;
579a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mSpn = spn;
589a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mImsi = imsi;
599a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mGid1 = gid1;
609a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mGid2 = gid2;
619a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
629a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
63e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    /**
64e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun     * Creates a carrier identifier instance.
65e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun     *
66e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun     * @param mccMnc A 3-byte array as defined by 3GPP TS 24.008.
67e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun     * @param gid1 The group identifier level 1.
68e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun     * @param gid2 The group identifier level 2.
69e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun     * @throws IllegalArgumentException If the length of {@code mccMnc} is not 3.
70e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun     */
71e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    public CarrierIdentifier(byte[] mccMnc, @Nullable String gid1, @Nullable String gid2) {
72e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        if (mccMnc.length != 3) {
73e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun            throw new IllegalArgumentException(
74e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun                    "MCC & MNC must be set by a 3-byte array: byte[" + mccMnc.length + "]");
75e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        }
76e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        String hex = IccUtils.bytesToHexString(mccMnc);
77e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        mMcc = new String(new char[] {hex.charAt(1), hex.charAt(0), hex.charAt(3)});
78e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        if (hex.charAt(2) == 'F') {
79e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun            mMnc = new String(new char[] {hex.charAt(5), hex.charAt(4)});
80e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        } else {
81e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun            mMnc = new String(new char[] {hex.charAt(5), hex.charAt(4), hex.charAt(2)});
82e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        }
83e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        mGid1 = gid1;
84e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        mGid2 = gid2;
85e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        mSpn = null;
86e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        mImsi = null;
87e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    }
88e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun
899a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    /** @hide */
909a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public CarrierIdentifier(Parcel parcel) {
919a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        readFromParcel(parcel);
929a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
939a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
949a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    /** Get the mobile country code. */
959a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public String getMcc() {
969a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        return mMcc;
979a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
989a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
999a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    /** Get the mobile network code. */
1009a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public String getMnc() {
1019a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        return mMnc;
1029a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
1039a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
1049a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    /** Get the service provider name. */
105e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    @Nullable
1069a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public String getSpn() {
1079a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        return mSpn;
1089a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
1099a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
1109a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    /** Get the international mobile subscriber identity. */
111e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    @Nullable
1129a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public String getImsi() {
1139a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        return mImsi;
1149a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
1159a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
1169a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    /** Get the group identifier level 1. */
117e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    @Nullable
1189a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public String getGid1() {
1199a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        return mGid1;
1209a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
1219a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
1229a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    /** Get the group identifier level 2. */
123e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    @Nullable
1249a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public String getGid2() {
1259a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        return mGid2;
1269a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
1279a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
1289a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    @Override
129e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    public boolean equals(Object obj) {
130e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        if (this == obj) {
131e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun            return true;
132e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        }
133e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        if (obj == null || getClass() != obj.getClass()) {
134e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun            return false;
135e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        }
136e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun
137e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        CarrierIdentifier that = (CarrierIdentifier) obj;
138e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        return Objects.equals(mMcc, that.mMcc)
139e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun                && Objects.equals(mMnc, that.mMnc)
140e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun                && Objects.equals(mSpn, that.mSpn)
141e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun                && Objects.equals(mImsi, that.mImsi)
142e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun                && Objects.equals(mGid1, that.mGid1)
143e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun                && Objects.equals(mGid2, that.mGid2);
144e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    }
145e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun
146e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    @Override
147e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    public int hashCode() {
148e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        int result = 1;
149e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        result = 31 * result + Objects.hashCode(mMcc);
150e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        result = 31 * result + Objects.hashCode(mMnc);
151e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        result = 31 * result + Objects.hashCode(mSpn);
152e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        result = 31 * result + Objects.hashCode(mImsi);
153e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        result = 31 * result + Objects.hashCode(mGid1);
154e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        result = 31 * result + Objects.hashCode(mGid2);
155e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun        return result;
156e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    }
157e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun
158e6153b9bff78de897cb6b52c9d605e0dc0fc929dHolly Jiuyu Sun    @Override
1599a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public int describeContents() {
1609a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        return 0;
1619a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
1629a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
1639a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    @Override
1649a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public void writeToParcel(Parcel out, int flags) {
1659a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        out.writeString(mMcc);
1669a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        out.writeString(mMnc);
1679a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        out.writeString(mSpn);
1689a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        out.writeString(mImsi);
1699a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        out.writeString(mGid1);
1709a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        out.writeString(mGid2);
1719a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
1729a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
173b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri    @Override
174b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri    public String toString() {
175b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri      return "CarrierIdentifier{"
176b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri          + "mcc=" + mMcc
177b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri          + ",mnc=" + mMnc
178b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri          + ",spn=" + mSpn
179b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri          + ",imsi=" + mImsi
180b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri          + ",gid1=" + mGid1
181b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri          + ",gid2=" + mGid2
182b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri          + "}";
183b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri    }
184b1a43484d5df60756332df705abe4724a56000e4Jonathan Basseri
1859a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    /** @hide */
1869a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    public void readFromParcel(Parcel in) {
1879a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mMcc = in.readString();
1889a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mMnc = in.readString();
1899a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mSpn = in.readString();
1909a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mImsi = in.readString();
1919a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mGid1 = in.readString();
1929a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        mGid2 = in.readString();
1939a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri    }
19464997623bfa04e80064b6056fab0fb23144acb44Meng Wang
19564997623bfa04e80064b6056fab0fb23144acb44Meng Wang    /** @hide */
19664997623bfa04e80064b6056fab0fb23144acb44Meng Wang    public interface MatchType {
19764997623bfa04e80064b6056fab0fb23144acb44Meng Wang        int ALL = 0;
19864997623bfa04e80064b6056fab0fb23144acb44Meng Wang        int SPN = 1;
19964997623bfa04e80064b6056fab0fb23144acb44Meng Wang        int IMSI_PREFIX = 2;
20064997623bfa04e80064b6056fab0fb23144acb44Meng Wang        int GID1 = 3;
20164997623bfa04e80064b6056fab0fb23144acb44Meng Wang        int GID2 = 4;
20264997623bfa04e80064b6056fab0fb23144acb44Meng Wang    }
2039a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri}
204