Home | History | Annotate | Download | only in receiver
      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
     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