1963db55d59a170f4b17ff907c96615a19ef6fe17John Wang/*
2b208a24cf521401912cfce16fce550a995cf1250Wink Saville * Copyright (C) 2012 The Android Open Source Project
3963db55d59a170f4b17ff907c96615a19ef6fe17John Wang *
4963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * Licensed under the Apache License, Version 2.0 (the "License");
5963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * you may not use this file except in compliance with the License.
6963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * You may obtain a copy of the License at
7963db55d59a170f4b17ff907c96615a19ef6fe17John Wang *
8963db55d59a170f4b17ff907c96615a19ef6fe17John Wang *      http://www.apache.org/licenses/LICENSE-2.0
9963db55d59a170f4b17ff907c96615a19ef6fe17John Wang *
10963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * Unless required by applicable law or agreed to in writing, software
11963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * distributed under the License is distributed on an "AS IS" BASIS,
12963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * See the License for the specific language governing permissions and
14963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * limitations under the License.
15963db55d59a170f4b17ff907c96615a19ef6fe17John Wang */
16963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
17963db55d59a170f4b17ff907c96615a19ef6fe17John Wangpackage android.telephony;
18963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
19963db55d59a170f4b17ff907c96615a19ef6fe17John Wangimport android.os.Parcel;
20963db55d59a170f4b17ff907c96615a19ef6fe17John Wangimport android.os.Parcelable;
21b208a24cf521401912cfce16fce550a995cf1250Wink Savilleimport android.util.Log;
22963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
23963db55d59a170f4b17ff907c96615a19ef6fe17John Wang/**
24963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * CellIdentity to represent a unique GSM or UMTS cell
25963db55d59a170f4b17ff907c96615a19ef6fe17John Wang */
26c6e4917adda19beb780386bcc26b652748b8ab13Wink Savillepublic final class CellIdentityGsm implements Parcelable {
27b208a24cf521401912cfce16fce550a995cf1250Wink Saville
28b208a24cf521401912cfce16fce550a995cf1250Wink Saville    private static final String LOG_TAG = "CellIdentityGsm";
29b208a24cf521401912cfce16fce550a995cf1250Wink Saville    private static final boolean DBG = false;
30963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
31963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    // 3-digit Mobile Country Code, 0..999
32963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    private final int mMcc;
33963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    // 2 or 3-digit Mobile Network Code, 0..999
34963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    private final int mMnc;
35963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    // 16-bit Location Area Code, 0..65535
36963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    private final int mLac;
37963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    // 16-bit GSM Cell Identity described in TS 27.007, 0..65535
38963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    // 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455
39963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    private final int mCid;
40963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    // 9-bit UMTS Primary Scrambling Code described in TS 25.331, 0..511
41963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    private final int mPsc;
42963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
43963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
44b208a24cf521401912cfce16fce550a995cf1250Wink Saville     * @hide
45b208a24cf521401912cfce16fce550a995cf1250Wink Saville     */
46b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public CellIdentityGsm() {
47b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mMcc = Integer.MAX_VALUE;
48b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mMnc = Integer.MAX_VALUE;
49b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mLac = Integer.MAX_VALUE;
50b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mCid = Integer.MAX_VALUE;
51b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mPsc = Integer.MAX_VALUE;
52b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
53b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /**
54963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * public constructor
55963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @param mcc 3-digit Mobile Country Code, 0..999
56963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @param mnc 2 or 3-digit Mobile Network Code, 0..999
57963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @param lac 16-bit Location Area Code, 0..65535
58963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @param cid 16-bit GSM Cell Identity or 28-bit UMTS Cell Identity
59963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @param psc 9-bit UMTS Primary Scrambling Code
60b208a24cf521401912cfce16fce550a995cf1250Wink Saville     *
61b208a24cf521401912cfce16fce550a995cf1250Wink Saville     * @hide
62963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
63b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public CellIdentityGsm (int mcc, int mnc, int lac, int cid, int psc) {
64963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mMcc = mcc;
65963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mMnc = mnc;
66963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mLac = lac;
67963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mCid = cid;
68963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mPsc = psc;
69963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
70963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
71b208a24cf521401912cfce16fce550a995cf1250Wink Saville    private CellIdentityGsm(CellIdentityGsm cid) {
72963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mMcc = cid.mMcc;
73963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mMnc = cid.mMnc;
74963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mLac = cid.mLac;
75963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mCid = cid.mCid;
76963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mPsc = cid.mPsc;
77963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
78963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
79b208a24cf521401912cfce16fce550a995cf1250Wink Saville    CellIdentityGsm copy() {
80b208a24cf521401912cfce16fce550a995cf1250Wink Saville       return new CellIdentityGsm(this);
81b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
82b208a24cf521401912cfce16fce550a995cf1250Wink Saville
83963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
84963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @return 3-digit Mobile Country Code, 0..999
85963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
86963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int getMcc() {
87963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return mMcc;
88963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
89963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
90963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
91963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @return 2 or 3-digit Mobile Network Code, 0..999
92963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
93963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int getMnc() {
94963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return mMnc;
95963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
96963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
97963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
98963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @return 16-bit Location Area Code, 0..65535
99963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
100963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int getLac() {
101963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return mLac;
102963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
103963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
104963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
105963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @return CID
106963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * Either 16-bit GSM Cell Identity described
107963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * in TS 27.007, 0..65535
108963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * or 28-bit UMTS Cell Identity described
109963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * in TS 25.331, 0..268435455
110963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
111963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int getCid() {
112963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return mCid;
113963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
114963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
115963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
116963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @return 9-bit UMTS Primary Scrambling Code described in
117963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * TS 25.331, 0..511
118963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
119963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int getPsc() {
120963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return mPsc;
121963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
122963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
123b208a24cf521401912cfce16fce550a995cf1250Wink Saville    @Override
124b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public int hashCode() {
125b208a24cf521401912cfce16fce550a995cf1250Wink Saville        int primeNum = 31;
126b208a24cf521401912cfce16fce550a995cf1250Wink Saville        return (mMcc * primeNum) + (mMnc * primeNum) + (mLac * primeNum) + (mCid * primeNum) +
127b208a24cf521401912cfce16fce550a995cf1250Wink Saville                (mPsc * primeNum);
128b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
129b208a24cf521401912cfce16fce550a995cf1250Wink Saville
130b208a24cf521401912cfce16fce550a995cf1250Wink Saville    @Override
131b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public boolean equals(Object other) {
132b208a24cf521401912cfce16fce550a995cf1250Wink Saville        if (super.equals(other)) {
133b208a24cf521401912cfce16fce550a995cf1250Wink Saville            try {
134b208a24cf521401912cfce16fce550a995cf1250Wink Saville                CellIdentityGsm o = (CellIdentityGsm)other;
135b208a24cf521401912cfce16fce550a995cf1250Wink Saville                return mMcc == o.mMcc &&
136b208a24cf521401912cfce16fce550a995cf1250Wink Saville                        mMnc == o.mMnc &&
137b208a24cf521401912cfce16fce550a995cf1250Wink Saville                        mLac == o.mLac &&
138b208a24cf521401912cfce16fce550a995cf1250Wink Saville                        mCid == o.mCid &&
139b208a24cf521401912cfce16fce550a995cf1250Wink Saville                        mPsc == o.mPsc;
140b208a24cf521401912cfce16fce550a995cf1250Wink Saville            } catch (ClassCastException e) {
141b208a24cf521401912cfce16fce550a995cf1250Wink Saville                return false;
142b208a24cf521401912cfce16fce550a995cf1250Wink Saville            }
143b208a24cf521401912cfce16fce550a995cf1250Wink Saville        } else {
144b208a24cf521401912cfce16fce550a995cf1250Wink Saville            return false;
145b208a24cf521401912cfce16fce550a995cf1250Wink Saville        }
146b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
147b208a24cf521401912cfce16fce550a995cf1250Wink Saville
148b208a24cf521401912cfce16fce550a995cf1250Wink Saville    @Override
149b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public String toString() {
150b208a24cf521401912cfce16fce550a995cf1250Wink Saville        StringBuilder sb = new StringBuilder("GsmCellIdentitiy:");
151b208a24cf521401912cfce16fce550a995cf1250Wink Saville        sb.append(super.toString());
152b208a24cf521401912cfce16fce550a995cf1250Wink Saville        sb.append(" mMcc=").append(mMcc);
153b208a24cf521401912cfce16fce550a995cf1250Wink Saville        sb.append(" mMnc=").append(mMcc);
154b208a24cf521401912cfce16fce550a995cf1250Wink Saville        sb.append(" mLac=").append(mLac);
155b208a24cf521401912cfce16fce550a995cf1250Wink Saville        sb.append(" mCid=").append(mCid);
156b208a24cf521401912cfce16fce550a995cf1250Wink Saville        sb.append(" mPsc=").append(mPsc);
157b208a24cf521401912cfce16fce550a995cf1250Wink Saville
158b208a24cf521401912cfce16fce550a995cf1250Wink Saville        return sb.toString();
159b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
160b208a24cf521401912cfce16fce550a995cf1250Wink Saville
161b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /** Implement the Parcelable interface */
162963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    @Override
163963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int describeContents() {
164963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return 0;
165963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
166963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
167b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /** Implement the Parcelable interface */
168963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    @Override
169963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public void writeToParcel(Parcel dest, int flags) {
170b208a24cf521401912cfce16fce550a995cf1250Wink Saville        if (DBG) log("writeToParcel(Parcel, int): " + toString());
171963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        dest.writeInt(mMcc);
172963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        dest.writeInt(mMnc);
173963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        dest.writeInt(mLac);
174963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        dest.writeInt(mCid);
175963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        dest.writeInt(mPsc);
176963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
177963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
178b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /** Construct from Parcel, type has already been processed */
179b208a24cf521401912cfce16fce550a995cf1250Wink Saville    private CellIdentityGsm(Parcel in) {
180b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mMcc = in.readInt();
181b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mMnc = in.readInt();
182b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mLac = in.readInt();
183b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mCid = in.readInt();
184b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mPsc = in.readInt();
185b208a24cf521401912cfce16fce550a995cf1250Wink Saville        if (DBG) log("CellIdentityGsm(Parcel): " + toString());
186b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
187b208a24cf521401912cfce16fce550a995cf1250Wink Saville
188b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /** Implement the Parcelable interface */
189b208a24cf521401912cfce16fce550a995cf1250Wink Saville    @SuppressWarnings("hiding")
190b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public static final Creator<CellIdentityGsm> CREATOR =
191b208a24cf521401912cfce16fce550a995cf1250Wink Saville            new Creator<CellIdentityGsm>() {
192963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        @Override
193b208a24cf521401912cfce16fce550a995cf1250Wink Saville        public CellIdentityGsm createFromParcel(Parcel in) {
194c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville            return new CellIdentityGsm(in);
195963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        }
196963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
197963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        @Override
198b208a24cf521401912cfce16fce550a995cf1250Wink Saville        public CellIdentityGsm[] newArray(int size) {
199b208a24cf521401912cfce16fce550a995cf1250Wink Saville            return new CellIdentityGsm[size];
200963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        }
201963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    };
202b208a24cf521401912cfce16fce550a995cf1250Wink Saville
203b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /**
204b208a24cf521401912cfce16fce550a995cf1250Wink Saville     * log
205b208a24cf521401912cfce16fce550a995cf1250Wink Saville     */
206b208a24cf521401912cfce16fce550a995cf1250Wink Saville    private static void log(String s) {
207b208a24cf521401912cfce16fce550a995cf1250Wink Saville        Log.w(LOG_TAG, s);
208b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
209963db55d59a170f4b17ff907c96615a19ef6fe17John Wang}
210