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 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 */ 30 public 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