172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/* 272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 Esmertec AG. 372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 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.ui; 1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.ArrayList; 21d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.HashMap; 22d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Iterator; 23d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.List; 24d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Map; 25d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Set; 2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.ListActivity; 2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent; 2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor; 30d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.database.sqlite.SqliteWrapper; 3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri; 3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Bundle; 33f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Mms; 34f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms; 3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.PhoneNumberUtils; 3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.TextUtils; 3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log; 3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.LayoutInflater; 3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View; 4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Window; 4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ListView; 4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 43d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.R; 44d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.PduHeaders; 4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/** 4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This is the UI for displaying a delivery report: 4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This activity can handle the following parameters from the intent 5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * by which it is launched: 5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * thread_id long The id of the conversation from which to get the recipients 5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * for the report. 5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * message_id long The id of the message about which a report should be displayed. 5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * message_type String The type of message (Sms or Mms). This is used in 5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * conjunction with the message id to retrive the particular message that 5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * the report will be about. 5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class DeliveryReportActivity extends ListActivity { 6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String LOG_TAG = "DeliveryReportActivity"; 6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final String[] MMS_REPORT_REQUEST_PROJECTION = new String[] { 6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.Addr.ADDRESS, //0 6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.DELIVERY_REPORT, //1 6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.READ_REPORT //2 6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final String[] MMS_REPORT_STATUS_PROJECTION = new String[] { 6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.Addr.ADDRESS, //0 7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project "delivery_status", //1 7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project "read_status" //2 7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final String[] SMS_REPORT_STATUS_PROJECTION = new String[] { 7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Sms.ADDRESS, //0 76831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor Sms.STATUS, //1 77831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor Sms.DATE_SENT, //2 78831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor Sms.TYPE //3 7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // These indices must sync up with the projections above. 8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_RECIPIENT = 0; 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_DELIVERY_REPORT = 1; 8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_READ_REPORT = 2; 8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_DELIVERY_STATUS = 1; 8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_READ_STATUS = 2; 87831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor static final int COLUMN_DATE_SENT = 2; 88831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor static final int COLUMN_MESSAGE_TYPE = 3; 8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private long mMessageId; 9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private String mMessageType; 9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project protected void onCreate(Bundle icicle) { 9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project super.onCreate(icicle); 9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project requestWindowFeature(Window.FEATURE_NO_TITLE); 9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project setContentView(R.layout.delivery_report_activity); 9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent intent = getIntent(); 10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMessageId = getMessageId(icicle, intent); 10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMessageType = getMessageType(icicle, intent); 10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project initListView(); 10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project initListAdapter(); 10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private void initListView() { 10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Add the header for the list view. 10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project LayoutInflater inflater = getLayoutInflater(); 11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project View header = inflater.inflate(R.layout.delivery_report_header, null); 11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project getListView().addHeaderView(header, null, true); 11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private void initListAdapter() { 11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project List<DeliveryReportItem> items = getReportItems(); 11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (items == null) { 11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project items = new ArrayList<DeliveryReportItem>(1); 118831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor items.add(new DeliveryReportItem("", getString(R.string.status_none), null)); 11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w(LOG_TAG, "cursor == null"); 12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project setListAdapter(new DeliveryReportAdapter(this, items)); 12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onResume() { 12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project super.onResume(); 12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project refreshDeliveryReport(); 12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private void refreshDeliveryReport() { 13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ListView list = getListView(); 13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project list.invalidateViews(); 13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project list.requestFocus(); 13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private long getMessageId(Bundle icicle, Intent intent) { 13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project long msgId = 0L; 13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (icicle != null) { 14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project msgId = icicle.getLong("message_id"); 14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msgId == 0L) { 14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project msgId = intent.getLongExtra("message_id", 0L); 14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return msgId; 14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private String getMessageType(Bundle icicle, Intent intent) { 15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String msgType = null; 15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (icicle != null) { 15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project msgType = icicle.getString("message_type"); 15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msgType == null) { 15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project msgType = intent.getStringExtra("message_type"); 15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return msgType; 16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private List<DeliveryReportItem> getReportItems() { 16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (mMessageType.equals("sms")) { 16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getSmsReportItems(); 16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getMmsReportItems(); 16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private List<DeliveryReportItem> getSmsReportItems() { 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String selection = "_id = " + mMessageId; 17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor c = SqliteWrapper.query(this, getContentResolver(), Sms.CONTENT_URI, 17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SMS_REPORT_STATUS_PROJECTION, selection, null, null); 17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c == null) { 17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c.getCount() <= 0) { 18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project List<DeliveryReportItem> items = new ArrayList<DeliveryReportItem>(); 18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project while (c.moveToNext()) { 187831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor // For sent messages with delivery reports, we stick the delivery time in the 188831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor // date_sent column (see MessageStatusReceiver). 189831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor String deliveryDateString = null; 190831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor long deliveryDate = c.getLong(COLUMN_DATE_SENT); 191831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor int messageType = c.getInt(COLUMN_MESSAGE_TYPE); 192831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor if (messageType == Sms.MESSAGE_TYPE_SENT && deliveryDate > 0) { 193831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor deliveryDateString = getString(R.string.delivered_label) + 194831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor MessageUtils.formatTimeStampString(this, 195831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor deliveryDate, true); 196831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor } 197831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor 19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project items.add(new DeliveryReportItem( 19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project getString(R.string.recipient_label) + c.getString(COLUMN_RECIPIENT), 200831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor getString(R.string.status_label) + 201831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor getSmsStatusText(c.getInt(COLUMN_DELIVERY_STATUS)), 202831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor deliveryDateString)); 20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return items; 20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.close(); 20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private String getMmsReportStatusText( 21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsReportRequest request, 21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Map<String, MmsReportStatus> reportStatus) { 21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (reportStatus == null) { 21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // haven't received any reports. 21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_pending); 21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String recipient = request.getRecipient(); 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project recipient = (Mms.isEmailAddress(recipient))? 22020b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick Mms.extractAddrSpec(recipient): PhoneNumberUtils.stripSeparators(recipient); 22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsReportStatus status = queryStatusByRecipient(reportStatus, recipient); 22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (status == null) { 22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // haven't received any reports. 22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_pending); 22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (request.isReadReportRequested()) { 22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (status.readStatus != 0) { 22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch (status.readStatus) { 23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.READ_STATUS_READ: 23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_read); 23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.READ_STATUS__DELETED_WITHOUT_BEING_READ: 23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_unread); 23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch (status.deliveryStatus) { 23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case 0: // No delivery report received so far. 24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_pending); 24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.STATUS_FORWARDED: 24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.STATUS_RETRIEVED: 24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_received); 24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.STATUS_REJECTED: 24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_rejected); 24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project default: 24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_failed); 24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static MmsReportStatus queryStatusByRecipient( 25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Map<String, MmsReportStatus> status, String recipient) { 25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Set<String> recipientSet = status.keySet(); 25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Iterator<String> iterator = recipientSet.iterator(); 25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project while (iterator.hasNext()) { 25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String r = iterator.next(); 25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (Mms.isEmailAddress(recipient)) { 25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (TextUtils.equals(r, recipient)) { 25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return status.get(r); 26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project else if (PhoneNumberUtils.compare(r, recipient)) { 26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return status.get(r); 26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private List<DeliveryReportItem> getMmsReportItems() { 27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project List<MmsReportRequest> reportReqs = getMmsReportRequests(); 27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (null == reportReqs) { 27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (reportReqs.size() == 0) { 27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Map<String, MmsReportStatus> reportStatus = getMmsReportStatus(); 28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project List<DeliveryReportItem> items = new ArrayList<DeliveryReportItem>(); 28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (MmsReportRequest reportReq : reportReqs) { 282831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor String statusText = getString(R.string.status_label) + 28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project getMmsReportStatusText(reportReq, reportStatus); 284831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor items.add(new DeliveryReportItem(getString(R.string.recipient_label) + 285831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor reportReq.getRecipient(), statusText, null)); 28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return items; 28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private Map<String, MmsReportStatus> getMmsReportStatus() { 29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = Uri.withAppendedPath(Mms.REPORT_STATUS_URI, 29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String.valueOf(mMessageId)); 29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor c = SqliteWrapper.query(this, getContentResolver(), uri, 29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MMS_REPORT_STATUS_PROJECTION, null, null, null); 29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c == null) { 29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Map<String, MmsReportStatus> statusMap = 30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new HashMap<String, MmsReportStatus>(); 30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project while (c.moveToNext()) { 30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String recipient = c.getString(COLUMN_RECIPIENT); 30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project recipient = (Mms.isEmailAddress(recipient))? 30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.extractAddrSpec(recipient): 30820b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick PhoneNumberUtils.stripSeparators(recipient); 30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsReportStatus status = new MmsReportStatus( 31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.getInt(COLUMN_DELIVERY_STATUS), 31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.getInt(COLUMN_READ_STATUS)); 31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project statusMap.put(recipient, status); 31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return statusMap; 31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.close(); 31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private List<MmsReportRequest> getMmsReportRequests() { 32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = Uri.withAppendedPath(Mms.REPORT_REQUEST_URI, 32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String.valueOf(mMessageId)); 32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor c = SqliteWrapper.query(this, getContentResolver(), uri, 32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MMS_REPORT_REQUEST_PROJECTION, null, null, null); 32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c == null) { 32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c.getCount() <= 0) { 33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project List<MmsReportRequest> reqList = new ArrayList<MmsReportRequest>(); 33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project while (c.moveToNext()) { 33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project reqList.add(new MmsReportRequest( 33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.getString(COLUMN_RECIPIENT), 33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.getInt(COLUMN_DELIVERY_REPORT), 34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.getInt(COLUMN_READ_REPORT))); 34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return reqList; 34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.close(); 34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private String getSmsStatusText(int status) { 34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (status == Sms.STATUS_NONE) { 35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // No delivery report requested 35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_none); 35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (status >= Sms.STATUS_FAILED) { 35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Failure 35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_failed); 35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (status >= Sms.STATUS_PENDING) { 35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Pending 35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_pending); 35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Success 36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_received); 36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final class MmsReportStatus { 36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final int deliveryStatus; 36672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final int readStatus; 36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public MmsReportStatus(int drStatus, int rrStatus) { 36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project deliveryStatus = drStatus; 37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project readStatus = rrStatus; 37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final class MmsReportRequest { 37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final String mRecipient; 37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final boolean mIsDeliveryReportRequsted; 37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final boolean mIsReadReportRequested; 37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public MmsReportRequest(String recipient, int drValue, int rrValue) { 38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mRecipient = recipient; 38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mIsDeliveryReportRequsted = drValue == PduHeaders.VALUE_YES; 38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mIsReadReportRequested = rrValue == PduHeaders.VALUE_YES; 38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public String getRecipient() { 38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mRecipient; 38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 38972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public boolean isDeliveryReportRequested() { 39072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mIsDeliveryReportRequsted; 39172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 39272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 39372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public boolean isReadReportRequested() { 39472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mIsReadReportRequested; 39572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 39672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 39772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 398