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