10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2012 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage android.telephony; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Bundle; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Parcel; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Parcelable; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.gsm.GsmCellLocation; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Represents the location and geographical scope of a cell broadcast message. 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * For GSM/UMTS, the Location Area and Cell ID are set when the broadcast 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * geographical scope is cell wide or Location Area wide. For CDMA, the 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * broadcast geographical scope is always PLMN wide. 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @hide 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class SmsCbLocation implements Parcelable { 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** The PLMN. Note that this field may be an empty string, but isn't allowed to be null. */ 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final String mPlmn; 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final int mLac; 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final int mCid; 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Construct an empty location object. This is used for some test cases, and for 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * cell broadcasts saved in older versions of the database without location info. 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public SmsCbLocation() { 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPlmn = ""; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLac = -1; 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCid = -1; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Construct a location object for the PLMN. This class is immutable, so 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the same object can be reused for multiple broadcasts. 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public SmsCbLocation(String plmn) { 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPlmn = plmn; 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLac = -1; 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCid = -1; 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Construct a location object for the PLMN, LAC, and Cell ID. This class is immutable, so 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the same object can be reused for multiple broadcasts. 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public SmsCbLocation(String plmn, int lac, int cid) { 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPlmn = plmn; 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLac = lac; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCid = cid; 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Initialize the object from a Parcel. 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public SmsCbLocation(Parcel in) { 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPlmn = in.readString(); 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLac = in.readInt(); 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCid = in.readInt(); 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Returns the MCC/MNC of the network as a String. 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the PLMN identifier (MCC+MNC) as a String 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getPlmn() { 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mPlmn; 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Returns the GSM location area code, or UMTS service area code. 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return location area code, -1 if unknown, 0xffff max legal value 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int getLac() { 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mLac; 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Returns the GSM or UMTS cell ID. 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return gsm cell id, -1 if unknown, 0xffff max legal value 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int getCid() { 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mCid; 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int hashCode() { 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int hash = mPlmn.hashCode(); 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hash = hash * 31 + mLac; 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hash = hash * 31 + mCid; 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return hash; 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean equals(Object o) { 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (o == this) { 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (o == null || !(o instanceof SmsCbLocation)) { 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsCbLocation other = (SmsCbLocation) o; 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mPlmn.equals(other.mPlmn) && mLac == other.mLac && mCid == other.mCid; 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String toString() { 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return '[' + mPlmn + ',' + mLac + ',' + mCid + ']'; 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Test whether this location is within the location area of the specified object. 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param area the location area to compare with this location 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if this location is contained within the specified location area 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isInLocationArea(SmsCbLocation area) { 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mCid != -1 && mCid != area.mCid) { 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mLac != -1 && mLac != area.mLac) { 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mPlmn.equals(area.mPlmn); 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Test whether this location is within the location area of the CellLocation. 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param plmn the PLMN to use for comparison 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param lac the Location Area (GSM) or Service Area (UMTS) to compare with 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cid the Cell ID to compare with 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if this location is contained within the specified PLMN, LAC, and Cell ID 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isInLocationArea(String plmn, int lac, int cid) { 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!mPlmn.equals(plmn)) { 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mLac != -1 && mLac != lac) { 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mCid != -1 && mCid != cid) { 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Flatten this object into a Parcel. 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param dest The Parcel in which the object should be written. 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param flags Additional flags about how the object should be written (ignored). 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void writeToParcel(Parcel dest, int flags) { 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dest.writeString(mPlmn); 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dest.writeInt(mLac); 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dest.writeInt(mCid); 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static final Parcelable.Creator<SmsCbLocation> CREATOR 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new Parcelable.Creator<SmsCbLocation>() { 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public SmsCbLocation createFromParcel(Parcel in) { 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return new SmsCbLocation(in); 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public SmsCbLocation[] newArray(int size) { 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return new SmsCbLocation[size]; 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville }; 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Describe the kinds of special objects contained in the marshalled representation. 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return a bitmask indicating this Parcelable contains no special objects 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int describeContents() { 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return 0; 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 203