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