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