10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2010 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.Parcel;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Parcelable;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Parcelable object containing a received cell broadcast message. There are four different types
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * of Cell Broadcast messages:
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <ul>
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <li>opt-in informational broadcasts, e.g. news, weather, stock quotes, sports scores</li>
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <li>cell information messages, broadcast on channel 50, indicating the current cell name for
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *  roaming purposes (required to display on the idle screen in Brazil)</li>
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <li>emergency broadcasts for the Japanese Earthquake and Tsunami Warning System (ETWS)</li>
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <li>emergency broadcasts for the American Commercial Mobile Alert Service (CMAS)</li>
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * </ul>
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <p>There are also four different CB message formats: GSM, ETWS Primary Notification (GSM only),
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * UMTS, and CDMA. Some fields are only applicable for some message formats. Other fields were
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * unified under a common name, avoiding some names, such as "Message Identifier", that refer to
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * two completely different concepts in 3GPP and CDMA.
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <p>The GSM/UMTS Message Identifier field is available via {@link #getServiceCategory}, the name
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * of the equivalent field in CDMA. In both cases the service category is a 16-bit value, but 3GPP
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and 3GPP2 have completely different meanings for the respective values. For ETWS and CMAS, the
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * application should
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <p>The CDMA Message Identifier field is available via {@link #getSerialNumber}, which is used
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * to detect the receipt of a duplicate message to be discarded. In CDMA, the message ID is
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * unique to the current PLMN. In GSM/UMTS, there is a 16-bit serial number containing a 2-bit
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Geographical Scope field which indicates whether the 10-bit message code and 4-bit update number
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * are considered unique to the PLMN, to the current cell, or to the current Location Area (or
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Service Area in UMTS). The relevant values are concatenated into a single String which will be
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * unique if the messages are not duplicates.
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <p>The SMS dispatcher does not detect duplicate messages. However, it does concatenate the
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * pages of a GSM multi-page cell broadcast into a single SmsCbMessage object.
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <p>Interested applications with {@code RECEIVE_SMS_PERMISSION} can register to receive
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@code SMS_CB_RECEIVED_ACTION} broadcast intents for incoming non-emergency broadcasts.
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Only system applications such as the CellBroadcastReceiver may receive notifications for
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * emergency broadcasts (ETWS and CMAS). This is intended to prevent any potential for delays or
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * interference with the immediate display of the alert message and playing of the alert sound and
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * vibration pattern, which could be caused by poorly written or malicious non-system code.
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @hide
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class SmsCbMessage implements Parcelable {
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final String LOG_TAG = "SMSCB";
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Cell wide geographical scope with immediate display (GSM/UMTS only). */
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int GEOGRAPHICAL_SCOPE_CELL_WIDE_IMMEDIATE = 0;
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** PLMN wide geographical scope (GSM/UMTS and all CDMA broadcasts). */
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int GEOGRAPHICAL_SCOPE_PLMN_WIDE = 1;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Location / service area wide geographical scope (GSM/UMTS only). */
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int GEOGRAPHICAL_SCOPE_LA_WIDE = 2;
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Cell wide geographical scope (GSM/UMTS only). */
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int GEOGRAPHICAL_SCOPE_CELL_WIDE = 3;
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** GSM or UMTS format cell broadcast. */
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int MESSAGE_FORMAT_3GPP = 1;
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** CDMA format cell broadcast. */
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int MESSAGE_FORMAT_3GPP2 = 2;
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Normal message priority. */
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int MESSAGE_PRIORITY_NORMAL = 0;
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Interactive message priority. */
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int MESSAGE_PRIORITY_INTERACTIVE = 1;
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Urgent message priority. */
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int MESSAGE_PRIORITY_URGENT = 2;
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Emergency message priority. */
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int MESSAGE_PRIORITY_EMERGENCY = 3;
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Format of this message (for interpretation of service category values). */
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final int mMessageFormat;
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Geographical scope of broadcast. */
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final int mGeographicalScope;
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Serial number of broadcast (message identifier for CDMA, geographical scope + message code +
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * update number for GSM/UMTS). The serial number plus the location code uniquely identify
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * a cell broadcast for duplicate detection.
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final int mSerialNumber;
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Location identifier for this message. It consists of the current operator MCC/MNC as a
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 5 or 6-digit decimal string. In addition, for GSM/UMTS, if the Geographical Scope of the
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * message is not binary 01, the Location Area is included for comparison. If the GS is
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 00 or 11, the Cell ID is also included. LAC and Cell ID are -1 if not specified.
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final SmsCbLocation mLocation;
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 16-bit CDMA service category or GSM/UMTS message identifier. For ETWS and CMAS warnings,
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the information provided by the category is also available via {@link #getEtwsWarningInfo()}
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * or {@link #getCmasWarningInfo()}.
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final int mServiceCategory;
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Message language, as a two-character string, e.g. "en". */
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final String mLanguage;
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Message body, as a String. */
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final String mBody;
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Message priority (including emergency priority). */
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final int mPriority;
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** ETWS warning notification information (ETWS warnings only). */
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final SmsCbEtwsInfo mEtwsWarningInfo;
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** CMAS warning notification information (CMAS warnings only). */
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final SmsCbCmasInfo mCmasWarningInfo;
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Create a new SmsCbMessage with the specified data.
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsCbMessage(int messageFormat, int geographicalScope, int serialNumber,
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            SmsCbLocation location, int serviceCategory, String language, String body,
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int priority, SmsCbEtwsInfo etwsWarningInfo, SmsCbCmasInfo cmasWarningInfo) {
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMessageFormat = messageFormat;
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mGeographicalScope = geographicalScope;
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSerialNumber = serialNumber;
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mLocation = location;
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mServiceCategory = serviceCategory;
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mLanguage = language;
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mBody = body;
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPriority = priority;
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mEtwsWarningInfo = etwsWarningInfo;
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCmasWarningInfo = cmasWarningInfo;
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Create a new SmsCbMessage object from a Parcel. */
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsCbMessage(Parcel in) {
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMessageFormat = in.readInt();
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mGeographicalScope = in.readInt();
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSerialNumber = in.readInt();
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mLocation = new SmsCbLocation(in);
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mServiceCategory = in.readInt();
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mLanguage = in.readString();
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mBody = in.readString();
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPriority = in.readInt();
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int type = in.readInt();
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (type) {
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 'E':
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // unparcel ETWS warning information
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mEtwsWarningInfo = new SmsCbEtwsInfo(in);
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCmasWarningInfo = null;
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 'C':
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // unparcel CMAS warning information
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mEtwsWarningInfo = null;
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCmasWarningInfo = new SmsCbCmasInfo(in);
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mEtwsWarningInfo = null;
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCmasWarningInfo = null;
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Flatten this object into a Parcel.
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param dest  The Parcel in which the object should be written.
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param flags Additional flags about how the object should be written (ignored).
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void writeToParcel(Parcel dest, int flags) {
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        dest.writeInt(mMessageFormat);
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        dest.writeInt(mGeographicalScope);
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        dest.writeInt(mSerialNumber);
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mLocation.writeToParcel(dest, flags);
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        dest.writeInt(mServiceCategory);
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        dest.writeString(mLanguage);
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        dest.writeString(mBody);
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        dest.writeInt(mPriority);
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mEtwsWarningInfo != null) {
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // parcel ETWS warning information
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            dest.writeInt('E');
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mEtwsWarningInfo.writeToParcel(dest, flags);
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (mCmasWarningInfo != null) {
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // parcel CMAS warning information
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            dest.writeInt('C');
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCmasWarningInfo.writeToParcel(dest, flags);
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // no ETWS or CMAS warning information
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            dest.writeInt('0');
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final Parcelable.Creator<SmsCbMessage> CREATOR
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new Parcelable.Creator<SmsCbMessage>() {
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public SmsCbMessage createFromParcel(Parcel in) {
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return new SmsCbMessage(in);
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public SmsCbMessage[] newArray(int size) {
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return new SmsCbMessage[size];
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    };
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return the geographical scope of this message (GSM/UMTS only).
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return Geographical scope
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getGeographicalScope() {
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mGeographicalScope;
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return the broadcast serial number of broadcast (message identifier for CDMA, or
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * geographical scope + message code + update number for GSM/UMTS). The serial number plus
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the location code uniquely identify a cell broadcast for duplicate detection.
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the 16-bit CDMA message identifier or GSM/UMTS serial number
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getSerialNumber() {
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSerialNumber;
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return the location identifier for this message, consisting of the MCC/MNC as a
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 5 or 6-digit decimal string. In addition, for GSM/UMTS, if the Geographical Scope of the
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * message is not binary 01, the Location Area is included. If the GS is 00 or 11, the
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * cell ID is also included. The {@link SmsCbLocation} object includes a method to test
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * if the location is included within another location area or within a PLMN and CellLocation.
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the geographical location code for duplicate message detection
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsCbLocation getLocation() {
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mLocation;
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return the 16-bit CDMA service category or GSM/UMTS message identifier. The interpretation
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * of the category is radio technology specific. For ETWS and CMAS warnings, the information
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * provided by the category is available via {@link #getEtwsWarningInfo()} or
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * {@link #getCmasWarningInfo()} in a radio technology independent format.
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the radio technology specific service category
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getServiceCategory() {
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mServiceCategory;
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get the ISO-639-1 language code for this message, or null if unspecified
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return Language code
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getLanguageCode() {
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mLanguage;
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get the body of this message, or null if no body available
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return Body, or null
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getMessageBody() {
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mBody;
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get the message format ({@link #MESSAGE_FORMAT_3GPP} or {@link #MESSAGE_FORMAT_3GPP2}).
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return an integer representing 3GPP or 3GPP2 message format
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getMessageFormat() {
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mMessageFormat;
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get the message priority. Normal broadcasts return {@link #MESSAGE_PRIORITY_NORMAL}
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * and emergency broadcasts return {@link #MESSAGE_PRIORITY_EMERGENCY}. CDMA also may return
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * {@link #MESSAGE_PRIORITY_INTERACTIVE} or {@link #MESSAGE_PRIORITY_URGENT}.
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return an integer representing the message priority
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getMessagePriority() {
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mPriority;
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If this is an ETWS warning notification then this method will return an object containing
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the ETWS warning type, the emergency user alert flag, and the popup flag. If this is an
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * ETWS primary notification (GSM only), there will also be a 7-byte timestamp and 43-byte
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * digital signature. As of Release 10, 3GPP TS 23.041 states that the UE shall ignore the
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * ETWS primary notification timestamp and digital signature if received.
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return an SmsCbEtwsInfo object, or null if this is not an ETWS warning notification
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsCbEtwsInfo getEtwsWarningInfo() {
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mEtwsWarningInfo;
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If this is a CMAS warning notification then this method will return an object containing
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the CMAS message class, category, response type, severity, urgency and certainty.
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The message class is always present. Severity, urgency and certainty are present for CDMA
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * warning notifications containing a type 1 elements record and for GSM and UMTS warnings
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * except for the Presidential-level alert category. Category and response type are only
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * available for CDMA notifications containing a type 1 elements record.
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return an SmsCbCmasInfo object, or null if this is not a CMAS warning notification
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsCbCmasInfo getCmasWarningInfo() {
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCmasWarningInfo;
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return whether this message is an emergency (PWS) message type.
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if the message is a public warning notification; false otherwise
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isEmergencyMessage() {
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mPriority == MESSAGE_PRIORITY_EMERGENCY;
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return whether this message is an ETWS warning alert.
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if the message is an ETWS warning notification; false otherwise
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isEtwsMessage() {
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mEtwsWarningInfo != null;
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return whether this message is a CMAS warning alert.
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if the message is a CMAS warning notification; false otherwise
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isCmasMessage() {
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCmasWarningInfo != null;
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String toString() {
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "SmsCbMessage{geographicalScope=" + mGeographicalScope + ", serialNumber="
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + mSerialNumber + ", location=" + mLocation + ", serviceCategory="
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + mServiceCategory + ", language=" + mLanguage + ", body=" + mBody
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + ", priority=" + mPriority
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + (mEtwsWarningInfo != null ? (", " + mEtwsWarningInfo.toString()) : "")
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + (mCmasWarningInfo != null ? (", " + mCmasWarningInfo.toString()) : "") + '}';
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Describe the kinds of special objects contained in the marshalled representation.
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return a bitmask indicating this Parcelable contains no special objects
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int describeContents() {
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return 0;
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
383