10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2008 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.util.Log;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.GsmAlphabet;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.GsmAlphabet.TextEncodingDetails;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.SmsConstants;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.SmsHeader;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.SmsMessageBase;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.SmsMessageBase.SubmitPduBase;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.lang.Math;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Arrays;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static android.telephony.TelephonyManager.PHONE_TYPE_CDMA;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * A Short Message Service message.
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class SmsMessage {
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String LOG_TAG = "SMS";
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * SMS Class enumeration.
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * See TS 23.038.
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public enum MessageClass{
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        UNKNOWN, CLASS_0, CLASS_1, CLASS_2, CLASS_3;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** User data text encoding code unit size */
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int ENCODING_UNKNOWN = 0;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int ENCODING_7BIT = 1;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int ENCODING_8BIT = 2;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int ENCODING_16BIT = 3;
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @hide This value is not defined in global standard. Only in Korea, this is used.
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int ENCODING_KSC5601 = 4;
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** The maximum number of payload bytes per message */
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int MAX_USER_DATA_BYTES = 140;
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The maximum number of payload bytes per message if a user data header
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * is present.  This assumes the header only contains the
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * CONCATENATED_8_BIT_REFERENCE element.
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int MAX_USER_DATA_BYTES_WITH_HEADER = 134;
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** The maximum number of payload septets per message */
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int MAX_USER_DATA_SEPTETS = 160;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The maximum number of payload septets per message if a user data header
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * is present.  This assumes the header only contains the
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * CONCATENATED_8_BIT_REFERENCE element.
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final int MAX_USER_DATA_SEPTETS_WITH_HEADER = 153;
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Indicates a 3GPP format SMS message.
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @hide pending API council approval
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String FORMAT_3GPP = "3gpp";
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Indicates a 3GPP2 format SMS message.
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @hide pending API council approval
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String FORMAT_3GPP2 = "3gpp2";
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Contains actual SmsMessage. Only public for debugging and for framework layer.
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @hide
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsMessageBase mWrappedSmsMessage;
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static class SubmitPdu {
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public byte[] encodedScAddress; // Null if not applicable.
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public byte[] encodedMessage;
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public String toString() {
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return "SubmitPdu: encodedScAddress = "
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + Arrays.toString(encodedScAddress)
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + ", encodedMessage = "
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + Arrays.toString(encodedMessage);
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /**
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * @hide
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        protected SubmitPdu(SubmitPduBase spb) {
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.encodedMessage = spb.encodedMessage;
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.encodedScAddress = spb.encodedScAddress;
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private SmsMessage(SmsMessageBase smb) {
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWrappedSmsMessage = smb;
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Create an SmsMessage from a raw PDU.
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * <p><b>This method will soon be deprecated</b> and all applications which handle
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * incoming SMS messages by processing the {@code SMS_RECEIVED_ACTION} broadcast
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * intent <b>must</b> now pass the new {@code format} String extra from the intent
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * into the new method {@code createFromPdu(byte[], String)} which takes an
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * extra format parameter. This is required in order to correctly decode the PDU on
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * devices that require support for both 3GPP and 3GPP2 formats at the same time,
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * such as dual-mode GSM/CDMA and CDMA/LTE phones.
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static SmsMessage createFromPdu(byte[] pdu) {
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int activePhone = TelephonyManager.getDefault().getCurrentPhoneType();
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String format = (PHONE_TYPE_CDMA == activePhone) ?
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                SmsConstants.FORMAT_3GPP2 : SmsConstants.FORMAT_3GPP;
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return createFromPdu(pdu, format);
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Create an SmsMessage from a raw PDU with the specified message format. The
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * message format is passed in the {@code SMS_RECEIVED_ACTION} as the {@code format}
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * String extra, and will be either "3gpp" for GSM/UMTS/LTE messages in 3GPP format
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * or "3gpp2" for CDMA/LTE messages in 3GPP2 format.
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param pdu the message PDU from the SMS_RECEIVED_ACTION intent
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param format the format extra from the SMS_RECEIVED_ACTION intent
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @hide pending API council approval
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static SmsMessage createFromPdu(byte[] pdu, String format) {
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SmsMessageBase wrappedMessage;
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (SmsConstants.FORMAT_3GPP2.equals(format)) {
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            wrappedMessage = com.android.internal.telephony.cdma.SmsMessage.createFromPdu(pdu);
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (SmsConstants.FORMAT_3GPP.equals(format)) {
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            wrappedMessage = com.android.internal.telephony.gsm.SmsMessage.createFromPdu(pdu);
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.e(LOG_TAG, "createFromPdu(): unsupported message format " + format);
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return new SmsMessage(wrappedMessage);
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * TS 27.005 3.4.1 lines[0] and lines[1] are the two lines read from the
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * +CMT unsolicited response (PDU mode, of course)
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  +CMT: [&lt;alpha>],<length><CR><LF><pdu>
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Only public for debugging and for RIL
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * {@hide}
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static SmsMessage newFromCMT(String[] lines) {
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // received SMS in 3GPP format
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SmsMessageBase wrappedMessage =
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                com.android.internal.telephony.gsm.SmsMessage.newFromCMT(lines);
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return new SmsMessage(wrappedMessage);
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** @hide */
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static SmsMessage newFromParcel(Parcel p) {
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // received SMS in 3GPP2 format
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SmsMessageBase wrappedMessage =
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                com.android.internal.telephony.cdma.SmsMessage.newFromParcel(p);
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return new SmsMessage(wrappedMessage);
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Create an SmsMessage from an SMS EF record.
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param index Index of SMS record. This should be index in ArrayList
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *              returned by SmsManager.getAllMessagesFromSim + 1.
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param data Record data.
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return An SmsMessage representing the record.
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @hide
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static SmsMessage createFromEfRecord(int index, byte[] data) {
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SmsMessageBase wrappedMessage;
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int activePhone = TelephonyManager.getDefault().getCurrentPhoneType();
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (PHONE_TYPE_CDMA == activePhone) {
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            wrappedMessage = com.android.internal.telephony.cdma.SmsMessage.createFromEfRecord(
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    index, data);
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            wrappedMessage = com.android.internal.telephony.gsm.SmsMessage.createFromEfRecord(
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    index, data);
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return wrappedMessage != null ? new SmsMessage(wrappedMessage) : null;
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get the TP-Layer-Length for the given SMS-SUBMIT PDU Basically, the
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * length in bytes (not hex chars) less the SMSC header
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * FIXME: This method is only used by a CTS test case that isn't run on CDMA devices.
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * We should probably deprecate it and remove the obsolete test case.
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static int getTPLayerLengthForPDU(String pdu) {
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int activePhone = TelephonyManager.getDefault().getCurrentPhoneType();
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (PHONE_TYPE_CDMA == activePhone) {
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return com.android.internal.telephony.cdma.SmsMessage.getTPLayerLengthForPDU(pdu);
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return com.android.internal.telephony.gsm.SmsMessage.getTPLayerLengthForPDU(pdu);
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * TODO(cleanup): It would make some sense if the result of
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * preprocessing a message to determine the proper encoding (i.e.
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the resulting data structure from calculateLength) could be
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * passed as an argument to the actual final encoding function.
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * This would better ensure that the logic behind size calculation
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * actually matched the encoding.
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Calculates the number of SMS's required to encode the message body and
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the number of characters remaining until the next message.
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param msgBody the message to encode
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param use7bitOnly if true, characters that are not part of the
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         radio-specific 7-bit encoding are counted as single
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         space chars.  If false, and if the messageBody contains
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         non-7-bit encodable characters, length is calculated
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         using a 16-bit encoding.
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return an int[4] with int[0] being the number of SMS's
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         required, int[1] the number of code units used, and
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         int[2] is the number of code units remaining until the
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         next message. int[3] is an indicator of the encoding
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         code unit size (see the ENCODING_* definitions in SmsConstants)
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static int[] calculateLength(CharSequence msgBody, boolean use7bitOnly) {
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int activePhone = TelephonyManager.getDefault().getCurrentPhoneType();
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        TextEncodingDetails ted = (PHONE_TYPE_CDMA == activePhone) ?
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            com.android.internal.telephony.cdma.SmsMessage.calculateLength(msgBody, use7bitOnly) :
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            com.android.internal.telephony.gsm.SmsMessage.calculateLength(msgBody, use7bitOnly);
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int ret[] = new int[4];
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ret[0] = ted.msgCount;
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ret[1] = ted.codeUnitCount;
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ret[2] = ted.codeUnitsRemaining;
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ret[3] = ted.codeUnitSize;
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Divide a message text into several fragments, none bigger than
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the maximum SMS message text size.
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param text text, must not be null.
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return an <code>ArrayList</code> of strings that, in order,
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   comprise the original msg text
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @hide
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static ArrayList<String> fragmentText(String text) {
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int activePhone = TelephonyManager.getDefault().getCurrentPhoneType();
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        TextEncodingDetails ted = (PHONE_TYPE_CDMA == activePhone) ?
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            com.android.internal.telephony.cdma.SmsMessage.calculateLength(text, false) :
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            com.android.internal.telephony.gsm.SmsMessage.calculateLength(text, false);
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO(cleanup): The code here could be rolled into the logic
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // below cleanly if these MAX_* constants were defined more
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // flexibly...
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int limit;
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ted.codeUnitSize == SmsConstants.ENCODING_7BIT) {
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int udhLength;
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ted.languageTable != 0 && ted.languageShiftTable != 0) {
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                udhLength = GsmAlphabet.UDH_SEPTET_COST_TWO_SHIFT_TABLES;
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (ted.languageTable != 0 || ted.languageShiftTable != 0) {
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                udhLength = GsmAlphabet.UDH_SEPTET_COST_ONE_SHIFT_TABLE;
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                udhLength = 0;
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ted.msgCount > 1) {
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                udhLength += GsmAlphabet.UDH_SEPTET_COST_CONCATENATED_MESSAGE;
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (udhLength != 0) {
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                udhLength += GsmAlphabet.UDH_SEPTET_COST_LENGTH;
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            limit = SmsConstants.MAX_USER_DATA_SEPTETS - udhLength;
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ted.msgCount > 1) {
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                limit = SmsConstants.MAX_USER_DATA_BYTES_WITH_HEADER;
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                limit = SmsConstants.MAX_USER_DATA_BYTES;
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int pos = 0;  // Index in code units.
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int textLen = text.length();
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ArrayList<String> result = new ArrayList<String>(ted.msgCount);
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        while (pos < textLen) {
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int nextPos = 0;  // Counts code units.
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ted.codeUnitSize == SmsConstants.ENCODING_7BIT) {
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (activePhone == PHONE_TYPE_CDMA && ted.msgCount == 1) {
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // For a singleton CDMA message, the encoding must be ASCII...
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    nextPos = pos + Math.min(limit, textLen - pos);
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // For multi-segment messages, CDMA 7bit equals GSM 7bit encoding (EMS mode).
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    nextPos = GsmAlphabet.findGsmSeptetLimitIndex(text, pos, limit,
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            ted.languageTable, ted.languageShiftTable);
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {  // Assume unicode.
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                nextPos = pos + Math.min(limit / 2, textLen - pos);
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if ((nextPos <= pos) || (nextPos > textLen)) {
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Log.e(LOG_TAG, "fragmentText failed (" + pos + " >= " + nextPos + " or " +
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                          nextPos + " >= " + textLen + ")");
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            result.add(text.substring(pos, nextPos));
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pos = nextPos;
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return result;
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Calculates the number of SMS's required to encode the message body and
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the number of characters remaining until the next message, given the
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * current encoding.
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param messageBody the message to encode
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param use7bitOnly if true, characters that are not part of the radio
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         specific (GSM / CDMA) alphabet encoding are converted to as a
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         single space characters. If false, a messageBody containing
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         non-GSM or non-CDMA alphabet characters are encoded using
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         16-bit encoding.
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return an int[4] with int[0] being the number of SMS's required, int[1]
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         the number of code units used, and int[2] is the number of code
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         units remaining until the next message. int[3] is the encoding
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         type that should be used for the message.
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static int[] calculateLength(String messageBody, boolean use7bitOnly) {
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return calculateLength((CharSequence)messageBody, use7bitOnly);
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * TODO(cleanup): It looks like there is now no useful reason why
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * apps should generate pdus themselves using these routines,
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * instead of handing the raw data to SMSDispatcher (and thereby
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * have the phone process do the encoding).  Moreover, CDMA now
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * has shared state (in the form of the msgId system property)
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * which can only be modified by the phone process, and hence
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * makes the output of these routines incorrect.  Since they now
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * serve no purpose, they should probably just return null
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * directly, and be deprecated.  Going further in that direction,
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the above parsers of serialized pdu data should probably also
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * be gotten rid of, hiding all but the necessarily visible
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * structured data from client apps.  A possible concern with
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * doing this is that apps may be using these routines to generate
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * pdus that are then sent elsewhere, some network server, for
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * example, and that always returning null would thereby break
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * otherwise useful apps.
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get an SMS-SUBMIT PDU for a destination address and a message.
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * This method will not attempt to use any GSM national language 7 bit encodings.
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param scAddress Service Centre address.  Null means use default.
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return a <code>SubmitPdu</code> containing the encoded SC
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         address, if applicable, and the encoded message.
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         Returns null on encode error.
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static SubmitPdu getSubmitPdu(String scAddress,
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String destinationAddress, String message, boolean statusReportRequested) {
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SubmitPduBase spb;
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int activePhone = TelephonyManager.getDefault().getCurrentPhoneType();
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (PHONE_TYPE_CDMA == activePhone) {
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            spb = com.android.internal.telephony.cdma.SmsMessage.getSubmitPdu(scAddress,
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    destinationAddress, message, statusReportRequested, null);
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            spb = com.android.internal.telephony.gsm.SmsMessage.getSubmitPdu(scAddress,
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    destinationAddress, message, statusReportRequested);
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return new SubmitPdu(spb);
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get an SMS-SUBMIT PDU for a data message to a destination address &amp; port.
4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * This method will not attempt to use any GSM national language 7 bit encodings.
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param scAddress Service Centre address. null == use default
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param destinationAddress the address of the destination for the message
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param destinationPort the port to deliver the message to at the
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *        destination
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param data the data for the message
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return a <code>SubmitPdu</code> containing the encoded SC
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         address, if applicable, and the encoded message.
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         Returns null on encode error.
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static SubmitPdu getSubmitPdu(String scAddress,
4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String destinationAddress, short destinationPort, byte[] data,
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean statusReportRequested) {
4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SubmitPduBase spb;
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int activePhone = TelephonyManager.getDefault().getCurrentPhoneType();
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (PHONE_TYPE_CDMA == activePhone) {
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            spb = com.android.internal.telephony.cdma.SmsMessage.getSubmitPdu(scAddress,
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    destinationAddress, destinationPort, data, statusReportRequested);
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            spb = com.android.internal.telephony.gsm.SmsMessage.getSubmitPdu(scAddress,
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    destinationAddress, destinationPort, data, statusReportRequested);
4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return new SubmitPdu(spb);
4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the address of the SMS service center that relayed this message
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * or null if there is none.
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getServiceCenterAddress() {
4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getServiceCenterAddress();
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the originating address (sender) of this SMS message in String
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * form or null if unavailable
4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getOriginatingAddress() {
4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getOriginatingAddress();
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the originating address, or email from address if this message
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * was from an email gateway. Returns null if originating address
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * unavailable.
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getDisplayOriginatingAddress() {
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getDisplayOriginatingAddress();
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the message body as a String, if it exists and is text based.
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return message body is there is one, otherwise null
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getMessageBody() {
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getMessageBody();
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the class of this message.
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public MessageClass getMessageClass() {
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(mWrappedSmsMessage.getMessageClass()) {
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case CLASS_0: return MessageClass.CLASS_0;
4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case CLASS_1: return MessageClass.CLASS_1;
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case CLASS_2: return MessageClass.CLASS_2;
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case CLASS_3: return MessageClass.CLASS_3;
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default: return MessageClass.UNKNOWN;
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the message body, or email message body if this message was from
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * an email gateway. Returns null if message body unavailable.
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getDisplayMessageBody() {
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getDisplayMessageBody();
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Unofficial convention of a subject line enclosed in parens empty string
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * if not present
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getPseudoSubject() {
5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getPseudoSubject();
5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the service centre timestamp in currentTimeMillis() format
5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getTimestampMillis() {
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getTimestampMillis();
5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true if message is an email.
5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if this message came through an email gateway and email
5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         sender / subject / parsed body are available
5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isEmail() {
5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.isEmail();
5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     /**
5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return if isEmail() is true, body of the email sent through the gateway.
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         null otherwise
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getEmailBody() {
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getEmailBody();
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return if isEmail() is true, email from address of email sent through
5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         the gateway. null otherwise
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getEmailFrom() {
5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getEmailFrom();
5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get protocol identifier.
5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getProtocolIdentifier() {
5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getProtocolIdentifier();
5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * See TS 23.040 9.2.3.9 returns true if this is a "replace short message"
5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * SMS
5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isReplace() {
5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.isReplace();
5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true for CPHS MWI toggle message.
5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if this is a CPHS MWI toggle message See CPHS 4.2 section
5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         B.4.2
5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isCphsMwiMessage() {
5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.isCphsMwiMessage();
5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * returns true if this message is a CPHS voicemail / message waiting
5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * indicator (MWI) clear message
5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMWIClearMessage() {
5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.isMWIClearMessage();
5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * returns true if this message is a CPHS voicemail / message waiting
5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * indicator (MWI) set message
5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMWISetMessage() {
5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.isMWISetMessage();
5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * returns true if this message is a "Message Waiting Indication Group:
5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Discard Message" notification and should not be stored.
5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMwiDontStore() {
5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.isMwiDontStore();
5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * returns the user data section minus the user data header if one was
5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * present.
5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public byte[] getUserData() {
5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getUserData();
5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the raw PDU for the message.
5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the raw PDU for the message.
6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public byte[] getPdu() {
6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getPdu();
6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the status of the message on the SIM (read, unread, sent, unsent).
6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the status of the message on the SIM.  These are:
6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_SIM_FREE
6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_SIM_READ
6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_SIM_UNREAD
6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_SIM_SEND
6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_SIM_UNSENT
6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @deprecated Use getStatusOnIcc instead.
6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Deprecated public int getStatusOnSim() {
6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getStatusOnIcc();
6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the status of the message on the ICC (read, unread, sent, unsent).
6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the status of the message on the ICC.  These are:
6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_ICC_FREE
6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_ICC_READ
6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_ICC_UNREAD
6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_ICC_SEND
6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsManager.STATUS_ON_ICC_UNSENT
6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getStatusOnIcc() {
6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getStatusOnIcc();
6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the record index of the message on the SIM (1-based index).
6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the record index of the message on the SIM, or -1 if this
6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsMessage was not created from a SIM SMS EF record.
6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @deprecated Use getIndexOnIcc instead.
6400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Deprecated public int getIndexOnSim() {
6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getIndexOnIcc();
6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the record index of the message on the ICC (1-based index).
6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the record index of the message on the ICC, or -1 if this
6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         SmsMessage was not created from a ICC SMS EF record.
6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getIndexOnIcc() {
6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getIndexOnIcc();
6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * GSM:
6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * For an SMS-STATUS-REPORT message, this returns the status field from
6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the status report.  This field indicates the status of a previously
6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * submitted SMS, if requested.  See TS 23.040, 9.2.3.15 TP-Status for a
6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * description of values.
6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * CDMA:
6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * For not interfering with status codes from GSM, the value is
6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * shifted to the bits 31-16.
6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The value is composed of an error class (bits 25-24) and a status code (bits 23-16).
6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Possible codes are described in C.S0015-B, v2.0, 4.5.21.
6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return 0 indicates the previously sent message was received.
6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         See TS 23.040, 9.9.2.3.15 and C.S0015-B, v2.0, 4.5.21
6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         for a description of other possible values.
6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getStatus() {
6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.getStatus();
6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return true iff the message is a SMS-STATUS-REPORT message.
6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isStatusReportMessage() {
6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.isStatusReportMessage();
6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true iff the <code>TP-Reply-Path</code> bit is set in
6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * this message.
6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isReplyPathPresent() {
6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mWrappedSmsMessage.isReplyPathPresent();
6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
689