172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/*
272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2007 Esmertec AG.
372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * you may not use this file except in compliance with the License.
772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * You may obtain a copy of the License at
872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
1172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * See the License for the specific language governing permissions and
1572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * limitations under the License.
1672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
1772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpackage com.android.mms.transaction;
1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.BroadcastReceiver;
2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentUris;
2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentValues;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context;
2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor;
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri;
27f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms;
2837321876549776417f035118f157d9531f73de6bWink Savilleimport android.telephony.SmsMessage;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31fd644551e8506266aad2b76463b51b44154ed62fTom Taylorimport android.database.sqlite.SqliteWrapper;
32e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huangimport com.android.mms.LogTag;
3337321876549776417f035118f157d9531f73de6bWink Saville
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class MessageStatusReceiver extends BroadcastReceiver {
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static final String MESSAGE_STATUS_RECEIVED_ACTION =
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            "com.android.mms.transaction.MessageStatusReceiver.MESSAGE_STATUS_RECEIVED";
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final String[] ID_PROJECTION = new String[] { Sms._ID };
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final String LOG_TAG = "MessageStatusReceiver";
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final Uri STATUS_URI =
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Uri.parse("content://sms/status");
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onReceive(Context context, Intent intent) {
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (MESSAGE_STATUS_RECEIVED_ACTION.equals(intent.getAction())) {
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Uri messageUri = intent.getData();
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            byte[] pdu = (byte[]) intent.getExtra("pdu");
482b04a715ca8aba549ead0bc2b45f650386962c15Jake Hamby            String format = intent.getStringExtra("format");
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
502b04a715ca8aba549ead0bc2b45f650386962c15Jake Hamby            SmsMessage message = updateMessageStatus(context, messageUri, pdu, format);
513b21f6ab04db5936d73e9f53032f1587389380ffTom Taylor
523b21f6ab04db5936d73e9f53032f1587389380ffTom Taylor            // Called on the UI thread so don't block.
535b7e0f3442f25481e5ee4ebe4ca37413ddd04b71Tom Taylor            if (message != null && message.getStatus() < Sms.STATUS_PENDING)
54faa17561a2f8d7e0e1693770f90e78e7b9bf5c7bSang-Jun Park                MessagingNotification.nonBlockingUpdateNewMessageIndicator(context,
55faa17561a2f8d7e0e1693770f90e78e7b9bf5c7bSang-Jun Park                        true, message.isStatusReportMessage());
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project       }
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
592b04a715ca8aba549ead0bc2b45f650386962c15Jake Hamby    private SmsMessage updateMessageStatus(Context context, Uri messageUri, byte[] pdu,
602b04a715ca8aba549ead0bc2b45f650386962c15Jake Hamby            String format) {
615b7e0f3442f25481e5ee4ebe4ca37413ddd04b71Tom Taylor        SmsMessage message = SmsMessage.createFromPdu(pdu, format);
625b7e0f3442f25481e5ee4ebe4ca37413ddd04b71Tom Taylor        if (message == null) {
635b7e0f3442f25481e5ee4ebe4ca37413ddd04b71Tom Taylor            return null;
645b7e0f3442f25481e5ee4ebe4ca37413ddd04b71Tom Taylor        }
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create a "status/#" URL and use it to update the
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // message's status in the database.
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(),
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                            messageUri, ID_PROJECTION, null, null, null);
69faa17561a2f8d7e0e1693770f90e78e7b9bf5c7bSang-Jun Park
70e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang        try {
71e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang            if (cursor.moveToFirst()) {
72e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang                int messageId = cursor.getInt(0);
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
74e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang                Uri updateUri = ContentUris.withAppendedId(STATUS_URI, messageId);
75e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang                int status = message.getStatus();
76faa17561a2f8d7e0e1693770f90e78e7b9bf5c7bSang-Jun Park                boolean isStatusReport = message.isStatusReportMessage();
77e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang                ContentValues contentValues = new ContentValues(1);
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
79e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang                if (Log.isLoggable(LogTag.TAG, Log.DEBUG)) {
80c36deab7d27940a07554cc424114d9c9ddd36552Tom Taylor                    log("updateMessageStatus: msgUrl=" + messageUri + ", status=" + status +
81c36deab7d27940a07554cc424114d9c9ddd36552Tom Taylor                            ", isStatusReport=" + isStatusReport);
82e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang                }
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
84e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang                contentValues.put(Sms.STATUS, status);
85e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang                SqliteWrapper.update(context, context.getContentResolver(),
86e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang                                    updateUri, contentValues, null, null);
87e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang            } else {
88e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang                error("Can't find message for status update: " + messageUri);
89e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang            }
90e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang        } finally {
91e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang            cursor.close();
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
93faa17561a2f8d7e0e1693770f90e78e7b9bf5c7bSang-Jun Park        return message;
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void error(String message) {
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Log.e(LOG_TAG, "[MessageStatusReceiver] " + message);
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
99c36deab7d27940a07554cc424114d9c9ddd36552Tom Taylor
100e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang    private void log(String message) {
101e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang        Log.d(LOG_TAG, "[MessageStatusReceiver] " + message);
102e3baaa51cd25b52c7a24e381319926b9da00abdfWei Huang    }
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
104