SmsCbLocation.java revision 4980bf4aff8d49ac4e05444a6ef40ea1536f1afb
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
17package android.telephony;
18
19import android.os.Parcel;
20import android.os.Parcelable;
21
22/**
23 * Represents the location and geographical scope of a cell broadcast message.
24 * For GSM/UMTS, the Location Area and Cell ID are set when the broadcast
25 * geographical scope is cell wide or Location Area wide. For CDMA, the
26 * broadcast geographical scope is always PLMN wide.
27 *
28 * @hide
29 */
30public class SmsCbLocation implements Parcelable {
31
32    /** The PLMN. Note that this field may be an empty string, but isn't allowed to be null. */
33    private final String mPlmn;
34
35    private final int mLac;
36    private final int mCid;
37
38    /**
39     * Construct an empty location object. This is used for some test cases, and for
40     * cell broadcasts saved in older versions of the database without location info.
41     */
42    public SmsCbLocation() {
43        mPlmn = "";
44        mLac = -1;
45        mCid = -1;
46    }
47
48    /**
49     * Construct a location object for the PLMN. This class is immutable, so
50     * the same object can be reused for multiple broadcasts.
51     */
52    public SmsCbLocation(String plmn) {
53        mPlmn = plmn;
54        mLac = -1;
55        mCid = -1;
56    }
57
58    /**
59     * Construct a location object for the PLMN, LAC, and Cell ID. This class is immutable, so
60     * the same object can be reused for multiple broadcasts.
61     */
62    public SmsCbLocation(String plmn, int lac, int cid) {
63        mPlmn = plmn;
64        mLac = lac;
65        mCid = cid;
66    }
67
68    /**
69     * Initialize the object from a Parcel.
70     */
71    public SmsCbLocation(Parcel in) {
72        mPlmn = in.readString();
73        mLac = in.readInt();
74        mCid = in.readInt();
75    }
76
77    /**
78     * Returns the MCC/MNC of the network as a String.
79     * @return the PLMN identifier (MCC+MNC) as a String
80     */
81    public String getPlmn() {
82        return mPlmn;
83    }
84
85    /**
86     * Returns the GSM location area code, or UMTS service area code.
87     * @return location area code, -1 if unknown, 0xffff max legal value
88     */
89    public int getLac() {
90        return mLac;
91    }
92
93    /**
94     * Returns the GSM or UMTS cell ID.
95     * @return gsm cell id, -1 if unknown, 0xffff max legal value
96     */
97    public int getCid() {
98        return mCid;
99    }
100
101    @Override
102    public int hashCode() {
103        int hash = mPlmn.hashCode();
104        hash = hash * 31 + mLac;
105        hash = hash * 31 + mCid;
106        return hash;
107    }
108
109    @Override
110    public boolean equals(Object o) {
111        if (o == this) {
112            return true;
113        }
114        if (o == null || !(o instanceof SmsCbLocation)) {
115            return false;
116        }
117        SmsCbLocation other = (SmsCbLocation) o;
118        return mPlmn.equals(other.mPlmn) && mLac == other.mLac && mCid == other.mCid;
119    }
120
121    @Override
122    public String toString() {
123        return '[' + mPlmn + ',' + mLac + ',' + mCid + ']';
124    }
125
126    /**
127     * Test whether this location is within the location area of the specified object.
128     *
129     * @param area the location area to compare with this location
130     * @return true if this location is contained within the specified location area
131     */
132    public boolean isInLocationArea(SmsCbLocation area) {
133        if (mCid != -1 && mCid != area.mCid) {
134            return false;
135        }
136        if (mLac != -1 && mLac != area.mLac) {
137            return false;
138        }
139        return mPlmn.equals(area.mPlmn);
140    }
141
142    /**
143     * Test whether this location is within the location area of the CellLocation.
144     *
145     * @param plmn the PLMN to use for comparison
146     * @param lac the Location Area (GSM) or Service Area (UMTS) to compare with
147     * @param cid the Cell ID to compare with
148     * @return true if this location is contained within the specified PLMN, LAC, and Cell ID
149     */
150    public boolean isInLocationArea(String plmn, int lac, int cid) {
151        if (!mPlmn.equals(plmn)) {
152            return false;
153        }
154
155        if (mLac != -1 && mLac != lac) {
156            return false;
157        }
158
159        if (mCid != -1 && mCid != cid) {
160            return false;
161        }
162
163        return true;
164    }
165
166    /**
167     * Flatten this object into a Parcel.
168     *
169     * @param dest  The Parcel in which the object should be written.
170     * @param flags Additional flags about how the object should be written (ignored).
171     */
172    @Override
173    public void writeToParcel(Parcel dest, int flags) {
174        dest.writeString(mPlmn);
175        dest.writeInt(mLac);
176        dest.writeInt(mCid);
177    }
178
179    public static final Parcelable.Creator<SmsCbLocation> CREATOR
180            = new Parcelable.Creator<SmsCbLocation>() {
181        @Override
182        public SmsCbLocation createFromParcel(Parcel in) {
183            return new SmsCbLocation(in);
184        }
185
186        @Override
187        public SmsCbLocation[] newArray(int size) {
188            return new SmsCbLocation[size];
189        }
190    };
191
192    /**
193     * Describe the kinds of special objects contained in the marshalled representation.
194     * @return a bitmask indicating this Parcelable contains no special objects
195     */
196    @Override
197    public int describeContents() {
198        return 0;
199    }
200}
201