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