1c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen/* 2c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * Copyright (C) 2014 The Android Open Source Project 3c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * 4c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * Licensed under the Apache License, Version 2.0 (the "License"); 5c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * you may not use this file except in compliance with the License. 6c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * You may obtain a copy of the License at 7c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * 8c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * http://www.apache.org/licenses/LICENSE-2.0 9c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * 10c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * Unless required by applicable law or agreed to in writing, software 11c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * distributed under the License is distributed on an "AS IS" BASIS, 12c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * See the License for the specific language governing permissions and 14c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * limitations under the License. 15c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen */ 16c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen 17c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wenpackage com.android.mms.service; 18c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen 193a14e46a22e95062102a19c955a819bf239dbc52Ye Wenimport android.app.Activity; 20c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wenimport android.app.PendingIntent; 213a14e46a22e95062102a19c955a819bf239dbc52Ye Wenimport android.content.ContentValues; 22c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wenimport android.content.Context; 23b786d3ea3daf4a91119ea06c532fe7ef5835944cYe Wenimport android.content.Intent; 2418aabe2742cbaffc3c8293cfb3ce2841fe82326dYe Wenimport android.net.Uri; 253a14e46a22e95062102a19c955a819bf239dbc52Ye Wenimport android.os.Binder; 263e40f4c4a8c82e795a5cea235d52eacd177c0a69Ye Wenimport android.os.Bundle; 271b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastryimport android.os.RemoteException; 283a14e46a22e95062102a19c955a819bf239dbc52Ye Wenimport android.provider.Telephony; 291b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastryimport android.service.carrier.CarrierMessagingService; 301b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastryimport android.service.carrier.ICarrierMessagingService; 311b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastryimport android.telephony.CarrierMessagingServiceManager; 32abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastryimport android.telephony.PhoneNumberUtils; 33b83f2faa04dc275b6779644308384459ffcff63fJulian Odellimport android.telephony.SmsManager; 3418aabe2742cbaffc3c8293cfb3ce2841fe82326dYe Wenimport android.text.TextUtils; 35c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen 36abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastryimport com.android.internal.telephony.AsyncEmergencyContactNotifier; 37ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Yingimport com.android.internal.telephony.Phone; 38ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Yingimport com.android.internal.telephony.PhoneFactory; 3922519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wenimport com.android.internal.telephony.SmsApplication; 40ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Yingimport com.android.internal.telephony.SmsNumberUtils; 41bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wenimport com.android.mms.service.exception.MmsHttpException; 42bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wenimport com.google.android.mms.MmsException; 43abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastryimport com.google.android.mms.pdu.EncodedStringValue; 44bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wenimport com.google.android.mms.pdu.GenericPdu; 45ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Yingimport com.google.android.mms.pdu.PduComposer; 4622519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wenimport com.google.android.mms.pdu.PduHeaders; 47bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wenimport com.google.android.mms.pdu.PduParser; 48bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wenimport com.google.android.mms.pdu.PduPersister; 49bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wenimport com.google.android.mms.pdu.SendConf; 50bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wenimport com.google.android.mms.pdu.SendReq; 51bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wenimport com.google.android.mms.util.SqliteWrapper; 52bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wen 53c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen/** 54c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen * Request to send an MMS 55c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen */ 56c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wenpublic class SendRequest extends MmsRequest { 57f6d88a72cd01ecaf9f0319249e239afc008f1ac8Cheuksan Wang private final Uri mPduUri; 58b83f2faa04dc275b6779644308384459ffcff63fJulian Odell private byte[] mPduData; 59c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen private final String mLocationUrl; 60c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen private final PendingIntent mSentIntent; 61c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen 6222519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen public SendRequest(RequestManager manager, int subId, Uri contentUri, String locationUrl, 634467007f09a9f2319ba25aa18e04f54693e6bfa1Jonathan Basseri PendingIntent sentIntent, String creator, Bundle configOverrides, Context context) { 644467007f09a9f2319ba25aa18e04f54693e6bfa1Jonathan Basseri super(manager, subId, creator, configOverrides, context); 65b83f2faa04dc275b6779644308384459ffcff63fJulian Odell mPduUri = contentUri; 66b83f2faa04dc275b6779644308384459ffcff63fJulian Odell mPduData = null; 67b83f2faa04dc275b6779644308384459ffcff63fJulian Odell mLocationUrl = locationUrl; 68b83f2faa04dc275b6779644308384459ffcff63fJulian Odell mSentIntent = sentIntent; 69b83f2faa04dc275b6779644308384459ffcff63fJulian Odell } 70b83f2faa04dc275b6779644308384459ffcff63fJulian Odell 71c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen @Override 72b07ae2f78ac69a1e7bcfb1ce62e69d7283b46295Ye Wen protected byte[] doHttp(Context context, MmsNetworkManager netMgr, ApnSettings apn) 73b07ae2f78ac69a1e7bcfb1ce62e69d7283b46295Ye Wen throws MmsHttpException { 74ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying final String requestId = getRequestId(); 75bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wen final MmsHttpClient mmsHttpClient = netMgr.getOrCreateHttpClient(); 76bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wen if (mmsHttpClient == null) { 778153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e(requestId, "MMS network is not ready!"); 78bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wen throw new MmsHttpException(0/*statusCode*/, "MMS network is not ready"); 79bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wen } 80ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying final GenericPdu parsedPdu = parsePdu(); 81ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying notifyIfEmergencyContactNoThrow(parsedPdu); 82ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying updateDestinationAddress(parsedPdu); 83bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wen return mmsHttpClient.execute( 84b786d3ea3daf4a91119ea06c532fe7ef5835944cYe Wen mLocationUrl != null ? mLocationUrl : apn.getMmscUrl(), 85b83f2faa04dc275b6779644308384459ffcff63fJulian Odell mPduData, 86bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wen MmsHttpClient.METHOD_POST, 87bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wen apn.isProxySet(), 88bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wen apn.getProxyAddress(), 89bdb6fe1cfbc8ecb7ed56798f49de7ba62019fd72Ye Wen apn.getProxyPort(), 904467007f09a9f2319ba25aa18e04f54693e6bfa1Jonathan Basseri mMmsConfig, 918153aed48a84305533f26c06a07a51bd358cee41Ye Wen mSubId, 928153aed48a84305533f26c06a07a51bd358cee41Ye Wen requestId); 93c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen } 94c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen 95ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying private GenericPdu parsePdu() { 96ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying final String requestId = getRequestId(); 97ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying try { 98ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying if (mPduData == null) { 99ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying LogUtil.w(requestId, "Empty PDU raw data"); 100ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying return null; 101ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 102ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying final boolean supportContentDisposition = 103ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying mMmsConfig.getBoolean(SmsManager.MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION); 104ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying return new PduParser(mPduData, supportContentDisposition).parse(); 105ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } catch (final Exception e) { 106ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying LogUtil.w(requestId, "Failed to parse PDU raw data"); 107ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 108ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying return null; 109ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 110ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying 111abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry /** 112abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry * If the MMS is being sent to an emergency number, the blocked number provider is notified 113abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry * so that it can disable number blocking. 114abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry */ 115ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying private void notifyIfEmergencyContactNoThrow(final GenericPdu parsedPdu) { 116abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry try { 117ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying notifyIfEmergencyContact(parsedPdu); 118abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry } catch (Exception e) { 119ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying LogUtil.w(getRequestId(), "Error in notifyIfEmergencyContact", e); 120abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry } 121abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry } 122abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry 123ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying private void notifyIfEmergencyContact(final GenericPdu parsedPdu) { 124abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry if (parsedPdu != null && parsedPdu.getMessageType() == PduHeaders.MESSAGE_TYPE_SEND_REQ) { 125abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry SendReq sendReq = (SendReq) parsedPdu; 126abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry for (EncodedStringValue encodedStringValue : sendReq.getTo()) { 127abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry if (isEmergencyNumber(encodedStringValue.getString())) { 128ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying LogUtil.i(getRequestId(), "Notifying emergency contact"); 129abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry new AsyncEmergencyContactNotifier(mContext).execute(); 130abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry return; 131abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry } 132abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry } 133abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry } 134abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry } 135abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry 136abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry private boolean isEmergencyNumber(String address) { 137abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry return !TextUtils.isEmpty(address) && PhoneNumberUtils.isEmergencyNumber(mSubId, address); 138abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry } 139abb8a5b4d9e3cdf5ffe5140d30552ffc8eb6c991Abhijith Shastry 140c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen @Override 141c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen protected PendingIntent getPendingIntent() { 142c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen return mSentIntent; 143c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen } 144c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen 1453a14e46a22e95062102a19c955a819bf239dbc52Ye Wen @Override 1463cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen protected int getQueueType() { 147b786d3ea3daf4a91119ea06c532fe7ef5835944cYe Wen return MmsService.QUEUE_INDEX_SEND; 148b786d3ea3daf4a91119ea06c532fe7ef5835944cYe Wen } 149b786d3ea3daf4a91119ea06c532fe7ef5835944cYe Wen 15022519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen @Override 15122519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen protected Uri persistIfRequired(Context context, int result, byte[] response) { 152ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying final String requestId = getRequestId(); 15322519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (!SmsApplication.shouldWriteMessageForPackage(mCreator, context)) { 15422519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen // Not required to persist 15522519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen return null; 15622519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen } 1578153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.d(requestId, "persistIfRequired"); 15822519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (mPduData == null) { 1598153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e(requestId, "persistIfRequired: empty PDU"); 16022519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen return null; 16122519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen } 162b07ae2f78ac69a1e7bcfb1ce62e69d7283b46295Ye Wen final long identity = Binder.clearCallingIdentity(); 1633a14e46a22e95062102a19c955a819bf239dbc52Ye Wen try { 1644467007f09a9f2319ba25aa18e04f54693e6bfa1Jonathan Basseri final boolean supportContentDisposition = 1654467007f09a9f2319ba25aa18e04f54693e6bfa1Jonathan Basseri mMmsConfig.getBoolean(SmsManager.MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION); 16622519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen // Persist the request PDU first 167a813bdf7fc206eb894537908b3f95c06a62d153fYe Wen GenericPdu pdu = (new PduParser(mPduData, supportContentDisposition)).parse(); 16822519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (pdu == null) { 1698153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e(requestId, "persistIfRequired: can't parse input PDU"); 17022519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen return null; 171b83f2faa04dc275b6779644308384459ffcff63fJulian Odell } 17222519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (!(pdu instanceof SendReq)) { 1738153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.d(requestId, "persistIfRequired: not SendReq"); 17422519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen return null; 17522519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen } 17622519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen final PduPersister persister = PduPersister.getPduPersister(context); 17722519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen final Uri messageUri = persister.persist( 17822519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen pdu, 17922519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen Telephony.Mms.Sent.CONTENT_URI, 18022519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen true/*createThreadId*/, 18122519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen true/*groupMmsEnabled*/, 18222519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen null/*preOpenedFiles*/); 18322519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (messageUri == null) { 1848153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e(requestId, "persistIfRequired: can not persist message"); 18522519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen return null; 18622519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen } 18722519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen // Update the additional columns based on the send result 18822519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen final ContentValues values = new ContentValues(); 18922519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen SendConf sendConf = null; 19022519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (response != null && response.length > 0) { 191a813bdf7fc206eb894537908b3f95c06a62d153fYe Wen pdu = (new PduParser(response, supportContentDisposition)).parse(); 19222519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (pdu != null && pdu instanceof SendConf) { 19322519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen sendConf = (SendConf) pdu; 19418aabe2742cbaffc3c8293cfb3ce2841fe82326dYe Wen } 1953a14e46a22e95062102a19c955a819bf239dbc52Ye Wen } 19622519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (result != Activity.RESULT_OK 19722519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen || sendConf == null 19822519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen || sendConf.getResponseStatus() != PduHeaders.RESPONSE_STATUS_OK) { 19922519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen // Since we can't persist a message directly into FAILED box, 20022519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen // we have to update the column after we persist it into SENT box. 20122519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen // The gap between the state change is tiny so I would not expect 20222519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen // it to cause any serious problem 20322519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen // TODO: we should add a "failed" URI for this in MmsProvider? 20422519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen values.put(Telephony.Mms.MESSAGE_BOX, Telephony.Mms.MESSAGE_BOX_FAILED); 20522519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen } 20622519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (sendConf != null) { 20722519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen values.put(Telephony.Mms.RESPONSE_STATUS, sendConf.getResponseStatus()); 20822519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen values.put(Telephony.Mms.MESSAGE_ID, 20922519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen PduPersister.toIsoString(sendConf.getMessageId())); 21022519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen } 21122519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen values.put(Telephony.Mms.DATE, System.currentTimeMillis() / 1000L); 21222519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen values.put(Telephony.Mms.READ, 1); 21322519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen values.put(Telephony.Mms.SEEN, 1); 21422519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (!TextUtils.isEmpty(mCreator)) { 21522519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen values.put(Telephony.Mms.CREATOR, mCreator); 21622519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen } 21779ab3ac28d02ba5f05d012a63cffa73931070a85Wink Saville values.put(Telephony.Mms.SUBSCRIPTION_ID, mSubId); 21822519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen if (SqliteWrapper.update(context, context.getContentResolver(), messageUri, values, 21922519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen null/*where*/, null/*selectionArg*/) != 1) { 2208153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e(requestId, "persistIfRequired: failed to update message"); 22122519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen } 22222519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen return messageUri; 2233a14e46a22e95062102a19c955a819bf239dbc52Ye Wen } catch (MmsException e) { 2248153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e(requestId, "persistIfRequired: can not persist message", e); 2253a14e46a22e95062102a19c955a819bf239dbc52Ye Wen } catch (RuntimeException e) { 2268153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e(requestId, "persistIfRequired: unexpected parsing failure", e); 227b07ae2f78ac69a1e7bcfb1ce62e69d7283b46295Ye Wen } finally { 228b07ae2f78ac69a1e7bcfb1ce62e69d7283b46295Ye Wen Binder.restoreCallingIdentity(identity); 2293a14e46a22e95062102a19c955a819bf239dbc52Ye Wen } 23022519cf9f57f3cc359ccb84bcd508ae0f9750821Ye Wen return null; 2313a14e46a22e95062102a19c955a819bf239dbc52Ye Wen } 232c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen 233b83f2faa04dc275b6779644308384459ffcff63fJulian Odell /** 234ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying * Update the destination Address of MO MMS before sending. 235ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying * This is special for VZW requirement. Follow the specificaitons of assisted dialing 236ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying * of MO MMS while traveling on VZW CDMA, international CDMA or GSM markets. 237ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying */ 238ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying private void updateDestinationAddress(final GenericPdu pdu) { 239ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying final String requestId = getRequestId(); 240ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying if (pdu == null) { 241ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying LogUtil.e(requestId, "updateDestinationAddress: can't parse input PDU"); 242ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying return ; 243ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 244ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying if (!(pdu instanceof SendReq)) { 245eeb364a1e8916609bee877b893443bd940ea87daYe Wen LogUtil.i(requestId, "updateDestinationAddress: not SendReq"); 246ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying return; 247ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 248ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying 249ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying boolean isUpdated = updateDestinationAddressPerType((SendReq)pdu, PduHeaders.TO); 250ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying isUpdated = updateDestinationAddressPerType((SendReq)pdu, PduHeaders.CC) || isUpdated; 251ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying isUpdated = updateDestinationAddressPerType((SendReq)pdu, PduHeaders.BCC) || isUpdated; 252ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying 253ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying if (isUpdated) { 254ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying mPduData = new PduComposer(mContext, (SendReq)pdu).make(); 255ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 256ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 257ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying 258ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying private boolean updateDestinationAddressPerType(SendReq pdu, int type) { 259ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying boolean isUpdated = false; 260ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying EncodedStringValue[] recipientNumbers = null; 261ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying 262ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying switch (type) { 263ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying case PduHeaders.TO: 264ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying recipientNumbers = pdu.getTo(); 265ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying break; 266ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying case PduHeaders.CC: 267ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying recipientNumbers = pdu.getCc(); 268ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying break; 269ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying case PduHeaders.BCC: 270ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying recipientNumbers = pdu.getBcc(); 271ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying break; 272ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying default: 273ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying return false; 274ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 275ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying 276ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying if (recipientNumbers != null) { 277ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying int nNumberCount = recipientNumbers.length; 278ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying if (nNumberCount > 0) { 279ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying Phone phone = PhoneFactory.getDefaultPhone(); 280ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying EncodedStringValue[] newNumbers = new EncodedStringValue[nNumberCount]; 281ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying String toNumber; 282ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying String newToNumber; 283ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying for (int i = 0; i < nNumberCount; i++) { 284ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying toNumber = recipientNumbers[i].getString(); 285fc9fe6722792fef7afc32f07abebcf885ab65c7cAmit Mahajan newToNumber = SmsNumberUtils.filterDestAddr(phone, toNumber); 286ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying if (!TextUtils.equals(toNumber, newToNumber)) { 287ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying isUpdated = true; 288ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying newNumbers[i] = new EncodedStringValue(newToNumber); 289ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } else { 290ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying newNumbers[i] = recipientNumbers[i]; 291ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 292ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 293ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying switch (type) { 294ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying case PduHeaders.TO: 295ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying pdu.setTo(newNumbers); 296ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying break; 297ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying case PduHeaders.CC: 298ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying pdu.setCc(newNumbers); 299ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying break; 300ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying case PduHeaders.BCC: 301ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying pdu.setBcc(newNumbers); 302ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying break; 303ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 304ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 305ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 306ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying 307ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying return isUpdated; 308ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying } 309ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying 310ab1cadebc3136446b44b4dbdcd9df51a960f289fXia Ying /** 311f6d88a72cd01ecaf9f0319249e239afc008f1ac8Cheuksan Wang * Read the pdu from the file descriptor and cache pdu bytes in request 312b83f2faa04dc275b6779644308384459ffcff63fJulian Odell * @return true if pdu read successfully 313b83f2faa04dc275b6779644308384459ffcff63fJulian Odell */ 314b83f2faa04dc275b6779644308384459ffcff63fJulian Odell private boolean readPduFromContentUri() { 315f6d88a72cd01ecaf9f0319249e239afc008f1ac8Cheuksan Wang if (mPduData != null) { 316f6d88a72cd01ecaf9f0319249e239afc008f1ac8Cheuksan Wang return true; 317b83f2faa04dc275b6779644308384459ffcff63fJulian Odell } 3184467007f09a9f2319ba25aa18e04f54693e6bfa1Jonathan Basseri final int bytesTobeRead = mMmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_MESSAGE_SIZE); 319f6d88a72cd01ecaf9f0319249e239afc008f1ac8Cheuksan Wang mPduData = mRequestManager.readPduFromContentUri(mPduUri, bytesTobeRead); 320b83f2faa04dc275b6779644308384459ffcff63fJulian Odell return (mPduData != null); 321b83f2faa04dc275b6779644308384459ffcff63fJulian Odell } 322b83f2faa04dc275b6779644308384459ffcff63fJulian Odell 323b786d3ea3daf4a91119ea06c532fe7ef5835944cYe Wen /** 324b83f2faa04dc275b6779644308384459ffcff63fJulian Odell * Transfer the received response to the caller (for send requests the pdu is small and can 325b83f2faa04dc275b6779644308384459ffcff63fJulian Odell * just include bytes as extra in the "returned" intent). 326b83f2faa04dc275b6779644308384459ffcff63fJulian Odell * 327b83f2faa04dc275b6779644308384459ffcff63fJulian Odell * @param fillIn the intent that will be returned to the caller 328b83f2faa04dc275b6779644308384459ffcff63fJulian Odell * @param response the pdu to transfer 329b83f2faa04dc275b6779644308384459ffcff63fJulian Odell */ 330b83f2faa04dc275b6779644308384459ffcff63fJulian Odell @Override 331b83f2faa04dc275b6779644308384459ffcff63fJulian Odell protected boolean transferResponse(Intent fillIn, byte[] response) { 332b83f2faa04dc275b6779644308384459ffcff63fJulian Odell // SendConf pdus are always small and can be included in the intent 333b83f2faa04dc275b6779644308384459ffcff63fJulian Odell if (response != null) { 3343e40f4c4a8c82e795a5cea235d52eacd177c0a69Ye Wen fillIn.putExtra(SmsManager.EXTRA_MMS_DATA, response); 335b83f2faa04dc275b6779644308384459ffcff63fJulian Odell } 336b83f2faa04dc275b6779644308384459ffcff63fJulian Odell return true; 337b83f2faa04dc275b6779644308384459ffcff63fJulian Odell } 338b83f2faa04dc275b6779644308384459ffcff63fJulian Odell 339b83f2faa04dc275b6779644308384459ffcff63fJulian Odell /** 340b83f2faa04dc275b6779644308384459ffcff63fJulian Odell * Read the data from the file descriptor if not yet done 341b83f2faa04dc275b6779644308384459ffcff63fJulian Odell * @return whether data successfully read 342b83f2faa04dc275b6779644308384459ffcff63fJulian Odell */ 3431b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry @Override 344b83f2faa04dc275b6779644308384459ffcff63fJulian Odell protected boolean prepareForHttpRequest() { 345b83f2faa04dc275b6779644308384459ffcff63fJulian Odell return readPduFromContentUri(); 346b83f2faa04dc275b6779644308384459ffcff63fJulian Odell } 347b83f2faa04dc275b6779644308384459ffcff63fJulian Odell 348b83f2faa04dc275b6779644308384459ffcff63fJulian Odell /** 3491b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry * Try sending via the carrier app 350b786d3ea3daf4a91119ea06c532fe7ef5835944cYe Wen * 3511b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry * @param context the context 3521b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry * @param carrierMessagingServicePackage the carrier messaging service sending the MMS 353b786d3ea3daf4a91119ea06c532fe7ef5835944cYe Wen */ 3541b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry public void trySendingByCarrierApp(Context context, String carrierMessagingServicePackage) { 3551b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry final CarrierSendManager carrierSendManger = new CarrierSendManager(); 3561b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry final CarrierSendCompleteCallback sendCallback = new CarrierSendCompleteCallback( 3571b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry context, carrierSendManger); 3581b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry carrierSendManger.sendMms(context, carrierMessagingServicePackage, sendCallback); 359b786d3ea3daf4a91119ea06c532fe7ef5835944cYe Wen } 360f6d88a72cd01ecaf9f0319249e239afc008f1ac8Cheuksan Wang 361f6d88a72cd01ecaf9f0319249e239afc008f1ac8Cheuksan Wang @Override 362f6d88a72cd01ecaf9f0319249e239afc008f1ac8Cheuksan Wang protected void revokeUriPermission(Context context) { 36389880097fa77ca930504c1a5ec9f6d87e9ae13dfYe Wen if (mPduUri != null) { 36489880097fa77ca930504c1a5ec9f6d87e9ae13dfYe Wen context.revokeUriPermission(mPduUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 36589880097fa77ca930504c1a5ec9f6d87e9ae13dfYe Wen } 366f6d88a72cd01ecaf9f0319249e239afc008f1ac8Cheuksan Wang } 3671b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry 3681b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry /** 3691b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry * Sends the MMS through through the carrier app. 3701b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry */ 3711b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry private final class CarrierSendManager extends CarrierMessagingServiceManager { 3721b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry // Initialized in sendMms 3731b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry private volatile CarrierSendCompleteCallback mCarrierSendCompleteCallback; 3741b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry 3751b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry void sendMms(Context context, String carrierMessagingServicePackage, 3761b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry CarrierSendCompleteCallback carrierSendCompleteCallback) { 3771b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry mCarrierSendCompleteCallback = carrierSendCompleteCallback; 3781b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry if (bindToCarrierMessagingService(context, carrierMessagingServicePackage)) { 3798153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.v("bindService() for carrier messaging service succeeded"); 3801b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } else { 3818153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e("bindService() for carrier messaging service failed"); 3821b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry carrierSendCompleteCallback.onSendMmsComplete( 3831b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry CarrierMessagingService.SEND_STATUS_RETRY_ON_CARRIER_NETWORK, 3841b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry null /* no sendConfPdu */); 3851b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 3861b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 3871b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry 3881b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry @Override 3891b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry protected void onServiceReady(ICarrierMessagingService carrierMessagingService) { 3901b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry try { 3911b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry Uri locationUri = null; 3921b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry if (mLocationUrl != null) { 3931b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry locationUri = Uri.parse(mLocationUrl); 3941b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 3951b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry carrierMessagingService.sendMms(mPduUri, mSubId, locationUri, 3961b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry mCarrierSendCompleteCallback); 3971b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } catch (RemoteException e) { 3988153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e("Exception sending MMS using the carrier messaging service: " + e, e); 3991b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry mCarrierSendCompleteCallback.onSendMmsComplete( 4001b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry CarrierMessagingService.SEND_STATUS_RETRY_ON_CARRIER_NETWORK, 4011b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry null /* no sendConfPdu */); 4021b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 4031b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 4041b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 4051b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry 4061b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry /** 4071b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry * A callback which notifies carrier messaging app send result. Once the result is ready, the 4081b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry * carrier messaging service connection is disposed. 4091b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry */ 4101b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry private final class CarrierSendCompleteCallback extends 4111b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry MmsRequest.CarrierMmsActionCallback { 4121b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry private final Context mContext; 4131b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry private final CarrierSendManager mCarrierSendManager; 4141b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry 4151b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry public CarrierSendCompleteCallback(Context context, CarrierSendManager carrierSendManager) { 4161b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry mContext = context; 4171b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry mCarrierSendManager = carrierSendManager; 4181b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 4191b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry 4201b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry @Override 4211b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry public void onSendMmsComplete(int result, byte[] sendConfPdu) { 4228153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.d("Carrier app result for send: " + result); 4231b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry mCarrierSendManager.disposeConnection(mContext); 4241b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry 4251b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry if (!maybeFallbackToRegularDelivery(result)) { 4261b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry processResult(mContext, toSmsManagerResult(result), sendConfPdu, 4271b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry 0/* httpStatusCode */); 4281b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 4291b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 4301b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry 4311b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry @Override 4321b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry public void onDownloadMmsComplete(int result) { 4338153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e("Unexpected onDownloadMmsComplete call with result: " + result); 4341b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 4351b2066c9c8f40e2cdabdedfe873a4c960ec7b7d6Abhijith Shastry } 436c91cc9d4a5aa12a570a3b35a12b3e34a6a9eeb51Ye Wen} 437