1/*
2 * Copyright 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.telephony;
18
19import android.annotation.Nullable;
20import android.os.Parcel;
21import android.text.TextUtils;
22
23import java.util.Objects;
24
25/**
26 * CellIdentity is to represent a unique TD-SCDMA cell
27 */
28public final class CellIdentityTdscdma extends CellIdentity {
29    private static final String TAG = CellIdentityTdscdma.class.getSimpleName();
30    private static final boolean DBG = false;
31
32    // 16-bit Location Area Code, 0..65535, INT_MAX if unknown.
33    private final int mLac;
34    // 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown.
35    private final int mCid;
36    // 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown.
37    private final int mCpid;
38
39    /**
40     * @hide
41     */
42    public CellIdentityTdscdma() {
43        super(TAG, TYPE_TDSCDMA, null, null, null, null);
44        mLac = Integer.MAX_VALUE;
45        mCid = Integer.MAX_VALUE;
46        mCpid = Integer.MAX_VALUE;
47    }
48
49    /**
50     * @param mcc 3-digit Mobile Country Code, 0..999
51     * @param mnc 2 or 3-digit Mobile Network Code, 0..999
52     * @param lac 16-bit Location Area Code, 0..65535, INT_MAX if unknown
53     * @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
54     * @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
55     *
56     * @hide
57     */
58    public CellIdentityTdscdma(int mcc, int mnc, int lac, int cid, int cpid) {
59        this(String.valueOf(mcc), String.valueOf(mnc), lac, cid, cpid, null, null);
60    }
61
62    /**
63     * @param mcc 3-digit Mobile Country Code in string format
64     * @param mnc 2 or 3-digit Mobile Network Code in string format
65     * @param lac 16-bit Location Area Code, 0..65535, INT_MAX if unknown
66     * @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
67     * @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
68     *
69     * FIXME: This is a temporary constructor to facilitate migration.
70     * @hide
71     */
72    public CellIdentityTdscdma(String mcc, String mnc, int lac, int cid, int cpid) {
73        super(TAG, TYPE_TDSCDMA, mcc, mnc, null, null);
74        mLac = lac;
75        mCid = cid;
76        mCpid = cpid;
77    }
78
79    /**
80     * @param mcc 3-digit Mobile Country Code in string format
81     * @param mnc 2 or 3-digit Mobile Network Code in string format
82     * @param lac 16-bit Location Area Code, 0..65535, INT_MAX if unknown
83     * @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
84     * @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
85     * @param alphal long alpha Operator Name String or Enhanced Operator Name String
86     * @param alphas short alpha Operator Name String or Enhanced Operator Name String
87     *
88     * @hide
89     */
90    public CellIdentityTdscdma(String mcc, String mnc, int lac, int cid, int cpid,
91            String alphal, String alphas) {
92        super(TAG, TYPE_TDSCDMA, mcc, mnc, alphal, alphas);
93        mLac = lac;
94        mCid = cid;
95        mCpid = cpid;
96    }
97
98    private CellIdentityTdscdma(CellIdentityTdscdma cid) {
99        this(cid.mMccStr, cid.mMncStr, cid.mLac, cid.mCid,
100                cid.mCpid, cid.mAlphaLong, cid.mAlphaShort);
101    }
102
103    CellIdentityTdscdma copy() {
104        return new CellIdentityTdscdma(this);
105    }
106
107    /**
108     * Get Mobile Country Code in string format
109     * @return Mobile Country Code in string format, null if unknown
110     */
111    public String getMccString() {
112        return mMccStr;
113    }
114
115    /**
116     * Get Mobile Network Code in string format
117     * @return Mobile Network Code in string format, null if unknown
118     */
119    public String getMncString() {
120        return mMncStr;
121    }
122
123    /**
124     * @return 16-bit Location Area Code, 0..65535, INT_MAX if unknown
125     */
126    public int getLac() {
127        return mLac;
128    }
129
130    /**
131     * @return 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
132     */
133    public int getCid() {
134        return mCid;
135    }
136
137    /**
138     * @return 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
139     */
140    public int getCpid() {
141        return mCpid;
142    }
143
144    @Override
145    public int hashCode() {
146        return Objects.hash(mLac, mCid, mCpid, super.hashCode());
147    }
148
149    @Override
150    public boolean equals(Object other) {
151        if (this == other) {
152            return true;
153        }
154
155        if (!(other instanceof CellIdentityTdscdma)) {
156            return false;
157        }
158
159        CellIdentityTdscdma o = (CellIdentityTdscdma) other;
160        return TextUtils.equals(mMccStr, o.mMccStr)
161                && TextUtils.equals(mMncStr, o.mMncStr)
162                && mLac == o.mLac
163                && mCid == o.mCid
164                && mCpid == o.mCpid
165                && super.equals(other);
166    }
167
168    @Override
169    public String toString() {
170        return new StringBuilder(TAG)
171        .append(":{ mMcc=").append(mMccStr)
172        .append(" mMnc=").append(mMncStr)
173        .append(" mLac=").append(mLac)
174        .append(" mCid=").append(mCid)
175        .append(" mCpid=").append(mCpid)
176        .append(" mAlphaLong=").append(mAlphaLong)
177        .append(" mAlphaShort=").append(mAlphaShort)
178        .append("}").toString();
179    }
180
181    /** Implement the Parcelable interface */
182    @Override
183    public void writeToParcel(Parcel dest, int flags) {
184        if (DBG) log("writeToParcel(Parcel, int): " + toString());
185        super.writeToParcel(dest, TYPE_TDSCDMA);
186        dest.writeInt(mLac);
187        dest.writeInt(mCid);
188        dest.writeInt(mCpid);
189    }
190
191    /** Construct from Parcel, type has already been processed */
192    private CellIdentityTdscdma(Parcel in) {
193        super(TAG, TYPE_TDSCDMA, in);
194        mLac = in.readInt();
195        mCid = in.readInt();
196        mCpid = in.readInt();
197
198        if (DBG) log(toString());
199    }
200
201    /** Implement the Parcelable interface */
202    @SuppressWarnings("hiding")
203    public static final Creator<CellIdentityTdscdma> CREATOR =
204            new Creator<CellIdentityTdscdma>() {
205                @Override
206                public CellIdentityTdscdma createFromParcel(Parcel in) {
207                    in.readInt();   // skip
208                    return createFromParcelBody(in);
209                }
210
211                @Override
212                public CellIdentityTdscdma[] newArray(int size) {
213                    return new CellIdentityTdscdma[size];
214                }
215            };
216
217    /** @hide */
218    protected static CellIdentityTdscdma createFromParcelBody(Parcel in) {
219        return new CellIdentityTdscdma(in);
220    }
221}
222