• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 to represent a unique GSM cell
27  */
28 public final class CellIdentityGsm extends CellIdentity {
29     private static final String TAG = CellIdentityGsm.class.getSimpleName();
30     private static final boolean DBG = false;
31 
32     // 16-bit Location Area Code, 0..65535
33     private final int mLac;
34     // 16-bit GSM Cell Identity described in TS 27.007, 0..65535
35     private final int mCid;
36     // 16-bit GSM Absolute RF Channel Number
37     private final int mArfcn;
38     // 6-bit Base Station Identity Code
39     private final int mBsic;
40 
41     /**
42      * @hide
43      */
CellIdentityGsm()44     public CellIdentityGsm() {
45         super(TAG, TYPE_GSM, null, null, null, null);
46         mLac = Integer.MAX_VALUE;
47         mCid = Integer.MAX_VALUE;
48         mArfcn = Integer.MAX_VALUE;
49         mBsic = Integer.MAX_VALUE;
50     }
51     /**
52      * public constructor
53      * @param mcc 3-digit Mobile Country Code, 0..999
54      * @param mnc 2 or 3-digit Mobile Network Code, 0..999
55      * @param lac 16-bit Location Area Code, 0..65535
56      * @param cid 16-bit GSM Cell Identity or 28-bit UMTS Cell Identity
57      *
58      * @hide
59      */
CellIdentityGsm(int mcc, int mnc, int lac, int cid)60     public CellIdentityGsm(int mcc, int mnc, int lac, int cid) {
61         this(lac, cid, Integer.MAX_VALUE, Integer.MAX_VALUE,
62                 String.valueOf(mcc), String.valueOf(mnc), null, null);
63     }
64 
65     /**
66      * public constructor
67      * @param mcc 3-digit Mobile Country Code, 0..999
68      * @param mnc 2 or 3-digit Mobile Network Code, 0..999
69      * @param lac 16-bit Location Area Code, 0..65535
70      * @param cid 16-bit GSM Cell Identity or 28-bit UMTS Cell Identity
71      * @param arfcn 16-bit GSM Absolute RF Channel Number
72      * @param bsic 6-bit Base Station Identity Code
73      *
74      * @hide
75      */
CellIdentityGsm(int mcc, int mnc, int lac, int cid, int arfcn, int bsic)76     public CellIdentityGsm(int mcc, int mnc, int lac, int cid, int arfcn, int bsic) {
77         this(lac, cid, arfcn, bsic, String.valueOf(mcc), String.valueOf(mnc), null, null);
78     }
79 
80     /**
81      * public constructor
82      * @param lac 16-bit Location Area Code, 0..65535
83      * @param cid 16-bit GSM Cell Identity or 28-bit UMTS Cell Identity
84      * @param arfcn 16-bit GSM Absolute RF Channel Number
85      * @param bsic 6-bit Base Station Identity Code
86      * @param mccStr 3-digit Mobile Country Code in string format
87      * @param mncStr 2 or 3-digit Mobile Network Code in string format
88      * @param alphal long alpha Operator Name String or Enhanced Operator Name String
89      * @param alphas short alpha Operator Name String or Enhanced Operator Name String
90      *
91      * @hide
92      */
CellIdentityGsm(int lac, int cid, int arfcn, int bsic, String mccStr, String mncStr, String alphal, String alphas)93     public CellIdentityGsm(int lac, int cid, int arfcn, int bsic, String mccStr,
94                             String mncStr, String alphal, String alphas) {
95         super(TAG, TYPE_GSM, mccStr, mncStr, alphal, alphas);
96         mLac = lac;
97         mCid = cid;
98         mArfcn = arfcn;
99         // In RIL BSIC is a UINT8, so 0xFF is the 'INVALID' designator
100         // for inbound parcels
101         mBsic = (bsic == 0xFF) ? Integer.MAX_VALUE : bsic;
102     }
103 
CellIdentityGsm(CellIdentityGsm cid)104     private CellIdentityGsm(CellIdentityGsm cid) {
105         this(cid.mLac, cid.mCid, cid.mArfcn, cid.mBsic, cid.mMccStr,
106                 cid.mMncStr, cid.mAlphaLong, cid.mAlphaShort);
107     }
108 
copy()109     CellIdentityGsm copy() {
110         return new CellIdentityGsm(this);
111     }
112 
113     /**
114      * @return 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown
115      * @deprecated Use {@link #getMccString} instead.
116      */
117     @Deprecated
getMcc()118     public int getMcc() {
119         return (mMccStr != null) ? Integer.valueOf(mMccStr) : Integer.MAX_VALUE;
120     }
121 
122     /**
123      * @return 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown
124      * @deprecated Use {@link #getMncString} instead.
125      */
126     @Deprecated
getMnc()127     public int getMnc() {
128         return (mMncStr != null) ? Integer.valueOf(mMncStr) : Integer.MAX_VALUE;
129     }
130 
131     /**
132      * @return 16-bit Location Area Code, 0..65535, Integer.MAX_VALUE if unknown
133      */
getLac()134     public int getLac() {
135         return mLac;
136     }
137 
138     /**
139      * @return CID
140      * Either 16-bit GSM Cell Identity described
141      * in TS 27.007, 0..65535, Integer.MAX_VALUE if unknown
142      */
getCid()143     public int getCid() {
144         return mCid;
145     }
146 
147     /**
148      * @return 16-bit GSM Absolute RF Channel Number, Integer.MAX_VALUE if unknown
149      */
getArfcn()150     public int getArfcn() {
151         return mArfcn;
152     }
153 
154     /**
155      * @return 6-bit Base Station Identity Code, Integer.MAX_VALUE if unknown
156      */
getBsic()157     public int getBsic() {
158         return mBsic;
159     }
160 
161     /**
162      * @return a 5 or 6 character string (MCC+MNC), null if any field is unknown
163      */
getMobileNetworkOperator()164     public String getMobileNetworkOperator() {
165         return (mMccStr == null || mMncStr == null) ? null : mMccStr + mMncStr;
166     }
167 
168     /**
169      * @return Mobile Country Code in string format, null if unknown
170      */
getMccString()171     public String getMccString() {
172         return mMccStr;
173     }
174 
175     /**
176      * @return Mobile Network Code in string format, null if unknown
177      */
getMncString()178     public String getMncString() {
179         return mMncStr;
180     }
181 
182     /** @hide */
183     @Override
getChannelNumber()184     public int getChannelNumber() {
185         return mArfcn;
186     }
187 
188     /**
189      * @deprecated Primary Scrambling Code is not applicable to GSM.
190      * @return Integer.MAX_VALUE, undefined for GSM
191      */
192     @Deprecated
getPsc()193     public int getPsc() {
194         return Integer.MAX_VALUE;
195     }
196 
197     @Override
hashCode()198     public int hashCode() {
199         return Objects.hash(mLac, mCid, super.hashCode());
200     }
201 
202     @Override
equals(Object other)203     public boolean equals(Object other) {
204         if (this == other) {
205             return true;
206         }
207 
208         if (!(other instanceof CellIdentityGsm)) {
209             return false;
210         }
211 
212         CellIdentityGsm o = (CellIdentityGsm) other;
213         return mLac == o.mLac
214                 && mCid == o.mCid
215                 && mArfcn == o.mArfcn
216                 && mBsic == o.mBsic
217                 && TextUtils.equals(mMccStr, o.mMccStr)
218                 && TextUtils.equals(mMncStr, o.mMncStr)
219                 && super.equals(other);
220     }
221 
222     @Override
toString()223     public String toString() {
224         return new StringBuilder(TAG)
225         .append(":{ mLac=").append(mLac)
226         .append(" mCid=").append(mCid)
227         .append(" mArfcn=").append(mArfcn)
228         .append(" mBsic=").append("0x").append(Integer.toHexString(mBsic))
229         .append(" mMcc=").append(mMccStr)
230         .append(" mMnc=").append(mMncStr)
231         .append(" mAlphaLong=").append(mAlphaLong)
232         .append(" mAlphaShort=").append(mAlphaShort)
233         .append("}").toString();
234     }
235 
236     /** Implement the Parcelable interface */
237     @Override
writeToParcel(Parcel dest, int flags)238     public void writeToParcel(Parcel dest, int flags) {
239         if (DBG) log("writeToParcel(Parcel, int): " + toString());
240         super.writeToParcel(dest, TYPE_GSM);
241         dest.writeInt(mLac);
242         dest.writeInt(mCid);
243         dest.writeInt(mArfcn);
244         dest.writeInt(mBsic);
245     }
246 
247     /** Construct from Parcel, type has already been processed */
CellIdentityGsm(Parcel in)248     private CellIdentityGsm(Parcel in) {
249         super(TAG, TYPE_GSM, in);
250         mLac = in.readInt();
251         mCid = in.readInt();
252         mArfcn = in.readInt();
253         mBsic = in.readInt();
254 
255         if (DBG) log(toString());
256     }
257 
258     /** Implement the Parcelable interface */
259     @SuppressWarnings("hiding")
260     public static final Creator<CellIdentityGsm> CREATOR =
261             new Creator<CellIdentityGsm>() {
262                 @Override
263                 public CellIdentityGsm createFromParcel(Parcel in) {
264                     in.readInt();   // skip
265                     return createFromParcelBody(in);
266                 }
267 
268                 @Override
269                 public CellIdentityGsm[] newArray(int size) {
270                     return new CellIdentityGsm[size];
271                 }
272             };
273 
274     /** @hide */
createFromParcelBody(Parcel in)275     protected static CellIdentityGsm createFromParcelBody(Parcel in) {
276         return new CellIdentityGsm(in);
277     }
278 }
279