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