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.os.Parcel;
20 import android.os.Parcelable;
21 import android.telephony.Rlog;
22 
23 import java.util.Objects;
24 
25 /**
26  * CellIdentity is to represent a unique LTE cell
27  */
28 public final class CellIdentityLte implements Parcelable {
29 
30     private static final String LOG_TAG = "CellIdentityLte";
31     private static final boolean DBG = false;
32 
33     // 3-digit Mobile Country Code, 0..999
34     private final int mMcc;
35     // 2 or 3-digit Mobile Network Code, 0..999
36     private final int mMnc;
37     // 28-bit cell identity
38     private final int mCi;
39     // physical cell id 0..503
40     private final int mPci;
41     // 16-bit tracking area code
42     private final int mTac;
43     // 18-bit Absolute RF Channel Number
44     private final int mEarfcn;
45 
46     /**
47      * @hide
48      */
CellIdentityLte()49     public CellIdentityLte() {
50         mMcc = Integer.MAX_VALUE;
51         mMnc = Integer.MAX_VALUE;
52         mCi = Integer.MAX_VALUE;
53         mPci = Integer.MAX_VALUE;
54         mTac = Integer.MAX_VALUE;
55         mEarfcn = Integer.MAX_VALUE;
56     }
57 
58     /**
59      *
60      * @param mcc 3-digit Mobile Country Code, 0..999
61      * @param mnc 2 or 3-digit Mobile Network Code, 0..999
62      * @param ci 28-bit Cell Identity
63      * @param pci Physical Cell Id 0..503
64      * @param tac 16-bit Tracking Area Code
65      *
66      * @hide
67      */
CellIdentityLte(int mcc, int mnc, int ci, int pci, int tac)68     public CellIdentityLte (int mcc, int mnc, int ci, int pci, int tac) {
69         this(mcc, mnc, ci, pci, tac, Integer.MAX_VALUE);
70     }
71 
72     /**
73      *
74      * @param mcc 3-digit Mobile Country Code, 0..999
75      * @param mnc 2 or 3-digit Mobile Network Code, 0..999
76      * @param ci 28-bit Cell Identity
77      * @param pci Physical Cell Id 0..503
78      * @param tac 16-bit Tracking Area Code
79      * @param earfcn 18-bit LTE Absolute RF Channel Number
80      *
81      * @hide
82      */
CellIdentityLte(int mcc, int mnc, int ci, int pci, int tac, int earfcn)83     public CellIdentityLte (int mcc, int mnc, int ci, int pci, int tac, int earfcn) {
84         mMcc = mcc;
85         mMnc = mnc;
86         mCi = ci;
87         mPci = pci;
88         mTac = tac;
89         mEarfcn = earfcn;
90     }
91 
CellIdentityLte(CellIdentityLte cid)92     private CellIdentityLte(CellIdentityLte cid) {
93         mMcc = cid.mMcc;
94         mMnc = cid.mMnc;
95         mCi = cid.mCi;
96         mPci = cid.mPci;
97         mTac = cid.mTac;
98         mEarfcn = cid.mEarfcn;
99     }
100 
copy()101     CellIdentityLte copy() {
102         return new CellIdentityLte(this);
103     }
104 
105     /**
106      * @return 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown
107      */
getMcc()108     public int getMcc() {
109         return mMcc;
110     }
111 
112     /**
113      * @return 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown
114      */
getMnc()115     public int getMnc() {
116         return mMnc;
117     }
118 
119     /**
120      * @return 28-bit Cell Identity, Integer.MAX_VALUE if unknown
121      */
getCi()122     public int getCi() {
123         return mCi;
124     }
125 
126     /**
127      * @return Physical Cell Id 0..503, Integer.MAX_VALUE if unknown
128      */
getPci()129     public int getPci() {
130         return mPci;
131     }
132 
133     /**
134      * @return 16-bit Tracking Area Code, Integer.MAX_VALUE if unknown
135      */
getTac()136     public int getTac() {
137         return mTac;
138     }
139 
140     /**
141      * @return 18-bit Absolute RF Channel Number, Integer.MAX_VALUE if unknown
142      */
getEarfcn()143     public int getEarfcn() {
144         return mEarfcn;
145     }
146 
147     @Override
hashCode()148     public int hashCode() {
149         return Objects.hash(mMcc, mMnc, mCi, mPci, mTac);
150     }
151 
152     @Override
equals(Object other)153     public boolean equals(Object other) {
154         if (this == other) {
155             return true;
156         }
157 
158         if (!(other instanceof CellIdentityLte)) {
159             return false;
160         }
161 
162         CellIdentityLte o = (CellIdentityLte) other;
163         return mMcc == o.mMcc &&
164                 mMnc == o.mMnc &&
165                 mCi == o.mCi &&
166                 mPci == o.mPci &&
167                 mTac == o.mTac &&
168                 mEarfcn == o.mEarfcn;
169     }
170 
171     @Override
toString()172     public String toString() {
173         StringBuilder sb = new StringBuilder("CellIdentityLte:{");
174         sb.append(" mMcc="); sb.append(mMcc);
175         sb.append(" mMnc="); sb.append(mMnc);
176         sb.append(" mCi="); sb.append(mCi);
177         sb.append(" mPci="); sb.append(mPci);
178         sb.append(" mTac="); sb.append(mTac);
179         sb.append(" mEarfcn="); sb.append(mEarfcn);
180         sb.append("}");
181 
182         return sb.toString();
183     }
184 
185     /** Implement the Parcelable interface */
186     @Override
describeContents()187     public int describeContents() {
188         return 0;
189     }
190 
191     /** Implement the Parcelable interface */
192     @Override
writeToParcel(Parcel dest, int flags)193     public void writeToParcel(Parcel dest, int flags) {
194         if (DBG) log("writeToParcel(Parcel, int): " + toString());
195         dest.writeInt(mMcc);
196         dest.writeInt(mMnc);
197         dest.writeInt(mCi);
198         dest.writeInt(mPci);
199         dest.writeInt(mTac);
200         dest.writeInt(mEarfcn);
201     }
202 
203     /** Construct from Parcel, type has already been processed */
CellIdentityLte(Parcel in)204     private CellIdentityLte(Parcel in) {
205         mMcc = in.readInt();
206         mMnc = in.readInt();
207         mCi = in.readInt();
208         mPci = in.readInt();
209         mTac = in.readInt();
210         mEarfcn = in.readInt();
211         if (DBG) log("CellIdentityLte(Parcel): " + toString());
212     }
213 
214     /** Implement the Parcelable interface */
215     @SuppressWarnings("hiding")
216     public static final Creator<CellIdentityLte> CREATOR =
217             new Creator<CellIdentityLte>() {
218         @Override
219         public CellIdentityLte createFromParcel(Parcel in) {
220             return new CellIdentityLte(in);
221         }
222 
223         @Override
224         public CellIdentityLte[] newArray(int size) {
225             return new CellIdentityLte[size];
226         }
227     };
228 
229     /**
230      * log
231      */
log(String s)232     private static void log(String s) {
233         Rlog.w(LOG_TAG, s);
234     }
235 }
236