14980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen/*
24980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Copyright (C) 2008 The Android Open Source Project
34980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *
44980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Licensed under the Apache License, Version 2.0 (the "License");
54980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * you may not use this file except in compliance with the License.
64980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * You may obtain a copy of the License at
74980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *
84980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *      http://www.apache.org/licenses/LICENSE-2.0
94980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *
104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Unless required by applicable law or agreed to in writing, software
114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * distributed under the License is distributed on an "AS IS" BASIS,
124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * See the License for the specific language governing permissions and
144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * limitations under the License.
154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen */
164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenpackage android.telephony;
184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
19d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.annotation.RequiresPermission;
20448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastryimport android.annotation.SystemApi;
214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.app.ActivityThread;
224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.app.PendingIntent;
234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.content.ActivityNotFoundException;
244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.content.ContentValues;
254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.content.Context;
264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.content.Intent;
274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.net.Uri;
284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.os.BaseBundle;
294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.os.Bundle;
304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.os.RemoteException;
314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.os.ServiceManager;
324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.text.TextUtils;
334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.util.ArrayMap;
344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport android.util.Log;
354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport com.android.internal.telephony.IMms;
374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport com.android.internal.telephony.ISms;
384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport com.android.internal.telephony.SmsRawData;
394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport java.util.ArrayList;
414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport java.util.Arrays;
424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport java.util.List;
434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenimport java.util.Map;
444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen/*
464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * TODO(code review): Curious question... Why are a lot of these
474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * methods not declared as static, since they do not seem to require
484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * any local object state?  Presumably this cannot be changed without
494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * interfering with the API...
504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen */
514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen/**
534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Manages SMS operations such as sending data, text, and pdu SMS messages.
544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * Get this object by calling the static method {@link #getDefault()}.
554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen *
564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * <p>For information about how to behave as the default SMS app on Android 4.4 (API level 19)
574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen * and higher, see {@link android.provider.Telephony}.
584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen */
594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsenpublic final class SmsManager {
604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private static final String TAG = "SmsManager";
614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * A psuedo-subId that represents the default subId at any given time. The actual subId it
634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * represents changes as the default subId is changed.
644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private static final int DEFAULT_SUBSCRIPTION_ID = -1002;
664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Singleton object constructed during class initialization. */
684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private static final SmsManager sInstance = new SmsManager(DEFAULT_SUBSCRIPTION_ID);
694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private static final Object sLockObject = new Object();
704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** @hide */
724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int CELL_BROADCAST_RAN_TYPE_GSM = 0;
734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** @hide */
744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int CELL_BROADCAST_RAN_TYPE_CDMA = 1;
754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
76e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold    /** SMS record length from TS 51.011 10.5.3
77e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold     * @hide
78e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold     */
79e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold    public static final int SMS_RECORD_LENGTH = 176;
80e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold
81e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold    /** SMS record length from C.S0023 3.4.27
82e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold     * @hide
83e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold     */
84e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold    public static final int CDMA_SMS_RECORD_LENGTH = 255;
85e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold
864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private static final Map<Integer, SmsManager> sSubInstances =
874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            new ArrayMap<Integer, SmsManager>();
884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** A concrete subscription id, or the pseudo DEFAULT_SUBSCRIPTION_ID */
904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private int mSubId;
914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /*
934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Key for the various carrier-dependent configuration values.
944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Some of the values are used by the system in processing SMS or MMS messages. Others
954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * are provided for the convenience of SMS applications.
964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether to append transaction id to MMS WAP Push M-Notification.ind's content location URI
1004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * when constructing the download URL of a new MMS (boolean type)
1014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_APPEND_TRANSACTION_ID =
1034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_APPEND_TRANSACTION_ID_BOOL;
1044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether MMS is enabled for the current carrier (boolean type)
1064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
1084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        MMS_CONFIG_MMS_ENABLED = CarrierConfigManager.KEY_MMS_MMS_ENABLED_BOOL;
1094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether group MMS is enabled for the current carrier (boolean type)
1114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
1134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_GROUP_MMS_ENABLED = CarrierConfigManager.KEY_MMS_GROUP_MMS_ENABLED_BOOL;
1144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * If this is enabled, M-NotifyResp.ind should be sent to the WAP Push content location instead
1164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * of the default MMSC (boolean type)
1174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED =
1194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_NOTIFY_WAP_MMSC_ENABLED_BOOL;
1204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether alias is enabled (boolean type)
1224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
1244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_ALIAS_ENABLED = CarrierConfigManager.KEY_MMS_ALIAS_ENABLED_BOOL;
1254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether audio is allowed to be attached for MMS messages (boolean type)
1274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
1294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_ALLOW_ATTACH_AUDIO = CarrierConfigManager.KEY_MMS_ALLOW_ATTACH_AUDIO_BOOL;
1304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether multipart SMS is enabled (boolean type)
1324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_MULTIPART_SMS_ENABLED =
1344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_MULTIPART_SMS_ENABLED_BOOL;
1354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether SMS delivery report is enabled (boolean type)
1374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_SMS_DELIVERY_REPORT_ENABLED =
1394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_SMS_DELIVERY_REPORT_ENABLED_BOOL;
1404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether content-disposition field should be expected in an MMS PDU (boolean type)
1424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION =
1444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_SUPPORT_MMS_CONTENT_DISPOSITION_BOOL;
1454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether multipart SMS should be sent as separate messages
1474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES =
1494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES_BOOL;
1504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether MMS read report is enabled (boolean type)
1524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_MMS_READ_REPORT_ENABLED =
1544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_MMS_READ_REPORT_ENABLED_BOOL;
1554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether MMS delivery report is enabled (boolean type)
1574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED =
1594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_MMS_DELIVERY_REPORT_ENABLED_BOOL;
1604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Max MMS message size in bytes (int type)
1624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
1644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_MAX_MESSAGE_SIZE = CarrierConfigManager.KEY_MMS_MAX_MESSAGE_SIZE_INT;
1654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Max MMS image width (int type)
1674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
1694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_MAX_IMAGE_WIDTH = CarrierConfigManager.KEY_MMS_MAX_IMAGE_WIDTH_INT;
1704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Max MMS image height (int type)
1724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
1744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_MAX_IMAGE_HEIGHT = CarrierConfigManager.KEY_MMS_MAX_IMAGE_HEIGHT_INT;
1754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Limit of recipients of MMS messages (int type)
1774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
1794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_RECIPIENT_LIMIT = CarrierConfigManager.KEY_MMS_RECIPIENT_LIMIT_INT;
1804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Min alias character count (int type)
1824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
1844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_ALIAS_MIN_CHARS = CarrierConfigManager.KEY_MMS_ALIAS_MIN_CHARS_INT;
1854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Max alias character count (int type)
1874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
1894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_ALIAS_MAX_CHARS = CarrierConfigManager.KEY_MMS_ALIAS_MAX_CHARS_INT;
1904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * When the number of parts of a multipart SMS reaches this threshold, it should be converted
1924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * into an MMS (int type)
1934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
1944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_SMS_TO_MMS_TEXT_THRESHOLD =
1954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_SMS_TO_MMS_TEXT_THRESHOLD_INT;
1964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
1974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Some carriers require SMS to be converted into MMS when text length reaches this threshold
1984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * (int type)
1994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD =
2014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD_INT;
2024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Max message text size (int type)
2044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE =
2064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_MESSAGE_TEXT_MAX_SIZE_INT;
2074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Max message subject length (int type)
2094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
2114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_SUBJECT_MAX_LENGTH = CarrierConfigManager.KEY_MMS_SUBJECT_MAX_LENGTH_INT;
2124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * MMS HTTP socket timeout in milliseconds (int type)
2144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
2164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_HTTP_SOCKET_TIMEOUT = CarrierConfigManager.KEY_MMS_HTTP_SOCKET_TIMEOUT_INT;
2174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * The name of the UA Prof URL HTTP header for MMS HTTP request (String type)
2194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
2214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_UA_PROF_TAG_NAME = CarrierConfigManager.KEY_MMS_UA_PROF_TAG_NAME_STRING;
2224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * The User-Agent header value for MMS HTTP request (String type)
2244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
2264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_USER_AGENT = CarrierConfigManager.KEY_MMS_USER_AGENT_STRING;
2274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * The UA Profile URL header value for MMS HTTP request (String type)
2294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
2314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_UA_PROF_URL = CarrierConfigManager.KEY_MMS_UA_PROF_URL_STRING;
2324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * A list of HTTP headers to add to MMS HTTP request, separated by "|" (String type)
2344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
2364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_HTTP_PARAMS = CarrierConfigManager.KEY_MMS_HTTP_PARAMS_STRING;
2374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Email gateway number (String type)
2394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_EMAIL_GATEWAY_NUMBER =
2414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_EMAIL_GATEWAY_NUMBER_STRING;
2424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * The suffix to append to the NAI header value for MMS HTTP request (String type)
2444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String
2464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            MMS_CONFIG_NAI_SUFFIX = CarrierConfigManager.KEY_MMS_NAI_SUFFIX_STRING;
2474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * If true, show the cell broadcast (amber alert) in the SMS settings. Some carriers don't want
2494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * this shown. (Boolean type)
2504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_SHOW_CELL_BROADCAST_APP_LINKS =
2524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_SHOW_CELL_BROADCAST_APP_LINKS_BOOL;
2534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Whether the carrier MMSC supports charset field in Content-Type header. If this is false,
2554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * then we don't add "charset" to "Content-Type"
2564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_SUPPORT_HTTP_CHARSET_HEADER =
2584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_SUPPORT_HTTP_CHARSET_HEADER_BOOL;
2594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * If true, add "Connection: close" header to MMS HTTP requests so the connection
2614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * is immediately closed (disabling keep-alive). (Boolean type)
2624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @hide
2634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MMS_CONFIG_CLOSE_CONNECTION =
2654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            CarrierConfigManager.KEY_MMS_CLOSE_CONNECTION_BOOL;
2664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /*
2684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Forwarded constants from SimDialogActivity.
2694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
2704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private static String DIALOG_TYPE_KEY = "dialog_type";
2714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private static final int SMS_PICK = 2;
2724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
2734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
2744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Send a text based SMS.
2754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
2764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * <p class="note"><strong>Note:</strong> Using this method requires that your app has the
2774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@link android.Manifest.permission#SEND_SMS} permission.</p>
2784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
2794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * <p class="note"><strong>Note:</strong> Beginning with Android 4.4 (API level 19), if
2804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * <em>and only if</em> an app is not selected as the default SMS app, the system automatically
2814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * writes messages sent using this method to the SMS Provider (the default SMS app is always
2824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * responsible for writing its sent messages to the SMS Provider). For information about
2834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * how to behave as the default SMS app, see {@link android.provider.Telephony}.</p>
2844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
2854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
2864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param destinationAddress the address to send the message to
2874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param scAddress is the service center address or null to use
2884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  the current default SMSC
2894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param text the body of the message to send
2904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param sentIntent if not NULL this <code>PendingIntent</code> is
2914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  broadcast when the message is successfully sent, or failed.
2924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  The result code will be <code>Activity.RESULT_OK</code> for success,
2934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  or one of these errors:<br>
2944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
2954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  <code>RESULT_ERROR_RADIO_OFF</code><br>
2964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  <code>RESULT_ERROR_NULL_PDU</code><br>
2974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
2984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  the extra "errorCode" containing a radio technology specific value,
2994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  generally only useful for troubleshooting.<br>
3004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  The per-application based SMS control checks sentIntent. If sentIntent
3014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  is NULL the caller will be checked against all unknown applications,
3024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  which cause smaller number of SMS to be sent in checking period.
3034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
3044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  broadcast when the message is delivered to the recipient.  The
3054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  raw pdu of the status report is in the extended data ("pdu").
3064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
3074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if destinationAddress or text are empty
3084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
3094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendTextMessage(
3104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            String destinationAddress, String scAddress, String text,
3114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            PendingIntent sentIntent, PendingIntent deliveryIntent) {
312448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry        sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent,
313448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry                true /* persistMessage*/);
3144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
3154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private void sendTextMessageInternal(String destinationAddress, String scAddress,
3174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            String text, PendingIntent sentIntent, PendingIntent deliveryIntent,
318448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry            boolean persistMessage) {
3194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (TextUtils.isEmpty(destinationAddress)) {
3204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Invalid destinationAddress");
3214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (TextUtils.isEmpty(text)) {
3244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Invalid message body");
3254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
3284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsServiceOrThrow();
3294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            iccISms.sendTextForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(),
3304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    destinationAddress,
3314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    scAddress, text, sentIntent, deliveryIntent,
332448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry                    persistMessage);
3334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
3344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
3354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
3374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
3394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Send a text based SMS without writing it into the SMS Provider.
3404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
341448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry     * <p>Requires Permission:
342448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry     * {@link android.Manifest.permission#MODIFY_PHONE_STATE} or the calling app has carrier
343448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry     * privileges.
344448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry     * </p>
3454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
3464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @see #sendTextMessage(String, String, String, PendingIntent, PendingIntent)
3474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @hide
3484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
349448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry    @SystemApi
350d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
3514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendTextMessageWithoutPersisting(
3524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            String destinationAddress, String scAddress, String text,
3534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            PendingIntent sentIntent, PendingIntent deliveryIntent) {
354448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry        sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent,
355448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry                false /* persistMessage */);
3564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
3574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
3594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * A variant of {@link SmsManager#sendTextMessage} that allows self to be the caller. This is
3604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * for internal use only.
3614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
3624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param persistMessage whether to persist the sent message in the SMS app. the caller must be
3634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * the Phone process if set to false.
3644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
3654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @hide
3664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
3674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendTextMessageWithSelfPermissions(
3684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            String destinationAddress, String scAddress, String text,
3694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessage) {
3704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (TextUtils.isEmpty(destinationAddress)) {
3714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Invalid destinationAddress");
3724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (TextUtils.isEmpty(text)) {
3754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Invalid message body");
3764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
3794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsServiceOrThrow();
3804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            iccISms.sendTextForSubscriberWithSelfPermissions(getSubscriptionId(),
3814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    ActivityThread.currentPackageName(),
3824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    destinationAddress,
3834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    scAddress, text, sentIntent, deliveryIntent, persistMessage);
3844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
3854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
3864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
3874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
3884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
3894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
3904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Inject an SMS PDU into the android application framework.
3914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
392bc1a6e60c8c0555d47bcf8424af63665c8db062eAbhijith Shastry     * <p>Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} or carrier
393bc1a6e60c8c0555d47bcf8424af63665c8db062eAbhijith Shastry     * privileges. @see android.telephony.TelephonyManager#hasCarrierPrivileges
3944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
3954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param pdu is the byte array of pdu to be injected into android application framework
3964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param format is the format of SMS pdu (3gpp or 3gpp2)
3974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param receivedIntent if not NULL this <code>PendingIntent</code> is
3984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  broadcast when the message is successfully received by the
3994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  android application framework, or failed. This intent is broadcasted at
4004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  the same time an SMS received from radio is acknowledged back.
4014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  The result code will be <code>RESULT_SMS_HANDLED</code> for success, or
4024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  <code>RESULT_SMS_GENERIC_ERROR</code> for error.
4034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
4044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if format is not one of 3gpp and 3gpp2.
4054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
4064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void injectSmsPdu(byte[] pdu, String format, PendingIntent receivedIntent) {
4074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (!format.equals(SmsMessage.FORMAT_3GPP) && !format.equals(SmsMessage.FORMAT_3GPP2)) {
4084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // Format must be either 3gpp or 3gpp2.
4094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException(
4104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    "Invalid pdu format. format must be either 3gpp or 3gpp2");
4114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
4124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
4134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
4144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
4154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                iccISms.injectSmsPduForSubscriber(
4164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        getSubscriptionId(), pdu, format, receivedIntent);
4174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
4184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
4194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen          // ignore it
4204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
4214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
4224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
4244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Divide a message text into several fragments, none bigger than
4254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * the maximum SMS message size.
4264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
4274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param text the original message.  Must not be null.
4284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return an <code>ArrayList</code> of strings that, in order,
4294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   comprise the original message
4304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
4314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if text is null
4324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
4334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public ArrayList<String> divideMessage(String text) {
4344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (null == text) {
4354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("text is null");
4364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
4374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return SmsMessage.fragmentText(text);
4384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
4394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
4414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Send a multi-part text based SMS.  The callee should have already
4424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * divided the message into correctly sized parts by calling
4434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * <code>divideMessage</code>.
4444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
4454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * <p class="note"><strong>Note:</strong> Using this method requires that your app has the
4464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@link android.Manifest.permission#SEND_SMS} permission.</p>
4474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
4484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * <p class="note"><strong>Note:</strong> Beginning with Android 4.4 (API level 19), if
4494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * <em>and only if</em> an app is not selected as the default SMS app, the system automatically
4504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * writes messages sent using this method to the SMS Provider (the default SMS app is always
4514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * responsible for writing its sent messages to the SMS Provider). For information about
4524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * how to behave as the default SMS app, see {@link android.provider.Telephony}.</p>
4534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
4544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param destinationAddress the address to send the message to
4554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param scAddress is the service center address or null to use
4564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   the current default SMSC
4574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param parts an <code>ArrayList</code> of strings that, in order,
4584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   comprise the original message
4594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param sentIntents if not null, an <code>ArrayList</code> of
4604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>PendingIntent</code>s (one for each message part) that is
4614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   broadcast when the corresponding message part has been sent.
4624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   The result code will be <code>Activity.RESULT_OK</code> for success,
4634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   or one of these errors:<br>
4644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
4654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>RESULT_ERROR_RADIO_OFF</code><br>
4664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>RESULT_ERROR_NULL_PDU</code><br>
4674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   For <code>RESULT_ERROR_GENERIC_FAILURE</code> each sentIntent may include
4684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   the extra "errorCode" containing a radio technology specific value,
4694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   generally only useful for troubleshooting.<br>
4704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   The per-application based SMS control checks sentIntent. If sentIntent
4714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   is NULL the caller will be checked against all unknown applications,
4724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   which cause smaller number of SMS to be sent in checking period.
4734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param deliveryIntents if not null, an <code>ArrayList</code> of
4744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>PendingIntent</code>s (one for each message part) that is
4754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   broadcast when the corresponding message part has been delivered
4764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   to the recipient.  The raw pdu of the status report is in the
4774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   extended data ("pdu").
4784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
4794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if destinationAddress or data are empty
4804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
4814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendMultipartTextMessage(
4824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            String destinationAddress, String scAddress, ArrayList<String> parts,
4834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) {
484448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry        sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents,
485448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry                deliveryIntents, true /* persistMessage*/);
4864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
4874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private void sendMultipartTextMessageInternal(
489448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry            String destinationAddress, String scAddress, List<String> parts,
490448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry            List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents,
491448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry            boolean persistMessage) {
4924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (TextUtils.isEmpty(destinationAddress)) {
4934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Invalid destinationAddress");
4944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
4954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (parts == null || parts.size() < 1) {
4964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Invalid message body");
4974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
4984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
4994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (parts.size() > 1) {
5004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            try {
5014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                ISms iccISms = getISmsServiceOrThrow();
5024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                iccISms.sendMultipartTextForSubscriber(getSubscriptionId(),
5034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        ActivityThread.currentPackageName(),
5044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        destinationAddress, scAddress, parts,
505448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry                        sentIntents, deliveryIntents, persistMessage);
5064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            } catch (RemoteException ex) {
5074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                // ignore it
5084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
5094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } else {
5104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            PendingIntent sentIntent = null;
5114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            PendingIntent deliveryIntent = null;
5124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (sentIntents != null && sentIntents.size() > 0) {
5134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                sentIntent = sentIntents.get(0);
5144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
5154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (deliveryIntents != null && deliveryIntents.size() > 0) {
5164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                deliveryIntent = deliveryIntents.get(0);
5174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
5184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            sendTextMessage(destinationAddress, scAddress, parts.get(0),
5194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    sentIntent, deliveryIntent);
5204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
5214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
5224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
5234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
5244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Send a multi-part text based SMS without writing it into the SMS Provider.
5254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
526448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry     * <p>Requires Permission:
527448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry     * {@link android.Manifest.permission#MODIFY_PHONE_STATE} or the calling app has carrier
528448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry     * privileges.
529448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry     * </p>
5304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
5314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @see #sendMultipartTextMessage(String, String, ArrayList, ArrayList, ArrayList)
5324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @hide
5334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     **/
534448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry    @SystemApi
535d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
5364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendMultipartTextMessageWithoutPersisting(
537448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry            String destinationAddress, String scAddress, List<String> parts,
538448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry            List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) {
539448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry        sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents,
540448c12c2f3c0055ac37bbea273b7610d4d6fb557Abhijith Shastry                deliveryIntents, false /* persistMessage*/);
5414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
5424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
5434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
5444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Send a data based SMS to a specific application port.
5454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
5464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * <p class="note"><strong>Note:</strong> Using this method requires that your app has the
5474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@link android.Manifest.permission#SEND_SMS} permission.</p>
5484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
5494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param destinationAddress the address to send the message to
5504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param scAddress is the service center address or null to use
5514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  the current default SMSC
5524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param destinationPort the port to deliver the message to
5534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param data the body of the message to send
5544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param sentIntent if not NULL this <code>PendingIntent</code> is
5554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  broadcast when the message is successfully sent, or failed.
5564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  The result code will be <code>Activity.RESULT_OK</code> for success,
5574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  or one of these errors:<br>
5584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
5594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  <code>RESULT_ERROR_RADIO_OFF</code><br>
5604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  <code>RESULT_ERROR_NULL_PDU</code><br>
5614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
5624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  the extra "errorCode" containing a radio technology specific value,
5634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  generally only useful for troubleshooting.<br>
5644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  The per-application based SMS control checks sentIntent. If sentIntent
5654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  is NULL the caller will be checked against all unknown applications,
5664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  which cause smaller number of SMS to be sent in checking period.
5674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
5684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  broadcast when the message is delivered to the recipient.  The
5694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  raw pdu of the status report is in the extended data ("pdu").
5704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
5714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if destinationAddress or data are empty
5724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
5734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendDataMessage(
5744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            String destinationAddress, String scAddress, short destinationPort,
5754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
5764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (TextUtils.isEmpty(destinationAddress)) {
5774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Invalid destinationAddress");
5784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
5794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
5804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (data == null || data.length == 0) {
5814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Invalid message data");
5824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
5834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
5844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
5854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsServiceOrThrow();
5864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            iccISms.sendDataForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(),
5874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    destinationAddress, scAddress, destinationPort & 0xFFFF,
5884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    data, sentIntent, deliveryIntent);
5894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
5904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
5914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
5924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
5934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
5944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
5954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * A variant of {@link SmsManager#sendDataMessage} that allows self to be the caller. This is
5964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * for internal use only.
5974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
5984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @hide
5994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
6004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendDataMessageWithSelfPermissions(
6014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            String destinationAddress, String scAddress, short destinationPort,
6024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
6034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (TextUtils.isEmpty(destinationAddress)) {
6044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Invalid destinationAddress");
6054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
6064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
6074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (data == null || data.length == 0) {
6084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Invalid message data");
6094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
6104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
6114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
6124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsServiceOrThrow();
6134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            iccISms.sendDataForSubscriberWithSelfPermissions(getSubscriptionId(),
6144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    ActivityThread.currentPackageName(), destinationAddress, scAddress,
6154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    destinationPort & 0xFFFF, data, sentIntent, deliveryIntent);
6164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
6174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
6184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
6194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
6204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
6214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
6224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
6234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
6244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Get the SmsManager associated with the default subscription id. The instance will always be
6254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * associated with the default subscription id, even if the default subscription id is changed.
6264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
6274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return the SmsManager associated with the default subscription id
6284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
6294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static SmsManager getDefault() {
6304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return sInstance;
6314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
6324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
6334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
6344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Get the the instance of the SmsManager associated with a particular subscription id
6354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
6364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param subId an SMS subscription id, typically accessed using
6374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   {@link android.telephony.SubscriptionManager}
6384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return the instance of the SmsManager associated with subId
6394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
6404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static SmsManager getSmsManagerForSubscriptionId(int subId) {
6414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        // TODO(shri): Add javadoc link once SubscriptionManager is made public api
6424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        synchronized(sLockObject) {
6434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            SmsManager smsManager = sSubInstances.get(subId);
6444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (smsManager == null) {
6454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                smsManager = new SmsManager(subId);
6464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                sSubInstances.put(subId, smsManager);
6474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
6484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            return smsManager;
6494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
6504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
6514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
6524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private SmsManager(int subId) {
6534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        mSubId = subId;
6544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
6554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
6564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
6574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Get the associated subscription id. If the instance was returned by {@link #getDefault()},
6584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * then this method may return different values at different points in time (if the user
6594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * changes the default subscription id). It will return < 0 if the default subscription id
6604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * cannot be determined.
6614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
6624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Additionally, to support legacy applications that are not multi-SIM aware,
6634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * if the following are true:
6644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *     - We are using a multi-SIM device
6654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *     - A default SMS SIM has not been selected
6664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *     - At least one SIM subscription is available
6674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * then ask the user to set the default SMS SIM.
6684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
6694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return associated subscription id
6704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
6714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public int getSubscriptionId() {
6724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        final int subId = (mSubId == DEFAULT_SUBSCRIPTION_ID)
6734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                ? getDefaultSmsSubscriptionId() : mSubId;
6744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        boolean isSmsSimPickActivityNeeded = false;
6754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        final Context context = ActivityThread.currentApplication().getApplicationContext();
6764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
6774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
6784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
6794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                isSmsSimPickActivityNeeded = iccISms.isSmsSimPickActivityNeeded(subId);
6804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
6814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
6824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            Log.e(TAG, "Exception in getSubscriptionId");
6834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
6844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
6854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (isSmsSimPickActivityNeeded) {
6864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            Log.d(TAG, "getSubscriptionId isSmsSimPickActivityNeeded is true");
6874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ask the user for a default SMS SIM.
6884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            Intent intent = new Intent();
6894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            intent.setClassName("com.android.settings",
6904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    "com.android.settings.sim.SimDialogActivity");
6914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
6924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            intent.putExtra(DIALOG_TYPE_KEY, SMS_PICK);
6934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            try {
6944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                context.startActivity(intent);
6954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            } catch (ActivityNotFoundException anfe) {
6964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                // If Settings is not installed, only log the error as we do not want to break
6974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                // legacy applications.
6984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                Log.e(TAG, "Unable to launch Settings application.");
6994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
7004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
7014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
7024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return subId;
7034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
7044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
7054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
7064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Returns the ISms service, or throws an UnsupportedOperationException if
7074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * the service does not exist.
7084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
7094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private static ISms getISmsServiceOrThrow() {
7104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        ISms iccISms = getISmsService();
7114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (iccISms == null) {
7124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new UnsupportedOperationException("Sms is not supported");
7134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
7144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return iccISms;
7154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
7164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
7174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private static ISms getISmsService() {
7184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return ISms.Stub.asInterface(ServiceManager.getService("isms"));
7194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
7204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
7214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
7224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Copy a raw SMS PDU to the ICC.
7234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * ICC (Integrated Circuit Card) is the card of the device.
7244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * For example, this can be the SIM or USIM for GSM.
7254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
7264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param smsc the SMSC for this message, or NULL for the default SMSC
7274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param pdu the raw PDU to store
7284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param status message status (STATUS_ON_ICC_READ, STATUS_ON_ICC_UNREAD,
7294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *               STATUS_ON_ICC_SENT, STATUS_ON_ICC_UNSENT)
7304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true for success
7314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
7324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if pdu is NULL
7334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
7344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
7354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean copyMessageToIcc(byte[] smsc, byte[] pdu,int status) {
7364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        boolean success = false;
7374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
7384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (null == pdu) {
7394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("pdu is NULL");
7404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
7414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
7424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
7434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
7444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                success = iccISms.copyMessageToIccEfForSubscriber(getSubscriptionId(),
7454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        ActivityThread.currentPackageName(),
7464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        status, pdu, smsc);
7474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
7484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
7494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
7504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
7514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
7524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return success;
7534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
7544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
7554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
7564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Delete the specified message from the ICC.
7574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * ICC (Integrated Circuit Card) is the card of the device.
7584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * For example, this can be the SIM or USIM for GSM.
7594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
7604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param messageIndex is the record index of the message on ICC
7614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true for success
7624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
7634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
7644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
7654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean
7664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    deleteMessageFromIcc(int messageIndex) {
7674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        boolean success = false;
768e97d1c6a8f95c240b0e990ce73d43e07c3cf413dNathan Harold        byte[] pdu = new byte[SMS_RECORD_LENGTH-1];
7694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        Arrays.fill(pdu, (byte)0xff);
7704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
7714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
7724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
7734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
7744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                success = iccISms.updateMessageOnIccEfForSubscriber(getSubscriptionId(),
7754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        ActivityThread.currentPackageName(),
7764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        messageIndex, STATUS_ON_ICC_FREE, pdu);
7774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
7784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
7794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
7804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
7814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
7824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return success;
7834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
7844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
7854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
7864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Update the specified message on the ICC.
7874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * ICC (Integrated Circuit Card) is the card of the device.
7884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * For example, this can be the SIM or USIM for GSM.
7894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
7904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param messageIndex record index of message to update
7914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param newStatus new message status (STATUS_ON_ICC_READ,
7924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *                  STATUS_ON_ICC_UNREAD, STATUS_ON_ICC_SENT,
7934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *                  STATUS_ON_ICC_UNSENT, STATUS_ON_ICC_FREE)
7944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param pdu the raw PDU to store
7954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true for success
7964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
7974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
7984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
7994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean updateMessageOnIcc(int messageIndex, int newStatus, byte[] pdu) {
8004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        boolean success = false;
8014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
8024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
8034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
8044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
8054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                success = iccISms.updateMessageOnIccEfForSubscriber(getSubscriptionId(),
8064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        ActivityThread.currentPackageName(),
8074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        messageIndex, newStatus, pdu);
8084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
8094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
8104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
8114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
8124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
8134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return success;
8144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
8154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
8164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
8174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Retrieves all messages currently stored on ICC.
8184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * ICC (Integrated Circuit Card) is the card of the device.
8194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * For example, this can be the SIM or USIM for GSM.
8204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
8214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return <code>ArrayList</code> of <code>SmsMessage</code> objects
8224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
8234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
8244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
8254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public ArrayList<SmsMessage> getAllMessagesFromIcc() {
8264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        List<SmsRawData> records = null;
8274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
8284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
8294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
8304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
8314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                records = iccISms.getAllMessagesFromIccEfForSubscriber(
8324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        getSubscriptionId(),
8334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        ActivityThread.currentPackageName());
8344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
8354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
8364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
8374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
8384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
8394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return createMessageListFromRawRecords(records);
8404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
8414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
8424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
8434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Enable reception of cell broadcast (SMS-CB) messages with the given
8444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * message identifier and RAN type. The RAN type specify this message ID
8454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * belong to 3GPP (GSM) or 3GPP2(CDMA).Note that if two different clients
8464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * enable the same message identifier, they must both disable it for the device to stop
8474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * receiving those messages. All received messages will be broadcast in an
8484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * intent with the action "android.provider.Telephony.SMS_CB_RECEIVED".
8494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Note: This call is blocking, callers may want to avoid calling it from
8504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * the main thread of an application.
8514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
8524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param messageIdentifier Message identifier as specified in TS 23.041 (3GPP)
8534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * or C.R1001-G (3GPP2)
8544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param ranType as defined in class SmsManager, the value can be one of these:
8554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *    android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM
8564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *    android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA
8574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true if successful, false otherwise
8584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @see #disableCellBroadcast(int, int)
8594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
8604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
8614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
8624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean enableCellBroadcast(int messageIdentifier, int ranType) {
8634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        boolean success = false;
8644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
8654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
8664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
8674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
8684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                success = iccISms.enableCellBroadcastForSubscriber(
8694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        getSubscriptionId(), messageIdentifier, ranType);
8704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
8714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
8724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
8734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
8744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
8754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return success;
8764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
8774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
8784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
8794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Disable reception of cell broadcast (SMS-CB) messages with the given
8804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * message identifier and RAN type. The RAN type specify this message ID
8814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * belong to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different clients
8824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * enable the same message identifier, they must both disable it for the
8834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * device to stop receiving those messages.
8844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Note: This call is blocking, callers may want to avoid calling it from
8854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * the main thread of an application.
8864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
8874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param messageIdentifier Message identifier as specified in TS 23.041 (3GPP)
8884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * or C.R1001-G (3GPP2)
8894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param ranType as defined in class SmsManager, the value can be one of these:
8904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *    android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM
8914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *    android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA
8924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true if successful, false otherwise
8934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
8944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @see #enableCellBroadcast(int, int)
8954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
8964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
8974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
8984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean disableCellBroadcast(int messageIdentifier, int ranType) {
8994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        boolean success = false;
9004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
9014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
9024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
9034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
9044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                success = iccISms.disableCellBroadcastForSubscriber(
9054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        getSubscriptionId(), messageIdentifier, ranType);
9064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
9074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
9084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
9094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
9104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
9114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return success;
9124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
9134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
9144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
9154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Enable reception of cell broadcast (SMS-CB) messages with the given
9164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * message identifier range and RAN type. The RAN type specify this message ID
9174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * belong to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different clients enable
9184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * the same message identifier, they must both disable it for the device to stop
9194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * receiving those messages. All received messages will be broadcast in an
9204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * intent with the action "android.provider.Telephony.SMS_CB_RECEIVED".
9214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Note: This call is blocking, callers may want to avoid calling it from
9224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * the main thread of an application.
9234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
9244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param startMessageId first message identifier as specified in TS 23.041 (3GPP)
9254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * or C.R1001-G (3GPP2)
9264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param endMessageId last message identifier as specified in TS 23.041 (3GPP)
9274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * or C.R1001-G (3GPP2)
9284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param ranType as defined in class SmsManager, the value can be one of these:
9294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *    android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM
9304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *    android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA
9314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true if successful, false otherwise
9324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @see #disableCellBroadcastRange(int, int, int)
9334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
9344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if endMessageId < startMessageId
9354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
9364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
9374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean enableCellBroadcastRange(int startMessageId, int endMessageId, int ranType) {
9384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        boolean success = false;
9394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
9404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (endMessageId < startMessageId) {
9414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("endMessageId < startMessageId");
9424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
9434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
9444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
9454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
9464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                success = iccISms.enableCellBroadcastRangeForSubscriber(getSubscriptionId(),
9474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        startMessageId, endMessageId, ranType);
9484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
9494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
9504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
9514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
9524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
9534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return success;
9544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
9554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
9564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
9574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Disable reception of cell broadcast (SMS-CB) messages with the given
9584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * message identifier range and RAN type. The RAN type specify this message
9594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * ID range belong to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different
9604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * clients enable the same message identifier, they must both disable it for
9614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * the device to stop receiving those messages.
9624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Note: This call is blocking, callers may want to avoid calling it from
9634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * the main thread of an application.
9644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
9654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param startMessageId first message identifier as specified in TS 23.041 (3GPP)
9664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * or C.R1001-G (3GPP2)
9674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param endMessageId last message identifier as specified in TS 23.041 (3GPP)
9684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * or C.R1001-G (3GPP2)
9694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param ranType as defined in class SmsManager, the value can be one of these:
9704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *    android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM
9714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *    android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA
9724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true if successful, false otherwise
9734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
9744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @see #enableCellBroadcastRange(int, int, int)
9754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
9764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if endMessageId < startMessageId
9774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
9784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
9794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean disableCellBroadcastRange(int startMessageId, int endMessageId, int ranType) {
9804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        boolean success = false;
9814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
9824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (endMessageId < startMessageId) {
9834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("endMessageId < startMessageId");
9844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
9854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
9864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
9874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
9884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                success = iccISms.disableCellBroadcastRangeForSubscriber(getSubscriptionId(),
9894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        startMessageId, endMessageId, ranType);
9904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
9914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
9924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
9934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
9944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
9954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return success;
9964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
9974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
9984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
9994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Create a list of <code>SmsMessage</code>s from a list of RawSmsData
10004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * records returned by <code>getAllMessagesFromIcc()</code>
10014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
10024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param records SMS EF records, returned by
10034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>getAllMessagesFromIcc</code>
10044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return <code>ArrayList</code> of <code>SmsMessage</code> objects.
10054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
10064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    private static ArrayList<SmsMessage> createMessageListFromRawRecords(List<SmsRawData> records) {
10074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        ArrayList<SmsMessage> messages = new ArrayList<SmsMessage>();
10084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (records != null) {
10094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            int count = records.size();
10104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            for (int i = 0; i < count; i++) {
10114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                SmsRawData data = records.get(i);
10124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                // List contains all records, including "free" records (null)
10134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                if (data != null) {
10144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    SmsMessage sms = SmsMessage.createFromEfRecord(i+1, data.getBytes());
10154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    if (sms != null) {
10164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        messages.add(sms);
10174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    }
10184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                }
10194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
10204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
10214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return messages;
10224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
10234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
10244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
10254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * SMS over IMS is supported if IMS is registered and SMS is supported
10264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * on IMS.
10274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
10284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true if SMS over IMS is supported, false otherwise
10294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
10304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @see #getImsSmsFormat()
10314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
10324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @hide
10334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
10344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean isImsSmsSupported() {
10354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        boolean boSupported = false;
10364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
10374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
10384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
10394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                boSupported = iccISms.isImsSmsSupportedForSubscriber(getSubscriptionId());
10404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
10414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
10424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
10434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
10444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return boSupported;
10454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
10464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
10474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
10484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Gets SMS format supported on IMS.  SMS over IMS format is
10494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * either 3GPP or 3GPP2.
10504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
10514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return SmsMessage.FORMAT_3GPP,
10524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *         SmsMessage.FORMAT_3GPP2
10534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *      or SmsMessage.FORMAT_UNKNOWN
10544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
10554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @see #isImsSmsSupported()
10564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
10574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @hide
10584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
10594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public String getImsSmsFormat() {
10604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        String format = com.android.internal.telephony.SmsConstants.FORMAT_UNKNOWN;
10614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
10624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsService();
10634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iccISms != null) {
10644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                format = iccISms.getImsSmsFormatForSubscriber(getSubscriptionId());
10654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
10664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
10674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
10684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
10694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return format;
10704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
10714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
10724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
10734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Get default sms subscription id
10744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
10754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return the default SMS subscription id
10764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
10774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static int getDefaultSmsSubscriptionId() {
10784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        ISms iccISms = null;
10794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
10804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
10814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            return iccISms.getPreferredSmsSubscription();
10824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
10834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            return -1;
10844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (NullPointerException ex) {
10854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            return -1;
10864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
10874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
10884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
10894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
10904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Get SMS prompt property,  enabled or not
10914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
10924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true if enabled, false otherwise
10934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @hide
10944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
10954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean isSMSPromptEnabled() {
10964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        ISms iccISms = null;
10974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
10984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
10994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            return iccISms.isSMSPromptEnabled();
11004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
11014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            return false;
11024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (NullPointerException ex) {
11034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            return false;
11044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
11054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
11064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // see SmsMessage.getStatusOnIcc
11084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Free space (TS 51.011 10.5.3 / 3GPP2 C.S0023 3.4.27). */
11104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int STATUS_ON_ICC_FREE      = 0;
11114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Received and read (TS 51.011 10.5.3 / 3GPP2 C.S0023 3.4.27). */
11134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int STATUS_ON_ICC_READ      = 1;
11144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Received and unread (TS 51.011 10.5.3 / 3GPP2 C.S0023 3.4.27). */
11164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int STATUS_ON_ICC_UNREAD    = 3;
11174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Stored and sent (TS 51.011 10.5.3 / 3GPP2 C.S0023 3.4.27). */
11194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int STATUS_ON_ICC_SENT      = 5;
11204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Stored and unsent (TS 51.011 10.5.3 / 3GPP2 C.S0023 3.4.27). */
11224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int STATUS_ON_ICC_UNSENT    = 7;
11234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // SMS send failure result codes
11254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Generic failure cause */
11274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int RESULT_ERROR_GENERIC_FAILURE    = 1;
11284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Failed because radio was explicitly turned off */
11294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int RESULT_ERROR_RADIO_OFF          = 2;
11304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Failed because no pdu provided */
11314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int RESULT_ERROR_NULL_PDU           = 3;
11324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Failed because service is currently unavailable */
11334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int RESULT_ERROR_NO_SERVICE         = 4;
1134724f621daa9ef38fea39558036b2f08ed4a9e885sqian    /** Failed because we reached the sending queue limit. */
11354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int RESULT_ERROR_LIMIT_EXCEEDED     = 5;
11364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Failed because FDN is enabled. {@hide} */
11374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static public final int RESULT_ERROR_FDN_CHECK_FAILURE  = 6;
1138724f621daa9ef38fea39558036b2f08ed4a9e885sqian    /** Failed because user denied the sending of this short code. */
1139724f621daa9ef38fea39558036b2f08ed4a9e885sqian    static public final int RESULT_ERROR_SHORT_CODE_NOT_ALLOWED = 7;
1140724f621daa9ef38fea39558036b2f08ed4a9e885sqian    /** Failed because the user has denied this app ever send premium short codes. */
1141724f621daa9ef38fea39558036b2f08ed4a9e885sqian    static public final int RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED = 8;
11424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    static private final String PHONE_PACKAGE_NAME = "com.android.phone";
11444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
11464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Send an MMS message
11474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
11484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param context application context
11494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param contentUri the content Uri from which the message pdu will be read
11504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param locationUrl the optional location url where message should be sent to
11514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param configOverrides the carrier-specific messaging configuration values to override for
11524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  sending the message.
11534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param sentIntent if not NULL this <code>PendingIntent</code> is
11544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  broadcast when the message is successfully sent, or failed
11554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if contentUri is empty
11564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
11574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendMultimediaMessage(Context context, Uri contentUri, String locationUrl,
11584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            Bundle configOverrides, PendingIntent sentIntent) {
11594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (contentUri == null) {
11604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Uri contentUri null");
11614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
11624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
11634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            final IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
11644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms == null) {
11654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return;
11664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
11674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            iMms.sendMessage(getSubscriptionId(), ActivityThread.currentPackageName(), contentUri,
11694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    locationUrl, configOverrides, sentIntent);
11704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException e) {
11714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // Ignore it
11724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
11734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
11744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
11754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
11764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Download an MMS message from carrier by a given location URL
11774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
11784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param context application context
11794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param locationUrl the location URL of the MMS message to be downloaded, usually obtained
11804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  from the MMS WAP push notification
11814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param contentUri the content uri to which the downloaded pdu will be written
11824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param configOverrides the carrier-specific messaging configuration values to override for
11834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  downloading the message.
11844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param downloadedIntent if not NULL this <code>PendingIntent</code> is
11854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  broadcast when the message is downloaded, or the download is failed
11864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if locationUrl or contentUri is empty
11874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
11884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void downloadMultimediaMessage(Context context, String locationUrl, Uri contentUri,
11894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            Bundle configOverrides, PendingIntent downloadedIntent) {
11904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (TextUtils.isEmpty(locationUrl)) {
11914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Empty MMS location URL");
11924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
11934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (contentUri == null) {
11944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Uri contentUri null");
11954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
11964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
11974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            final IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
11984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms == null) {
11994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return;
12004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
12014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            iMms.downloadMessage(
12024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    getSubscriptionId(), ActivityThread.currentPackageName(), locationUrl,
12034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    contentUri, configOverrides, downloadedIntent);
12044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException e) {
12054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // Ignore it
12064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
12074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
12084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
12094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    // MMS send/download failure result codes
12104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int MMS_ERROR_UNSPECIFIED = 1;
12114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int MMS_ERROR_INVALID_APN = 2;
12124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int MMS_ERROR_UNABLE_CONNECT_MMS = 3;
12134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int MMS_ERROR_HTTP_FAILURE = 4;
12144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int MMS_ERROR_IO_ERROR = 5;
12154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int MMS_ERROR_RETRY = 6;
12164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int MMS_ERROR_CONFIGURATION_ERROR = 7;
12174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int MMS_ERROR_NO_DATA_NETWORK = 8;
12184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
12194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Intent extra name for MMS sending result data in byte array type */
12204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String EXTRA_MMS_DATA = "android.telephony.extra.MMS_DATA";
12214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Intent extra name for HTTP status code for MMS HTTP failure in integer type */
12224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String EXTRA_MMS_HTTP_STATUS = "android.telephony.extra.MMS_HTTP_STATUS";
12234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
12244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
12254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Import a text message into system's SMS store
12264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
12274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Only default SMS apps can import SMS
12284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
12294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param address the destination(source) address of the sent(received) message
12304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param type the type of the message
12314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param text the message text
12324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param timestampMillis the message timestamp in milliseconds
12334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param seen if the message is seen
12344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param read if the message is read
12354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return the message URI, null if failed
12364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @hide
12374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
12384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public Uri importTextMessage(String address, int type, String text, long timestampMillis,
12394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            boolean seen, boolean read) {
12404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
12414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
12424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
12434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return iMms.importTextMessage(ActivityThread.currentPackageName(),
12444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        address, type, text, timestampMillis, seen, read);
12454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
12464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
12474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
12484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
12494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return null;
12504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
12514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
12524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Represents the received SMS message for importing {@hide} */
12534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int SMS_TYPE_INCOMING = 0;
12544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Represents the sent SMS message for importing {@hide} */
12554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final int SMS_TYPE_OUTGOING = 1;
12564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
12574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
12584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Import a multimedia message into system's MMS store. Only the following PDU type is
12594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * supported: Retrieve.conf, Send.req, Notification.ind, Delivery.ind, Read-Orig.ind
12604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
12614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Only default SMS apps can import MMS
12624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
12634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param contentUri the content uri from which to read the PDU of the message to import
12644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param messageId the optional message id. Use null if not specifying
12654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param timestampSecs the optional message timestamp. Use -1 if not specifying
12664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param seen if the message is seen
12674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param read if the message is read
12684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return the message URI, null if failed
12694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if pdu is empty
12704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
12714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
12724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public Uri importMultimediaMessage(Uri contentUri, String messageId, long timestampSecs,
12734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            boolean seen, boolean read) {
12744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (contentUri == null) {
12754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Uri contentUri null");
12764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
12774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
12784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
12794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
12804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return iMms.importMultimediaMessage(ActivityThread.currentPackageName(),
12814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        contentUri, messageId, timestampSecs, seen, read);
12824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
12834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
12844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
12854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
12864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return null;
12874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
12884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
12894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
12904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Delete a system stored SMS or MMS message
12914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
12924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Only default SMS apps can delete system stored SMS and MMS messages
12934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
12944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param messageUri the URI of the stored message
12954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true if deletion is successful, false otherwise
12964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if messageUri is empty
12974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
12984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
12994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean deleteStoredMessage(Uri messageUri) {
13004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (messageUri == null) {
13014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Empty message URI");
13024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
13034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
13044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
13054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
13064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return iMms.deleteStoredMessage(ActivityThread.currentPackageName(), messageUri);
13074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
13084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
13094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
13104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
13114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return false;
13124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
13134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
13144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
13154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Delete a system stored SMS or MMS thread
13164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
13174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Only default SMS apps can delete system stored SMS and MMS conversations
13184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
13194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param conversationId the ID of the message conversation
13204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true if deletion is successful, false otherwise
13214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
13224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
13234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean deleteStoredConversation(long conversationId) {
13244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
13254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
13264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
13274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return iMms.deleteStoredConversation(
13284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        ActivityThread.currentPackageName(), conversationId);
13294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
13304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
13314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
13324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
13334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return false;
13344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
13354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
13364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
13374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Update the status properties of a system stored SMS or MMS message, e.g.
13384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * the read status of a message, etc.
13394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
13404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param messageUri the URI of the stored message
13414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param statusValues a list of status properties in key-value pairs to update
13424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true if update is successful, false otherwise
13434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if messageUri is empty
13444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
13454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
13464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean updateStoredMessageStatus(Uri messageUri, ContentValues statusValues) {
13474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (messageUri == null) {
13484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Empty message URI");
13494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
13504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
13514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
13524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
13534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return iMms.updateStoredMessageStatus(ActivityThread.currentPackageName(),
13544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        messageUri, statusValues);
13554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
13564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
13574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
13584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
13594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return false;
13604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
13614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
13624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Message status property: whether the message has been seen. 1 means seen, 0 not {@hide} */
13634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MESSAGE_STATUS_SEEN = "seen";
13644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /** Message status property: whether the message has been read. 1 means read, 0 not {@hide} */
13654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static final String MESSAGE_STATUS_READ = "read";
13664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
13674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
13684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Archive or unarchive a stored conversation
13694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
13704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param conversationId the ID of the message conversation
13714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param archived true to archive the conversation, false to unarchive
13724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return true if update is successful, false otherwise
13734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
13744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
13754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean archiveStoredConversation(long conversationId, boolean archived) {
13764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
13774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
13784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
13794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return iMms.archiveStoredConversation(ActivityThread.currentPackageName(),
13804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        conversationId, archived);
13814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
13824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
13834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
13844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
13854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return false;
13864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
13874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
13884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
13894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Add a text message draft to system SMS store
13904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
13914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Only default SMS apps can add SMS draft
13924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
13934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param address the destination address of message
13944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param text the body of the message to send
13954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return the URI of the stored draft message
13964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
13974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
13984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public Uri addTextMessageDraft(String address, String text) {
13994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
14004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
14014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
14024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return iMms.addTextMessageDraft(ActivityThread.currentPackageName(), address, text);
14034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
14044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
14054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
14064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
14074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return null;
14084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
14094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
14104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
14114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Add a multimedia message draft to system MMS store
14124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
14134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Only default SMS apps can add MMS draft
14144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
14154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param contentUri the content uri from which to read the PDU data of the draft MMS
14164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return the URI of the stored draft message
14174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if pdu is empty
14184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
14194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
14204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public Uri addMultimediaMessageDraft(Uri contentUri) {
14214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (contentUri == null) {
14224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Uri contentUri null");
14234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
14244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
14254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
14264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
14274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return iMms.addMultimediaMessageDraft(ActivityThread.currentPackageName(),
14284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        contentUri);
14294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
14304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
14314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
14324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
14334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return null;
14344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
14354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
14364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
14374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Send a system stored text message.
14384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
14394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * You can only send a failed text message or a draft text message.
14404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
14414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param messageUri the URI of the stored message
14424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param scAddress is the service center address or null to use the current default SMSC
14434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param sentIntent if not NULL this <code>PendingIntent</code> is
14444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  broadcast when the message is successfully sent, or failed.
14454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  The result code will be <code>Activity.RESULT_OK</code> for success,
14464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  or one of these errors:<br>
14474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
14484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  <code>RESULT_ERROR_RADIO_OFF</code><br>
14494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  <code>RESULT_ERROR_NULL_PDU</code><br>
14504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
14514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  the extra "errorCode" containing a radio technology specific value,
14524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  generally only useful for troubleshooting.<br>
14534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  The per-application based SMS control checks sentIntent. If sentIntent
14544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  is NULL the caller will be checked against all unknown applications,
14554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  which cause smaller number of SMS to be sent in checking period.
14564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
14574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  broadcast when the message is delivered to the recipient.  The
14584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  raw pdu of the status report is in the extended data ("pdu").
14594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
14604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if messageUri is empty
14614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
14624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
14634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendStoredTextMessage(Uri messageUri, String scAddress, PendingIntent sentIntent,
14644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            PendingIntent deliveryIntent) {
14654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (messageUri == null) {
14664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Empty message URI");
14674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
14684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
14694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsServiceOrThrow();
14704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            iccISms.sendStoredText(
14714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    getSubscriptionId(), ActivityThread.currentPackageName(), messageUri,
14724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    scAddress, sentIntent, deliveryIntent);
14734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
14744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
14754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
14764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
14774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
14784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
14794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Send a system stored multi-part text message.
14804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
14814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * You can only send a failed text message or a draft text message.
14824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * The provided <code>PendingIntent</code> lists should match the part number of the
14834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * divided text of the stored message by using <code>divideMessage</code>
14844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
14854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param messageUri the URI of the stored message
14864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param scAddress is the service center address or null to use
14874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   the current default SMSC
14884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param sentIntents if not null, an <code>ArrayList</code> of
14894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>PendingIntent</code>s (one for each message part) that is
14904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   broadcast when the corresponding message part has been sent.
14914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   The result code will be <code>Activity.RESULT_OK</code> for success,
14924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   or one of these errors:<br>
14934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
14944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>RESULT_ERROR_RADIO_OFF</code><br>
14954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>RESULT_ERROR_NULL_PDU</code><br>
14964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   For <code>RESULT_ERROR_GENERIC_FAILURE</code> each sentIntent may include
14974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   the extra "errorCode" containing a radio technology specific value,
14984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   generally only useful for troubleshooting.<br>
14994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   The per-application based SMS control checks sentIntent. If sentIntent
15004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   is NULL the caller will be checked against all unknown applications,
15014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   which cause smaller number of SMS to be sent in checking period.
15024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param deliveryIntents if not null, an <code>ArrayList</code> of
15034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   <code>PendingIntent</code>s (one for each message part) that is
15044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   broadcast when the corresponding message part has been delivered
15054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   to the recipient.  The raw pdu of the status report is in the
15064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *   extended data ("pdu").
15074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
15084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if messageUri is empty
15094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
15104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
15114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendStoredMultipartTextMessage(Uri messageUri, String scAddress,
15124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) {
15134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (messageUri == null) {
15144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Empty message URI");
15154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
15164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
15174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccISms = getISmsServiceOrThrow();
15184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            iccISms.sendStoredMultipartText(
15194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    getSubscriptionId(), ActivityThread.currentPackageName(), messageUri,
15204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    scAddress, sentIntents, deliveryIntents);
15214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
15224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
15234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
15244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
15254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
15264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
15274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Send a system stored MMS message
15284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
15294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * This is used for sending a previously sent, but failed-to-send, message or
15304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * for sending a text message that has been stored as a draft.
15314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
15324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param messageUri the URI of the stored message
15334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param configOverrides the carrier-specific messaging configuration values to override for
15344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  sending the message.
15354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param sentIntent if not NULL this <code>PendingIntent</code> is
15364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *  broadcast when the message is successfully sent, or failed
15374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @throws IllegalArgumentException if messageUri is empty
15384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
15394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
15404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void sendStoredMultimediaMessage(Uri messageUri, Bundle configOverrides,
15414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            PendingIntent sentIntent) {
15424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        if (messageUri == null) {
15434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            throw new IllegalArgumentException("Empty message URI");
15444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
15454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
15464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
15474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
15484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                iMms.sendStoredMessage(
15494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        getSubscriptionId(), ActivityThread.currentPackageName(), messageUri,
15504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                        configOverrides, sentIntent);
15514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
15524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
15534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
15544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
15554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
15564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
15574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
15584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Turns on/off the flag to automatically write sent/received SMS/MMS messages into system
15594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
15604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * When this flag is on, all SMS/MMS sent/received are stored by system automatically
15614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * When this flag is off, only SMS/MMS sent by non-default SMS apps are stored by system
15624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * automatically
15634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
15644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * This flag can only be changed by default SMS apps
15654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
15664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param enabled Whether to enable message auto persisting
15674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
15684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
15694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public void setAutoPersisting(boolean enabled) {
15704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
15714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
15724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
15734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                iMms.setAutoPersisting(ActivityThread.currentPackageName(), enabled);
15744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
15754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
15764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
15774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
15784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
15794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
15804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
15814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Get the value of the flag to automatically write sent/received SMS/MMS messages into system
15824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
15834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * When this flag is on, all SMS/MMS sent/received are stored by system automatically
15844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * When this flag is off, only SMS/MMS sent by non-default SMS apps are stored by system
15854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * automatically
15864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
15874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return the current value of the auto persist flag
15884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@hide}
15894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
15904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public boolean getAutoPersisting() {
15914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
15924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
15934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
15944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return iMms.getAutoPersisting();
15954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
15964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
15974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
15984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
15994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return false;
16004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
16014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
16024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
16034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Get carrier-dependent configuration values.
16044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
16054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return bundle key/values pairs of configuration values
16064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
16074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public Bundle getCarrierConfigValues() {
16084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
16094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));
16104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            if (iMms != null) {
16114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                return iMms.getCarrierConfigValues(getSubscriptionId());
16124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            }
16134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
16144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            // ignore it
16154980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
16164980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return null;
16174980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
16184980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
16194980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
16204980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Create a single use app specific incoming SMS request for the the calling package.
16214980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
16224980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * This method returns a token that if included in a subsequent incoming SMS message will cause
16234980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * {@code intent} to be sent with the SMS data.
16244980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
16254980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * The token is only good for one use, after an SMS has been received containing the token all
16264980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * subsequent SMS messages with the token will be routed as normal.
16274980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
16284980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * An app can only have one request at a time, if the app already has a request pending it will
16294980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * be replaced with a new request.
16304980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
16314980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return Token to include in an SMS message. The token will be 11 characters long.
16324980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @see android.provider.Telephony.Sms.Intents#getMessagesFromIntent
16334980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
16344980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public String createAppSpecificSmsToken(PendingIntent intent) {
16354980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        try {
16364980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ISms iccSms = getISmsServiceOrThrow();
16374980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            return iccSms.createAppSpecificSmsToken(getSubscriptionId(),
16384980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                    ActivityThread.currentPackageName(), intent);
16394980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
16404980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        } catch (RemoteException ex) {
16414980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            ex.rethrowFromSystemServer();
16424980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen            return null;
16434980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        }
16444980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
16454980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
16464980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    /**
16474980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * Filters a bundle to only contain MMS config variables.
16484980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
16494980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * This is for use with bundles returned by {@link CarrierConfigManager} which contain MMS
16504980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * config and unrelated config. It is assumed that all MMS_CONFIG_* keys are present in the
16514980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * supplied bundle.
16524980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     *
16534980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @param config a Bundle that contains MMS config variables and possibly more.
16544980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @return a new Bundle that only contains the MMS_CONFIG_* keys defined above.
16554980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     * @hide
16564980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen     */
16574980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    public static Bundle getMmsConfig(BaseBundle config) {
16584980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        Bundle filtered = new Bundle();
16594980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_APPEND_TRANSACTION_ID,
16604980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_APPEND_TRANSACTION_ID));
16614980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_MMS_ENABLED, config.getBoolean(MMS_CONFIG_MMS_ENABLED));
16624980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_GROUP_MMS_ENABLED,
16634980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_GROUP_MMS_ENABLED));
16644980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED,
16654980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED));
16664980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_ALIAS_ENABLED, config.getBoolean(MMS_CONFIG_ALIAS_ENABLED));
16674980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_ALLOW_ATTACH_AUDIO,
16684980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_ALLOW_ATTACH_AUDIO));
16694980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_MULTIPART_SMS_ENABLED,
16704980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_MULTIPART_SMS_ENABLED));
16714980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_SMS_DELIVERY_REPORT_ENABLED,
16724980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_SMS_DELIVERY_REPORT_ENABLED));
16734980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION,
16744980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION));
16754980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES,
16764980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES));
16774980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_MMS_READ_REPORT_ENABLED,
16784980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_MMS_READ_REPORT_ENABLED));
16794980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED,
16804980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED));
16814980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_CLOSE_CONNECTION,
16824980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_CLOSE_CONNECTION));
16834980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_MAX_MESSAGE_SIZE, config.getInt(MMS_CONFIG_MAX_MESSAGE_SIZE));
16844980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_MAX_IMAGE_WIDTH, config.getInt(MMS_CONFIG_MAX_IMAGE_WIDTH));
16854980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_MAX_IMAGE_HEIGHT, config.getInt(MMS_CONFIG_MAX_IMAGE_HEIGHT));
16864980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_RECIPIENT_LIMIT, config.getInt(MMS_CONFIG_RECIPIENT_LIMIT));
16874980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_ALIAS_MIN_CHARS, config.getInt(MMS_CONFIG_ALIAS_MIN_CHARS));
16884980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_ALIAS_MAX_CHARS, config.getInt(MMS_CONFIG_ALIAS_MAX_CHARS));
16894980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_SMS_TO_MMS_TEXT_THRESHOLD,
16904980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getInt(MMS_CONFIG_SMS_TO_MMS_TEXT_THRESHOLD));
16914980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD,
16924980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getInt(MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD));
16934980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE,
16944980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getInt(MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE));
16954980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_SUBJECT_MAX_LENGTH,
16964980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getInt(MMS_CONFIG_SUBJECT_MAX_LENGTH));
16974980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putInt(MMS_CONFIG_HTTP_SOCKET_TIMEOUT,
16984980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getInt(MMS_CONFIG_HTTP_SOCKET_TIMEOUT));
16994980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putString(MMS_CONFIG_UA_PROF_TAG_NAME,
17004980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getString(MMS_CONFIG_UA_PROF_TAG_NAME));
17014980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putString(MMS_CONFIG_USER_AGENT, config.getString(MMS_CONFIG_USER_AGENT));
17024980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putString(MMS_CONFIG_UA_PROF_URL, config.getString(MMS_CONFIG_UA_PROF_URL));
17034980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putString(MMS_CONFIG_HTTP_PARAMS, config.getString(MMS_CONFIG_HTTP_PARAMS));
17044980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putString(MMS_CONFIG_EMAIL_GATEWAY_NUMBER,
17054980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getString(MMS_CONFIG_EMAIL_GATEWAY_NUMBER));
17064980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putString(MMS_CONFIG_NAI_SUFFIX, config.getString(MMS_CONFIG_NAI_SUFFIX));
17074980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_SHOW_CELL_BROADCAST_APP_LINKS,
17084980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_SHOW_CELL_BROADCAST_APP_LINKS));
17094980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        filtered.putBoolean(MMS_CONFIG_SUPPORT_HTTP_CHARSET_HEADER,
17104980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen                config.getBoolean(MMS_CONFIG_SUPPORT_HTTP_CHARSET_HEADER));
17114980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen        return filtered;
17124980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen    }
17134980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen
17144980bf4aff8d49ac4e05444a6ef40ea1536f1afbDan Willemsen}
1715