1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.messaging.receiver;
18 
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.net.Uri;
23 import android.telephony.SmsMessage;
24 
25 import com.android.messaging.datamodel.action.ProcessDeliveryReportAction;
26 import com.android.messaging.datamodel.action.ProcessDownloadedMmsAction;
27 import com.android.messaging.datamodel.action.ProcessSentMessageAction;
28 import com.android.messaging.datamodel.data.ParticipantData;
29 import com.android.messaging.sms.MmsUtils;
30 import com.android.messaging.sms.SmsSender;
31 import com.android.messaging.util.LogUtil;
32 
33 /**
34  * The SMS sent and delivery intent receiver.
35  *
36  * This class just simply forwards the intents to proper recipients for actual handling.
37  */
38 public class SendStatusReceiver extends BroadcastReceiver {
39     public static final String MESSAGE_SENT_ACTION =
40             "com.android.messaging.receiver.SendStatusReceiver.MESSAGE_SENT";
41     public static final String MESSAGE_DELIVERED_ACTION =
42             "com.android.messaging.receiver.SendStatusReceiver.MESSAGE_DELIVERED";
43     public static final String MMS_SENT_ACTION =
44             "com.android.messaging.receiver.SendStatusReceiver.MMS_SENT";
45     public static final String MMS_DOWNLOADED_ACTION =
46             "com.android.messaging.receiver.SendStatusReceiver.MMS_DOWNLOADED";
47 
48     // Defined by platform, but no constant provided. See docs for SmsManager.sendTextMessage.
49     public static final String EXTRA_ERROR_CODE = "errorCode";
50 
51     public static final String EXTRA_PART_ID = "partId";
52     public static final String EXTRA_SUB_ID = "subId";
53 
54     public static final int NO_ERROR_CODE = 0;
55     public static final int NO_PART_ID = -1;
56 
57     @Override
onReceive(final Context context, final Intent intent)58     public void onReceive(final Context context, final Intent intent) {
59         // This will be called on the main thread (so it should exit quickly)
60         final String action = intent.getAction();
61         final int resultCode = getResultCode();
62         if (MESSAGE_SENT_ACTION.equals(action)) {
63             final Uri requestId = intent.getData();
64             SmsSender.setResult(
65                     requestId,
66                     resultCode,
67                     intent.getIntExtra(EXTRA_ERROR_CODE, NO_ERROR_CODE),
68                     intent.getIntExtra(EXTRA_PART_ID, NO_PART_ID),
69                     intent.getIntExtra(EXTRA_SUB_ID, ParticipantData.DEFAULT_SELF_SUB_ID));
70         } else if (MMS_SENT_ACTION.equals(action)) {
71             final Uri messageUri = intent.getData();
72             ProcessSentMessageAction.processMmsSent(resultCode, messageUri,
73                     intent.getExtras());
74         } else if (MMS_DOWNLOADED_ACTION.equals(action)) {
75             ProcessDownloadedMmsAction.processMessageDownloaded(resultCode,
76                     intent.getExtras());
77         } else if (MESSAGE_DELIVERED_ACTION.equals(action)) {
78             final SmsMessage smsMessage = MmsUtils.getSmsMessageFromDeliveryReport(intent);
79             final Uri smsMessageUri = intent.getData();
80             if (smsMessage == null) {
81                 LogUtil.e(LogUtil.BUGLE_TAG, "SendStatusReceiver: empty report message");
82                 return;
83             }
84             int status = 0;
85             try {
86                 status = smsMessage.getStatus();
87             } catch (final NullPointerException e) {
88                 // Sometimes, SmsMessage.mWrappedSmsMessage is null causing NPE when we access
89                 // the methods on it although the SmsMessage itself is not null.
90                 LogUtil.e(LogUtil.BUGLE_TAG, "SendStatusReceiver: NPE inside SmsMessage");
91                 return;
92             }
93             ProcessDeliveryReportAction.deliveryReportReceived(smsMessageUri, status);
94         }
95     }
96 }
97