10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2008 The Android Open Source Project 36f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * Copyright (c) 2013, The Linux Foundation. All rights reserved. 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony; 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 207fce994eb223105829becb6c26e3af7a9739752cDianne Hackbornimport android.Manifest; 217fce994eb223105829becb6c26e3af7a9739752cDianne Hackbornimport android.app.AppOpsManager; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.PendingIntent; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context; 24ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport android.os.AsyncResult; 257fce994eb223105829becb6c26e3af7a9739752cDianne Hackbornimport android.os.Binder; 26ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport android.os.Handler; 27ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport android.os.Message; 286f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowaimport android.os.ServiceManager; 29ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 326f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowaimport com.android.internal.telephony.ISms; 336f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowaimport com.android.internal.telephony.gsm.SmsBroadcastConfigInfo; 346f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowaimport com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo; 35d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccConstants; 36ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport com.android.internal.telephony.uicc.IccFileHandler; 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.HexDump; 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList; 40ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport java.util.Arrays; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static android.telephony.SmsManager.STATUS_ON_ICC_FREE; 44ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport static android.telephony.SmsManager.STATUS_ON_ICC_READ; 45ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport static android.telephony.SmsManager.STATUS_ON_ICC_UNREAD; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * IccSmsInterfaceManager to provide an inter-process communication to 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * access Sms in Icc. 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 516f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowapublic class IccSmsInterfaceManager extends ISms.Stub { 52cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville static final String LOG_TAG = "IccSmsInterfaceManager"; 53ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks static final boolean DBG = true; 54ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 55ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks protected final Object mLock = new Object(); 56ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks protected boolean mSuccess; 57ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks private List<SmsRawData> mSms; 58ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 596f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa private CellBroadcastRangeManager mCellBroadcastRangeManager = 606f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa new CellBroadcastRangeManager(); 616f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa private CdmaBroadcastRangeManager mCdmaBroadcastRangeManager = 626f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa new CdmaBroadcastRangeManager(); 636f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 64ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks private static final int EVENT_LOAD_DONE = 1; 65ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks private static final int EVENT_UPDATE_DONE = 2; 66ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks protected static final int EVENT_SET_BROADCAST_ACTIVATION_DONE = 3; 67ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks protected static final int EVENT_SET_BROADCAST_CONFIG_DONE = 4; 686f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa private static final int SMS_CB_CODE_SCHEME_MIN = 0; 696f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa private static final int SMS_CB_CODE_SCHEME_MAX = 255; 70ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 716f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa protected PhoneBase mPhone; 727fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn final protected Context mContext; 737fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn final protected AppOpsManager mAppOps; 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected SMSDispatcher mDispatcher; 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 76ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks protected Handler mHandler = new Handler() { 77ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks @Override 78ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks public void handleMessage(Message msg) { 79ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks AsyncResult ar; 80ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 81ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks switch (msg.what) { 82ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks case EVENT_UPDATE_DONE: 83ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks ar = (AsyncResult) msg.obj; 84ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks synchronized (mLock) { 85ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mSuccess = (ar.exception == null); 86ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mLock.notifyAll(); 87ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 88ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks break; 89ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks case EVENT_LOAD_DONE: 90ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks ar = (AsyncResult)msg.obj; 91ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks synchronized (mLock) { 92ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (ar.exception == null) { 936f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mSms = (List<SmsRawData>) 946f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa buildValidRawData((ArrayList<byte[]>) ar.result); 95ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks //Mark SMS as read after importing it from card. 96ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks markMessagesAsRead((ArrayList<byte[]>) ar.result); 97ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } else { 986f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (Rlog.isLoggable("SMS", Log.DEBUG)) { 996f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Cannot load Sms records"); 1006f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 101ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (mSms != null) 102ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mSms.clear(); 103ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 104ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mLock.notifyAll(); 105ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 106ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks break; 107ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks case EVENT_SET_BROADCAST_ACTIVATION_DONE: 108ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks case EVENT_SET_BROADCAST_CONFIG_DONE: 109ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks ar = (AsyncResult) msg.obj; 110ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks synchronized (mLock) { 111ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mSuccess = (ar.exception == null); 112ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mLock.notifyAll(); 113ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 114ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks break; 115ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 116ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 117ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks }; 118ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 1196f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa protected IccSmsInterfaceManager(PhoneBase phone) { 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPhone = phone; 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mContext = phone.getContext(); 1226f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); 1231260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mDispatcher = new ImsSMSDispatcher(phone, 1241260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa phone.mSmsStorageMonitor, phone.mSmsUsageMonitor); 1256f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (ServiceManager.getService("isms") == null) { 1266f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa ServiceManager.addService("isms", this); 1276f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 130ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks protected void markMessagesAsRead(ArrayList<byte[]> messages) { 131ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (messages == null) { 132ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks return; 133ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 134ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 135ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks //IccFileHandler can be null, if icc card is absent. 136ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks IccFileHandler fh = mPhone.getIccFileHandler(); 137ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (fh == null) { 138ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks //shouldn't really happen, as messages are marked as read, only 139ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks //after importing it from icc. 140ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (Rlog.isLoggable("SMS", Log.DEBUG)) { 141ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks log("markMessagesAsRead - aborting, no icc card present."); 142ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 143ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks return; 144ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 145ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 146ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks int count = messages.size(); 147ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 148ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks for (int i = 0; i < count; i++) { 149ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks byte[] ba = messages.get(i); 150ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (ba[0] == STATUS_ON_ICC_UNREAD) { 151ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks int n = ba.length; 152ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks byte[] nba = new byte[n - 1]; 153ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks System.arraycopy(ba, 1, nba, 0, n - 1); 154ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks byte[] record = makeSmsRecordData(STATUS_ON_ICC_READ, nba); 155ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks fh.updateEFLinearFixed(IccConstants.EF_SMS, i + 1, record, null, null); 156ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (Rlog.isLoggable("SMS", Log.DEBUG)) { 157ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks log("SMS " + (i + 1) + " marked as read"); 158ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 159ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 160ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 161ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 162ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 1631260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa public void dispose() { 1641260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mDispatcher.dispose(); 1651260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 1661260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 1676f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa protected void updatePhoneObject(PhoneBase phone) { 1686f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mPhone = phone; 1691260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mDispatcher.updatePhoneObject(phone); 1706f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 1716f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void enforceReceiveAndSend(String message) { 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mContext.enforceCallingPermission( 1747fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn Manifest.permission.RECEIVE_SMS, message); 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mContext.enforceCallingPermission( 1767fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn Manifest.permission.SEND_SMS, message); 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 180ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * Update the specified message on the Icc. 181ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * 182ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * @param index record index of message to update 183ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * @param status new message status (STATUS_ON_ICC_READ, 184ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * STATUS_ON_ICC_UNREAD, STATUS_ON_ICC_SENT, 185ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * STATUS_ON_ICC_UNSENT, STATUS_ON_ICC_FREE) 186ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * @param pdu the raw PDU to store 187ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * @return success or not 188ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * 189ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks */ 190cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 191ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks public boolean 1927fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn updateMessageOnIccEf(String callingPackage, int index, int status, byte[] pdu) { 193ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (DBG) log("updateMessageOnIccEf: index=" + index + 194ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks " status=" + status + " ==> " + 195ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks "("+ Arrays.toString(pdu) + ")"); 196ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks enforceReceiveAndSend("Updating message on Icc"); 1977fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn if (mAppOps.noteOp(AppOpsManager.OP_WRITE_ICC_SMS, Binder.getCallingUid(), 1987fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn callingPackage) != AppOpsManager.MODE_ALLOWED) { 1997fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn return false; 2007fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn } 201ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks synchronized(mLock) { 202ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mSuccess = false; 203ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks Message response = mHandler.obtainMessage(EVENT_UPDATE_DONE); 204ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 205ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (status == STATUS_ON_ICC_FREE) { 206ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks // RIL_REQUEST_DELETE_SMS_ON_SIM vs RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM 207ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks // Special case FREE: call deleteSmsOnSim/Ruim instead of 208ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks // manipulating the record 209ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks // Will eventually fail if icc card is not present. 2106f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (PhoneConstants.PHONE_TYPE_GSM == mPhone.getPhoneType()) { 2116f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mPhone.mCi.deleteSmsOnSim(index, response); 2126f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } else { 2136f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mPhone.mCi.deleteSmsOnRuim(index, response); 2146f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 215ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } else { 216ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks //IccFilehandler can be null if ICC card is not present. 217ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks IccFileHandler fh = mPhone.getIccFileHandler(); 218ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (fh == null) { 219ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks response.recycle(); 220ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks return mSuccess; /* is false */ 221ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 222ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks byte[] record = makeSmsRecordData(status, pdu); 223ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks fh.updateEFLinearFixed( 224ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks IccConstants.EF_SMS, 225ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks index, record, null, response); 226ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 227ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks try { 228ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mLock.wait(); 229ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } catch (InterruptedException e) { 230ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks log("interrupted while trying to update by index"); 231ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 232ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 233ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks return mSuccess; 234ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 235ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 236ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks /** 237ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * Copy a raw SMS PDU to the Icc. 238ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * 239ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * @param pdu the raw PDU to store 240ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * @param status message status (STATUS_ON_ICC_READ, STATUS_ON_ICC_UNREAD, 241ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * STATUS_ON_ICC_SENT, STATUS_ON_ICC_UNSENT) 242ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * @return success or not 243ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * 244ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks */ 245cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2467fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn public boolean copyMessageToIccEf(String callingPackage, int status, byte[] pdu, byte[] smsc) { 247ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks //NOTE smsc not used in RUIM 248ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (DBG) log("copyMessageToIccEf: status=" + status + " ==> " + 249ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks "pdu=("+ Arrays.toString(pdu) + 250ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks "), smsc=(" + Arrays.toString(smsc) +")"); 251ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks enforceReceiveAndSend("Copying message to Icc"); 2527fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn if (mAppOps.noteOp(AppOpsManager.OP_WRITE_ICC_SMS, Binder.getCallingUid(), 2537fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn callingPackage) != AppOpsManager.MODE_ALLOWED) { 2547fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn return false; 2557fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn } 256ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks synchronized(mLock) { 257ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mSuccess = false; 258ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks Message response = mHandler.obtainMessage(EVENT_UPDATE_DONE); 259ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 260ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks //RIL_REQUEST_WRITE_SMS_TO_SIM vs RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM 2616f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (PhoneConstants.PHONE_TYPE_GSM == mPhone.getPhoneType()) { 2626f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mPhone.mCi.writeSmsToSim(status, IccUtils.bytesToHexString(smsc), 2636f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa IccUtils.bytesToHexString(pdu), response); 2646f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } else { 2656f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mPhone.mCi.writeSmsToRuim(status, IccUtils.bytesToHexString(pdu), 2666f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa response); 2676f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 268ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 269ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks try { 270ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mLock.wait(); 271ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } catch (InterruptedException e) { 272ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks log("interrupted while trying to update by index"); 273ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 274ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 275ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks return mSuccess; 276ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 277ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 278ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks /** 279ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * Retrieves all messages currently stored on Icc. 280ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * 281ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks * @return list of SmsRawData of all sms on Icc 282ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks */ 283cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2847fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn public List<SmsRawData> getAllMessagesFromIccEf(String callingPackage) { 285ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (DBG) log("getAllMessagesFromEF"); 286ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 287e5d7a8d946bf9496ffbe7533bffdeb83963489c3Jake Hamby mContext.enforceCallingOrSelfPermission( 2887fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn Manifest.permission.RECEIVE_SMS, 289ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks "Reading messages from Icc"); 2907fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn if (mAppOps.noteOp(AppOpsManager.OP_READ_ICC_SMS, Binder.getCallingUid(), 2917fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn callingPackage) != AppOpsManager.MODE_ALLOWED) { 2927fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn return new ArrayList<SmsRawData>(); 2937fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn } 294ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks synchronized(mLock) { 295ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 296ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks IccFileHandler fh = mPhone.getIccFileHandler(); 297ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (fh == null) { 298ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks Rlog.e(LOG_TAG, "Cannot load Sms records. No icc card?"); 299ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks if (mSms != null) { 300ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mSms.clear(); 301ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks return mSms; 302ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 303ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 304ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 305ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks Message response = mHandler.obtainMessage(EVENT_LOAD_DONE); 306ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks fh.loadEFLinearFixedAll(IccConstants.EF_SMS, response); 307ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 308ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks try { 309ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks mLock.wait(); 310ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } catch (InterruptedException e) { 311ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks log("interrupted while trying to load from the Icc"); 312ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 313ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 314ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks return mSms; 315ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks } 316ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 317ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks /** 3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Send a data based SMS to a specific application port. 3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param destAddr the address to send the message to 3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param scAddr is the service center address or null to use 3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the current default SMSC 3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param destPort the port to deliver the message to 3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param data the body of the message to send 3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param sentIntent if not NULL this <code>PendingIntent</code> is 3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * broadcast when the message is successfully sent, or failed. 3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The result code will be <code>Activity.RESULT_OK<code> for success, 3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * or one of these errors:<br> 3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>RESULT_ERROR_GENERIC_FAILURE</code><br> 3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>RESULT_ERROR_RADIO_OFF</code><br> 3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>RESULT_ERROR_NULL_PDU</code><br> 3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include 3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the extra "errorCode" containing a radio technology specific value, 3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * generally only useful for troubleshooting.<br> 3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The per-application based SMS control checks sentIntent. If sentIntent 3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * is NULL the caller will be checked against all unknown applications, 3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * which cause smaller number of SMS to be sent in checking period. 3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param deliveryIntent if not NULL this <code>PendingIntent</code> is 3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * broadcast when the message is delivered to the recipient. The 3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * raw pdu of the status report is in the extended data ("pdu"). 3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 342cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3437fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn public void sendData(String callingPackage, String destAddr, String scAddr, int destPort, 3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { 3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPhone.getContext().enforceCallingPermission( 3467fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn Manifest.permission.SEND_SMS, 3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "Sending SMS message"); 348ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (Rlog.isLoggable("SMS", Log.VERBOSE)) { 3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("sendData: destAddr=" + destAddr + " scAddr=" + scAddr + " destPort=" + 3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville destPort + " data='"+ HexDump.toHexString(data) + "' sentIntent=" + 3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sentIntent + " deliveryIntent=" + deliveryIntent); 3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3537fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn if (mAppOps.noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(), 3547fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn callingPackage) != AppOpsManager.MODE_ALLOWED) { 3557fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn return; 3567fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn } 3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDispatcher.sendData(destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); 3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Send a text based SMS. 3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param destAddr the address to send the message to 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param scAddr is the service center address or null to use 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the current default SMSC 3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param text the body of the message to send 3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param sentIntent if not NULL this <code>PendingIntent</code> is 3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * broadcast when the message is successfully sent, or failed. 3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The result code will be <code>Activity.RESULT_OK<code> for success, 3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * or one of these errors:<br> 3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>RESULT_ERROR_GENERIC_FAILURE</code><br> 3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>RESULT_ERROR_RADIO_OFF</code><br> 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>RESULT_ERROR_NULL_PDU</code><br> 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include 3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the extra "errorCode" containing a radio technology specific value, 3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * generally only useful for troubleshooting.<br> 3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The per-application based SMS control checks sentIntent. If sentIntent 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * is NULL the caller will be checked against all unknown applications, 3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * which cause smaller number of SMS to be sent in checking period. 3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param deliveryIntent if not NULL this <code>PendingIntent</code> is 3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * broadcast when the message is delivered to the recipient. The 3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * raw pdu of the status report is in the extended data ("pdu"). 3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 384cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3857fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn public void sendText(String callingPackage, String destAddr, String scAddr, 3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { 3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPhone.getContext().enforceCallingPermission( 3887fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn Manifest.permission.SEND_SMS, 3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "Sending SMS message"); 390ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (Rlog.isLoggable("SMS", Log.VERBOSE)) { 3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("sendText: destAddr=" + destAddr + " scAddr=" + scAddr + 3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville " text='"+ text + "' sentIntent=" + 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sentIntent + " deliveryIntent=" + deliveryIntent); 3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3957fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn if (mAppOps.noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(), 3967fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn callingPackage) != AppOpsManager.MODE_ALLOWED) { 3977fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn return; 3987fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn } 3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDispatcher.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent); 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Send a multi-part text based SMS. 4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param destAddr the address to send the message to 4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param scAddr is the service center address or null to use 4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the current default SMSC 4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param parts an <code>ArrayList</code> of strings that, in order, 4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * comprise the original message 4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param sentIntents if not null, an <code>ArrayList</code> of 4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>PendingIntent</code>s (one for each message part) that is 4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * broadcast when the corresponding message part has been sent. 4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The result code will be <code>Activity.RESULT_OK<code> for success, 4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * or one of these errors: 4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>RESULT_ERROR_GENERIC_FAILURE</code> 4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>RESULT_ERROR_RADIO_OFF</code> 4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>RESULT_ERROR_NULL_PDU</code>. 4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The per-application based SMS control checks sentIntent. If sentIntent 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * is NULL the caller will be checked against all unknown applications, 4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * which cause smaller number of SMS to be sent in checking period. 4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param deliveryIntents if not null, an <code>ArrayList</code> of 4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>PendingIntent</code>s (one for each message part) that is 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * broadcast when the corresponding message part has been delivered 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * to the recipient. The raw pdu of the status report is in the 4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * extended data ("pdu"). 4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 427cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 4287fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn public void sendMultipartText(String callingPackage, String destAddr, String scAddr, 4297fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn List<String> parts, List<PendingIntent> sentIntents, 4307fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn List<PendingIntent> deliveryIntents) { 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPhone.getContext().enforceCallingPermission( 4327fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn Manifest.permission.SEND_SMS, 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "Sending SMS message"); 434ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (Rlog.isLoggable("SMS", Log.VERBOSE)) { 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int i = 0; 4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (String part : parts) { 4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("sendMultipartText: destAddr=" + destAddr + ", srAddr=" + scAddr + 4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ", part[" + (i++) + "]=" + part); 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4417fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn if (mAppOps.noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(), 4427fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn callingPackage) != AppOpsManager.MODE_ALLOWED) { 4437fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn return; 4447fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn } 4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDispatcher.sendMultipartText(destAddr, scAddr, (ArrayList<String>) parts, 4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (ArrayList<PendingIntent>) sentIntents, (ArrayList<PendingIntent>) deliveryIntents); 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 449cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 4504658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby public int getPremiumSmsPermission(String packageName) { 4514658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby return mDispatcher.getPremiumSmsPermission(packageName); 4524658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby } 4534658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby 454cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 4554658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby public void setPremiumSmsPermission(String packageName, int permission) { 4564658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby mDispatcher.setPremiumSmsPermission(packageName, permission); 4574658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby } 4584658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * create SmsRawData lists from all sms record byte[] 4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Use null to indicate "free" record 4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param messages List of message records from EF_SMS. 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return SmsRawData list of all in-used records 4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected ArrayList<SmsRawData> buildValidRawData(ArrayList<byte[]> messages) { 4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int count = messages.size(); 4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ArrayList<SmsRawData> ret; 4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = new ArrayList<SmsRawData>(count); 4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < count; i++) { 4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] ba = messages.get(i); 4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ba[0] == STATUS_ON_ICC_FREE) { 4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret.add(null); 4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret.add(new SmsRawData(messages.get(i))); 4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ret; 4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Generates an EF_SMS record from status and raw PDU. 4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param status Message status. See TS 51.011 10.5.3. 4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param pdu Raw message PDU. 4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return byte array for the record. 4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected byte[] makeSmsRecordData(int status, byte[] pdu) { 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] data = new byte[IccConstants.SMS_RECORD_LENGTH]; 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Status bits for this record. See TS 51.011 10.5.3 4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville data[0] = (byte)(status & 7); 4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville System.arraycopy(pdu, 0, data, 1, pdu.length); 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Pad out with 0xFF's. 5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int j = pdu.length+1; j < IccConstants.SMS_RECORD_LENGTH; j++) { 5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville data[j] = -1; 5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return data; 5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5076f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa public boolean enableCellBroadcast(int messageIdentifier) { 5086f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return enableCellBroadcastRange(messageIdentifier, messageIdentifier); 5096f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 5106f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5116f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa public boolean disableCellBroadcast(int messageIdentifier) { 5126f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return disableCellBroadcastRange(messageIdentifier, messageIdentifier); 5136f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 5146f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5156f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa public boolean enableCellBroadcastRange(int startMessageId, int endMessageId) { 5166f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (PhoneConstants.PHONE_TYPE_GSM == mPhone.getPhoneType()) { 5176f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return enableGsmBroadcastRange(startMessageId, endMessageId); 5186f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } else { 5196f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return enableCdmaBroadcastRange(startMessageId, endMessageId); 5206f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 5216f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 5226f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5236f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa public boolean disableCellBroadcastRange(int startMessageId, int endMessageId) { 5246f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (PhoneConstants.PHONE_TYPE_GSM == mPhone.getPhoneType()) { 5256f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return disableGsmBroadcastRange(startMessageId, endMessageId); 5266f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } else { 5276f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return disableCdmaBroadcastRange(startMessageId, endMessageId); 5286f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 5296f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 5306f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5316f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa synchronized public boolean enableGsmBroadcastRange(int startMessageId, int endMessageId) { 5326f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) log("enableGsmBroadcastRange"); 5336f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5346f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Context context = mPhone.getContext(); 5356f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5366f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa context.enforceCallingPermission( 5376f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa "android.permission.RECEIVE_SMS", 5386f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa "Enabling cell broadcast SMS"); 5396f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5406f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa String client = context.getPackageManager().getNameForUid( 5416f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Binder.getCallingUid()); 5426f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5436f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (!mCellBroadcastRangeManager.enableRange(startMessageId, endMessageId, client)) { 5446f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Failed to add cell broadcast subscription for MID range " + startMessageId 5456f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa + " to " + endMessageId + " from client " + client); 5466f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return false; 5476f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 5486f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5496f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) 5506f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Added cell broadcast subscription for MID range " + startMessageId 5516f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa + " to " + endMessageId + " from client " + client); 5526f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5536f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa setCellBroadcastActivation(!mCellBroadcastRangeManager.isEmpty()); 5546f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5556f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return true; 5566f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 5576f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5586f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa synchronized public boolean disableGsmBroadcastRange(int startMessageId, int endMessageId) { 5596f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) log("disableGsmBroadcastRange"); 5606f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5616f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Context context = mPhone.getContext(); 5626f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5636f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa context.enforceCallingPermission( 5646f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa "android.permission.RECEIVE_SMS", 5656f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa "Disabling cell broadcast SMS"); 5666f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5676f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa String client = context.getPackageManager().getNameForUid( 5686f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Binder.getCallingUid()); 5696f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5706f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (!mCellBroadcastRangeManager.disableRange(startMessageId, endMessageId, client)) { 5716f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Failed to remove cell broadcast subscription for MID range " + startMessageId 5726f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa + " to " + endMessageId + " from client " + client); 5736f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return false; 5746f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 5756f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5766f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) 5776f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Removed cell broadcast subscription for MID range " + startMessageId 5786f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa + " to " + endMessageId + " from client " + client); 5796f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5806f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa setCellBroadcastActivation(!mCellBroadcastRangeManager.isEmpty()); 5816f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5826f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return true; 5836f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 5846f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5856f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa synchronized public boolean enableCdmaBroadcastRange(int startMessageId, int endMessageId) { 5866f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) log("enableCdmaBroadcastRange"); 5876f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5886f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Context context = mPhone.getContext(); 5896f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5906f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa context.enforceCallingPermission( 5916f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa "android.permission.RECEIVE_SMS", 5926f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa "Enabling cdma broadcast SMS"); 5936f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5946f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa String client = context.getPackageManager().getNameForUid( 5956f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Binder.getCallingUid()); 5966f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 5976f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (!mCdmaBroadcastRangeManager.enableRange(startMessageId, endMessageId, client)) { 5986f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Failed to add cdma broadcast subscription for MID range " + startMessageId 5996f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa + " to " + endMessageId + " from client " + client); 6006f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return false; 6016f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 6026f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6036f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) 6046f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Added cdma broadcast subscription for MID range " + startMessageId 6056f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa + " to " + endMessageId + " from client " + client); 6066f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6076f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa setCdmaBroadcastActivation(!mCdmaBroadcastRangeManager.isEmpty()); 6086f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6096f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return true; 6106f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 6116f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6126f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa synchronized public boolean disableCdmaBroadcastRange(int startMessageId, int endMessageId) { 6136f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) log("disableCdmaBroadcastRange"); 6146f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6156f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Context context = mPhone.getContext(); 6166f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6176f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa context.enforceCallingPermission( 6186f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa "android.permission.RECEIVE_SMS", 6196f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa "Disabling cell broadcast SMS"); 6206f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6216f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa String client = context.getPackageManager().getNameForUid( 6226f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Binder.getCallingUid()); 6236f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6246f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (!mCdmaBroadcastRangeManager.disableRange(startMessageId, endMessageId, client)) { 6256f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Failed to remove cdma broadcast subscription for MID range " + startMessageId 6266f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa + " to " + endMessageId + " from client " + client); 6276f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return false; 6286f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 6296f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6306f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) 6316f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Removed cdma broadcast subscription for MID range " + startMessageId 6326f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa + " to " + endMessageId + " from client " + client); 6336f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6346f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa setCdmaBroadcastActivation(!mCdmaBroadcastRangeManager.isEmpty()); 6356f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6366f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return true; 6376f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 6386f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6396f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa class CellBroadcastRangeManager extends IntRangeManager { 6406f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa private ArrayList<SmsBroadcastConfigInfo> mConfigList = 6416f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa new ArrayList<SmsBroadcastConfigInfo>(); 6426f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6436f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa /** 6446f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * Called when the list of enabled ranges has changed. This will be 6456f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * followed by zero or more calls to {@link #addRange} followed by 6466f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * a call to {@link #finishUpdate}. 6476f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa */ 6486f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa protected void startUpdate() { 6496f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mConfigList.clear(); 6506f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 6516f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6526f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa /** 6536f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * Called after {@link #startUpdate} to indicate a range of enabled 6546f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * values. 6556f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * @param startId the first id included in the range 6566f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * @param endId the last id included in the range 6576f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa */ 6586f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa protected void addRange(int startId, int endId, boolean selected) { 6596f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mConfigList.add(new SmsBroadcastConfigInfo(startId, endId, 6606f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa SMS_CB_CODE_SCHEME_MIN, SMS_CB_CODE_SCHEME_MAX, selected)); 6616f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 6626f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6636f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa /** 6646f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * Called to indicate the end of a range update started by the 6656f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * previous call to {@link #startUpdate}. 6666f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * @return true if successful, false otherwise 6676f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa */ 6686f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa protected boolean finishUpdate() { 6696f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (mConfigList.isEmpty()) { 6706f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return true; 6716f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } else { 6726f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa SmsBroadcastConfigInfo[] configs = 6736f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mConfigList.toArray(new SmsBroadcastConfigInfo[mConfigList.size()]); 6746f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return setCellBroadcastConfig(configs); 6756f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 6766f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 6776f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 6786f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6796f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa class CdmaBroadcastRangeManager extends IntRangeManager { 6806f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa private ArrayList<CdmaSmsBroadcastConfigInfo> mConfigList = 6816f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa new ArrayList<CdmaSmsBroadcastConfigInfo>(); 6826f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 6836f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa /** 6846f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * Called when the list of enabled ranges has changed. This will be 6856f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * followed by zero or more calls to {@link #addRange} followed by a 6866f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * call to {@link #finishUpdate}. 6876f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa */ 6886f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa protected void startUpdate() { 6896f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mConfigList.clear(); 6906f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 691ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 6926f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa /** 6936f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * Called after {@link #startUpdate} to indicate a range of enabled 6946f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * values. 6956f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * @param startId the first id included in the range 6966f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * @param endId the last id included in the range 6976f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa */ 6986f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa protected void addRange(int startId, int endId, boolean selected) { 6996f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mConfigList.add(new CdmaSmsBroadcastConfigInfo(startId, endId, 7006f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 1, selected)); 7016f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 702ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks 7036f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa /** 7046f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * Called to indicate the end of a range update started by the previous 7056f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * call to {@link #startUpdate}. 7066f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * @return true if successful, false otherwise 7076f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa */ 7086f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa protected boolean finishUpdate() { 7096f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (mConfigList.isEmpty()) { 7106f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return true; 7116f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } else { 7126f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa CdmaSmsBroadcastConfigInfo[] configs = 7136f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mConfigList.toArray(new CdmaSmsBroadcastConfigInfo[mConfigList.size()]); 7146f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return setCdmaBroadcastConfig(configs); 7156f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7166f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7176f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7186f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7196f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa private boolean setCellBroadcastConfig(SmsBroadcastConfigInfo[] configs) { 7206f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) 7216f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Calling setGsmBroadcastConfig with " + configs.length + " configurations"); 7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7236f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa synchronized (mLock) { 7246f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_CONFIG_DONE); 7256f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7266f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mSuccess = false; 7276f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mPhone.mCi.setGsmBroadcastConfig(configs, response); 7286f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7296f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa try { 7306f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mLock.wait(); 7316f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } catch (InterruptedException e) { 7326f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("interrupted while trying to set cell broadcast config"); 7336f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7346f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7356f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7366f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return mSuccess; 7376f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7386f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7396f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa private boolean setCellBroadcastActivation(boolean activate) { 7406f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) 7416f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Calling setCellBroadcastActivation(" + activate + ')'); 7426f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7436f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa synchronized (mLock) { 7446f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_ACTIVATION_DONE); 7456f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7466f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mSuccess = false; 7476f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mPhone.mCi.setGsmBroadcastActivation(activate, response); 7486f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7496f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa try { 7506f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mLock.wait(); 7516f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } catch (InterruptedException e) { 7526f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("interrupted while trying to set cell broadcast activation"); 7536f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7546f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7556f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7566f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return mSuccess; 7576f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7586f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7596f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa private boolean setCdmaBroadcastConfig(CdmaSmsBroadcastConfigInfo[] configs) { 7606f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) 7616f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Calling setCdmaBroadcastConfig with " + configs.length + " configurations"); 7626f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7636f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa synchronized (mLock) { 7646f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_CONFIG_DONE); 7656f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7666f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mSuccess = false; 7676f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mPhone.mCi.setCdmaBroadcastConfig(configs, response); 7686f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7696f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa try { 7706f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mLock.wait(); 7716f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } catch (InterruptedException e) { 7726f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("interrupted while trying to set cdma broadcast config"); 7736f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7746f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7756f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7766f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return mSuccess; 7776f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7786f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7796f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa private boolean setCdmaBroadcastActivation(boolean activate) { 7806f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa if (DBG) 7816f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("Calling setCdmaBroadcastActivation(" + activate + ")"); 7826f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7836f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa synchronized (mLock) { 7846f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_ACTIVATION_DONE); 7856f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7866f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mSuccess = false; 7876f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mPhone.mCi.setCdmaBroadcastActivation(activate, response); 7886f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7896f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa try { 7906f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa mLock.wait(); 7916f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } catch (InterruptedException e) { 7926f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa log("interrupted while trying to set cdma broadcast activation"); 7936f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7946f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7956f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7966f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa return mSuccess; 7976f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 7986f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa 7996f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa protected void log(String msg) { 8006f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa Log.d(LOG_TAG, "[IccSmsInterfaceManager] " + msg); 8016f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa } 8021260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 8031260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa public boolean isImsSmsSupported() { 8041260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa return mDispatcher.isIms(); 8051260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 8061260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 8071260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa public String getImsSmsFormat() { 8081260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa return mDispatcher.getImsSmsFormat(); 8091260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 811