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;
21599a90c2a02645a5f2d189b9065b863397a4076eWink Savilleimport android.telephony.Rlog;
22963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
23963db55d59a170f4b17ff907c96615a19ef6fe17John Wang/**
24e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * CellIdentity to represent a unique GSM 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    private final int mCid;
39963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
40963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
41b208a24cf521401912cfce16fce550a995cf1250Wink Saville     * @hide
42b208a24cf521401912cfce16fce550a995cf1250Wink Saville     */
43b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public CellIdentityGsm() {
44b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mMcc = Integer.MAX_VALUE;
45b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mMnc = Integer.MAX_VALUE;
46b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mLac = Integer.MAX_VALUE;
47b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mCid = Integer.MAX_VALUE;
48b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
49b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /**
50963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * public constructor
51963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @param mcc 3-digit Mobile Country Code, 0..999
52963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @param mnc 2 or 3-digit Mobile Network Code, 0..999
53963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @param lac 16-bit Location Area Code, 0..65535
54963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @param cid 16-bit GSM Cell Identity or 28-bit UMTS Cell Identity
55b208a24cf521401912cfce16fce550a995cf1250Wink Saville     *
56b208a24cf521401912cfce16fce550a995cf1250Wink Saville     * @hide
57963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
58e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville    public CellIdentityGsm (int mcc, int mnc, int lac, int cid) {
59963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mMcc = mcc;
60963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mMnc = mnc;
61963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mLac = lac;
62963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mCid = cid;
63963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
64963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
65b208a24cf521401912cfce16fce550a995cf1250Wink Saville    private CellIdentityGsm(CellIdentityGsm cid) {
66963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mMcc = cid.mMcc;
67963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mMnc = cid.mMnc;
68963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mLac = cid.mLac;
69963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        mCid = cid.mCid;
70963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
71963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
72b208a24cf521401912cfce16fce550a995cf1250Wink Saville    CellIdentityGsm copy() {
73b208a24cf521401912cfce16fce550a995cf1250Wink Saville       return new CellIdentityGsm(this);
74b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
75b208a24cf521401912cfce16fce550a995cf1250Wink Saville
76963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
77e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville     * @return 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown
78963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
79963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int getMcc() {
80963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return mMcc;
81963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
82963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
83963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
84e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville     * @return 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown
85963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
86963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int getMnc() {
87963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return mMnc;
88963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
89963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
90963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
91e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville     * @return 16-bit Location Area Code, 0..65535, Integer.MAX_VALUE if unknown
92963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
93963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int getLac() {
94963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return mLac;
95963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
96963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
97963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
98963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * @return CID
99963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     * Either 16-bit GSM Cell Identity described
100e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville     * in TS 27.007, 0..65535, Integer.MAX_VALUE if unknown
101963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
102963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int getCid() {
103963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return mCid;
104963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
105963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
106963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    /**
107e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville     * @return Integer.MAX_VALUE, undefined for GSM
108963db55d59a170f4b17ff907c96615a19ef6fe17John Wang     */
109e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville    @Deprecated
110963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int getPsc() {
111e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville        return Integer.MAX_VALUE;
112963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
113963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
114b208a24cf521401912cfce16fce550a995cf1250Wink Saville    @Override
115b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public int hashCode() {
116b208a24cf521401912cfce16fce550a995cf1250Wink Saville        int primeNum = 31;
117e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville        return (mMcc * primeNum) + (mMnc * primeNum) + (mLac * primeNum) + (mCid * primeNum);
118b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
119b208a24cf521401912cfce16fce550a995cf1250Wink Saville
120b208a24cf521401912cfce16fce550a995cf1250Wink Saville    @Override
121b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public boolean equals(Object other) {
122b208a24cf521401912cfce16fce550a995cf1250Wink Saville        if (super.equals(other)) {
123b208a24cf521401912cfce16fce550a995cf1250Wink Saville            try {
124b208a24cf521401912cfce16fce550a995cf1250Wink Saville                CellIdentityGsm o = (CellIdentityGsm)other;
125b208a24cf521401912cfce16fce550a995cf1250Wink Saville                return mMcc == o.mMcc &&
126b208a24cf521401912cfce16fce550a995cf1250Wink Saville                        mMnc == o.mMnc &&
127b208a24cf521401912cfce16fce550a995cf1250Wink Saville                        mLac == o.mLac &&
128e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville                        mCid == o.mCid;
129b208a24cf521401912cfce16fce550a995cf1250Wink Saville            } catch (ClassCastException e) {
130b208a24cf521401912cfce16fce550a995cf1250Wink Saville                return false;
131b208a24cf521401912cfce16fce550a995cf1250Wink Saville            }
132b208a24cf521401912cfce16fce550a995cf1250Wink Saville        } else {
133b208a24cf521401912cfce16fce550a995cf1250Wink Saville            return false;
134b208a24cf521401912cfce16fce550a995cf1250Wink Saville        }
135b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
136b208a24cf521401912cfce16fce550a995cf1250Wink Saville
137b208a24cf521401912cfce16fce550a995cf1250Wink Saville    @Override
138b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public String toString() {
139e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville        StringBuilder sb = new StringBuilder("CellIdentityGsm:{");
140b208a24cf521401912cfce16fce550a995cf1250Wink Saville        sb.append(" mMcc=").append(mMcc);
141094beeccf5bf6e68d73f94a1aeaeda6690f4bf06Wink Saville        sb.append(" mMnc=").append(mMnc);
142b208a24cf521401912cfce16fce550a995cf1250Wink Saville        sb.append(" mLac=").append(mLac);
143b208a24cf521401912cfce16fce550a995cf1250Wink Saville        sb.append(" mCid=").append(mCid);
144094beeccf5bf6e68d73f94a1aeaeda6690f4bf06Wink Saville        sb.append("}");
145b208a24cf521401912cfce16fce550a995cf1250Wink Saville
146b208a24cf521401912cfce16fce550a995cf1250Wink Saville        return sb.toString();
147b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
148b208a24cf521401912cfce16fce550a995cf1250Wink Saville
149b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /** Implement the Parcelable interface */
150963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    @Override
151963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public int describeContents() {
152963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        return 0;
153963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
154963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
155b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /** Implement the Parcelable interface */
156963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    @Override
157963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    public void writeToParcel(Parcel dest, int flags) {
158b208a24cf521401912cfce16fce550a995cf1250Wink Saville        if (DBG) log("writeToParcel(Parcel, int): " + toString());
159963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        dest.writeInt(mMcc);
160963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        dest.writeInt(mMnc);
161963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        dest.writeInt(mLac);
162963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        dest.writeInt(mCid);
163963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    }
164963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
165b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /** Construct from Parcel, type has already been processed */
166b208a24cf521401912cfce16fce550a995cf1250Wink Saville    private CellIdentityGsm(Parcel in) {
167b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mMcc = in.readInt();
168b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mMnc = in.readInt();
169b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mLac = in.readInt();
170b208a24cf521401912cfce16fce550a995cf1250Wink Saville        mCid = in.readInt();
171b208a24cf521401912cfce16fce550a995cf1250Wink Saville        if (DBG) log("CellIdentityGsm(Parcel): " + toString());
172b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
173b208a24cf521401912cfce16fce550a995cf1250Wink Saville
174b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /** Implement the Parcelable interface */
175b208a24cf521401912cfce16fce550a995cf1250Wink Saville    @SuppressWarnings("hiding")
176b208a24cf521401912cfce16fce550a995cf1250Wink Saville    public static final Creator<CellIdentityGsm> CREATOR =
177b208a24cf521401912cfce16fce550a995cf1250Wink Saville            new Creator<CellIdentityGsm>() {
178963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        @Override
179b208a24cf521401912cfce16fce550a995cf1250Wink Saville        public CellIdentityGsm createFromParcel(Parcel in) {
180c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville            return new CellIdentityGsm(in);
181963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        }
182963db55d59a170f4b17ff907c96615a19ef6fe17John Wang
183963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        @Override
184b208a24cf521401912cfce16fce550a995cf1250Wink Saville        public CellIdentityGsm[] newArray(int size) {
185b208a24cf521401912cfce16fce550a995cf1250Wink Saville            return new CellIdentityGsm[size];
186963db55d59a170f4b17ff907c96615a19ef6fe17John Wang        }
187963db55d59a170f4b17ff907c96615a19ef6fe17John Wang    };
188b208a24cf521401912cfce16fce550a995cf1250Wink Saville
189b208a24cf521401912cfce16fce550a995cf1250Wink Saville    /**
190b208a24cf521401912cfce16fce550a995cf1250Wink Saville     * log
191b208a24cf521401912cfce16fce550a995cf1250Wink Saville     */
192b208a24cf521401912cfce16fce550a995cf1250Wink Saville    private static void log(String s) {
193599a90c2a02645a5f2d189b9065b863397a4076eWink Saville        Rlog.w(LOG_TAG, s);
194b208a24cf521401912cfce16fce550a995cf1250Wink Saville    }
195963db55d59a170f4b17ff907c96615a19ef6fe17John Wang}
196