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