1 /*
2  * Copyright (C) 2012 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 
17 package android.telephony;
18 
19 import android.annotation.Nullable;
20 import android.os.Parcel;
21 import android.text.TextUtils;
22 
23 import java.util.Objects;
24 
25 /**
26  * CellIdentity is to represent a unique LTE cell
27  */
28 public final class CellIdentityLte extends CellIdentity {
29     private static final String TAG = CellIdentityLte.class.getSimpleName();
30     private static final boolean DBG = false;
31 
32     // 28-bit cell identity
33     private final int mCi;
34     // physical cell id 0..503
35     private final int mPci;
36     // 16-bit tracking area code
37     private final int mTac;
38     // 18-bit Absolute RF Channel Number
39     private final int mEarfcn;
40     // cell bandwidth, in kHz
41     private final int mBandwidth;
42 
43     /**
44      * @hide
45      */
CellIdentityLte()46     public CellIdentityLte() {
47         super(TAG, TYPE_LTE, null, null, null, null);
48         mCi = Integer.MAX_VALUE;
49         mPci = Integer.MAX_VALUE;
50         mTac = Integer.MAX_VALUE;
51         mEarfcn = Integer.MAX_VALUE;
52         mBandwidth = Integer.MAX_VALUE;
53     }
54 
55     /**
56      *
57      * @param mcc 3-digit Mobile Country Code, 0..999
58      * @param mnc 2 or 3-digit Mobile Network Code, 0..999
59      * @param ci 28-bit Cell Identity
60      * @param pci Physical Cell Id 0..503
61      * @param tac 16-bit Tracking Area Code
62      *
63      * @hide
64      */
CellIdentityLte(int mcc, int mnc, int ci, int pci, int tac)65     public CellIdentityLte(int mcc, int mnc, int ci, int pci, int tac) {
66         this(ci, pci, tac, Integer.MAX_VALUE, Integer.MAX_VALUE, String.valueOf(mcc),
67                 String.valueOf(mnc), null, null);
68     }
69 
70     /**
71      *
72      * @param mcc 3-digit Mobile Country Code, 0..999
73      * @param mnc 2 or 3-digit Mobile Network Code, 0..999
74      * @param ci 28-bit Cell Identity
75      * @param pci Physical Cell Id 0..503
76      * @param tac 16-bit Tracking Area Code
77      * @param earfcn 18-bit LTE Absolute RF Channel Number
78      *
79      * @hide
80      */
CellIdentityLte(int mcc, int mnc, int ci, int pci, int tac, int earfcn)81     public CellIdentityLte(int mcc, int mnc, int ci, int pci, int tac, int earfcn) {
82         this(ci, pci, tac, earfcn, Integer.MAX_VALUE, String.valueOf(mcc), String.valueOf(mnc),
83                 null, null);
84     }
85 
86     /**
87      *
88      * @param ci 28-bit Cell Identity
89      * @param pci Physical Cell Id 0..503
90      * @param tac 16-bit Tracking Area Code
91      * @param earfcn 18-bit LTE Absolute RF Channel Number
92      * @param bandwidth cell bandwidth in kHz
93      * @param mccStr 3-digit Mobile Country Code in string format
94      * @param mncStr 2 or 3-digit Mobile Network Code in string format
95      * @param alphal long alpha Operator Name String or Enhanced Operator Name String
96      * @param alphas short alpha Operator Name String or Enhanced Operator Name String
97      *
98      * @hide
99      */
CellIdentityLte(int ci, int pci, int tac, int earfcn, int bandwidth, String mccStr, String mncStr, String alphal, String alphas)100     public CellIdentityLte(int ci, int pci, int tac, int earfcn, int bandwidth, String mccStr,
101             String mncStr, String alphal, String alphas) {
102         super(TAG, TYPE_LTE, mccStr, mncStr, alphal, alphas);
103         mCi = ci;
104         mPci = pci;
105         mTac = tac;
106         mEarfcn = earfcn;
107         mBandwidth = bandwidth;
108     }
109 
CellIdentityLte(CellIdentityLte cid)110     private CellIdentityLte(CellIdentityLte cid) {
111         this(cid.mCi, cid.mPci, cid.mTac, cid.mEarfcn, cid.mBandwidth, cid.mMccStr,
112                 cid.mMncStr, cid.mAlphaLong, cid.mAlphaShort);
113     }
114 
copy()115     CellIdentityLte copy() {
116         return new CellIdentityLte(this);
117     }
118 
119     /**
120      * @return 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown
121      * @deprecated Use {@link #getMccString} instead.
122      */
123     @Deprecated
getMcc()124     public int getMcc() {
125         return (mMccStr != null) ? Integer.valueOf(mMccStr) : Integer.MAX_VALUE;
126     }
127 
128     /**
129      * @return 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown
130      * @deprecated Use {@link #getMncString} instead.
131      */
132     @Deprecated
getMnc()133     public int getMnc() {
134         return (mMncStr != null) ? Integer.valueOf(mMncStr) : Integer.MAX_VALUE;
135     }
136 
137     /**
138      * @return 28-bit Cell Identity, Integer.MAX_VALUE if unknown
139      */
getCi()140     public int getCi() {
141         return mCi;
142     }
143 
144     /**
145      * @return Physical Cell Id 0..503, Integer.MAX_VALUE if unknown
146      */
getPci()147     public int getPci() {
148         return mPci;
149     }
150 
151     /**
152      * @return 16-bit Tracking Area Code, Integer.MAX_VALUE if unknown
153      */
getTac()154     public int getTac() {
155         return mTac;
156     }
157 
158     /**
159      * @return 18-bit Absolute RF Channel Number, Integer.MAX_VALUE if unknown
160      */
getEarfcn()161     public int getEarfcn() {
162         return mEarfcn;
163     }
164 
165     /**
166      * @return Cell bandwidth in kHz, Integer.MAX_VALUE if unknown
167      */
getBandwidth()168     public int getBandwidth() {
169         return mBandwidth;
170     }
171 
172     /**
173      * @return Mobile Country Code in string format, null if unknown
174      */
getMccString()175     public String getMccString() {
176         return mMccStr;
177     }
178 
179     /**
180      * @return Mobile Network Code in string format, null if unknown
181      */
getMncString()182     public String getMncString() {
183         return mMncStr;
184     }
185 
186     /**
187      * @return a 5 or 6 character string (MCC+MNC), null if any field is unknown
188      */
getMobileNetworkOperator()189     public String getMobileNetworkOperator() {
190         return (mMccStr == null || mMncStr == null) ? null : mMccStr + mMncStr;
191     }
192 
193     /** @hide */
194     @Override
getChannelNumber()195     public int getChannelNumber() {
196         return mEarfcn;
197     }
198 
199     @Override
hashCode()200     public int hashCode() {
201         return Objects.hash(mCi, mPci, mTac, super.hashCode());
202     }
203 
204     @Override
equals(Object other)205     public boolean equals(Object other) {
206         if (this == other) {
207             return true;
208         }
209 
210         if (!(other instanceof CellIdentityLte)) {
211             return false;
212         }
213 
214         CellIdentityLte o = (CellIdentityLte) other;
215         return mCi == o.mCi
216                 && mPci == o.mPci
217                 && mTac == o.mTac
218                 && mEarfcn == o.mEarfcn
219                 && mBandwidth == o.mBandwidth
220                 && TextUtils.equals(mMccStr, o.mMccStr)
221                 && TextUtils.equals(mMncStr, o.mMncStr)
222                 && super.equals(other);
223     }
224 
225     @Override
toString()226     public String toString() {
227         return new StringBuilder(TAG)
228         .append(":{ mCi=").append(mCi)
229         .append(" mPci=").append(mPci)
230         .append(" mTac=").append(mTac)
231         .append(" mEarfcn=").append(mEarfcn)
232         .append(" mBandwidth=").append(mBandwidth)
233         .append(" mMcc=").append(mMccStr)
234         .append(" mMnc=").append(mMncStr)
235         .append(" mAlphaLong=").append(mAlphaLong)
236         .append(" mAlphaShort=").append(mAlphaShort)
237         .append("}").toString();
238     }
239 
240     /** Implement the Parcelable interface */
241     @Override
writeToParcel(Parcel dest, int flags)242     public void writeToParcel(Parcel dest, int flags) {
243         if (DBG) log("writeToParcel(Parcel, int): " + toString());
244         super.writeToParcel(dest, TYPE_LTE);
245         dest.writeInt(mCi);
246         dest.writeInt(mPci);
247         dest.writeInt(mTac);
248         dest.writeInt(mEarfcn);
249         dest.writeInt(mBandwidth);
250     }
251 
252     /** Construct from Parcel, type has already been processed */
CellIdentityLte(Parcel in)253     private CellIdentityLte(Parcel in) {
254         super(TAG, TYPE_LTE, in);
255         mCi = in.readInt();
256         mPci = in.readInt();
257         mTac = in.readInt();
258         mEarfcn = in.readInt();
259         mBandwidth = in.readInt();
260 
261         if (DBG) log(toString());
262     }
263 
264     /** Implement the Parcelable interface */
265     @SuppressWarnings("hiding")
266     public static final Creator<CellIdentityLte> CREATOR =
267             new Creator<CellIdentityLte>() {
268                 @Override
269                 public CellIdentityLte createFromParcel(Parcel in) {
270                     in.readInt();   // skip;
271                     return createFromParcelBody(in);
272                 }
273 
274                 @Override
275                 public CellIdentityLte[] newArray(int size) {
276                     return new CellIdentityLte[size];
277                 }
278             };
279 
280     /** @hide */
createFromParcelBody(Parcel in)281     protected static CellIdentityLte createFromParcelBody(Parcel in) {
282         return new CellIdentityLte(in);
283     }
284 }
285