DeliveryReportActivity.java revision f7e8281a223af6228e6399055a6197a1edd9bc3a
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 2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R; 21f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.PduHeaders; 22fd644551e8506266aad2b76463b51b44154ed62fTom Taylorimport android.database.sqlite.SqliteWrapper; 2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.ListActivity; 2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent; 2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor; 2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri; 2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Bundle; 29f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Mms; 30f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms; 3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.PhoneNumberUtils; 3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.TextUtils; 3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log; 3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.LayoutInflater; 3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View; 3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Window; 3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ListView; 3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.ArrayList; 4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.HashMap; 4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.Iterator; 4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.List; 4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.Map; 4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.Set; 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 7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Sms.STATUS //1 7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // These indices must sync up with the projections above. 8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_RECIPIENT = 0; 8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_DELIVERY_REPORT = 1; 8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_READ_REPORT = 2; 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_DELIVERY_STATUS = 1; 8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_READ_STATUS = 2; 8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private long mMessageId; 8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private String mMessageType; 8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project protected void onCreate(Bundle icicle) { 9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project super.onCreate(icicle); 9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project requestWindowFeature(Window.FEATURE_NO_TITLE); 9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project setContentView(R.layout.delivery_report_activity); 9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent intent = getIntent(); 9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMessageId = getMessageId(icicle, intent); 9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMessageType = getMessageType(icicle, intent); 9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project initListView(); 10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project initListAdapter(); 10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private void initListView() { 10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Add the header for the list view. 10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project LayoutInflater inflater = getLayoutInflater(); 10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project View header = inflater.inflate(R.layout.delivery_report_header, null); 10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project getListView().addHeaderView(header, null, true); 10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private void initListAdapter() { 11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project List<DeliveryReportItem> items = getReportItems(); 11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (items == null) { 11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project items = new ArrayList<DeliveryReportItem>(1); 11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project items.add(new DeliveryReportItem("", getString(R.string.status_none))); 11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w(LOG_TAG, "cursor == null"); 11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project setListAdapter(new DeliveryReportAdapter(this, items)); 11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onResume() { 12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project super.onResume(); 12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project refreshDeliveryReport(); 12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private void refreshDeliveryReport() { 12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ListView list = getListView(); 12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project list.invalidateViews(); 12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project list.requestFocus(); 13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private long getMessageId(Bundle icicle, Intent intent) { 13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project long msgId = 0L; 13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (icicle != null) { 13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project msgId = icicle.getLong("message_id"); 13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msgId == 0L) { 14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project msgId = intent.getLongExtra("message_id", 0L); 14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return msgId; 14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private String getMessageType(Bundle icicle, Intent intent) { 14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String msgType = null; 14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (icicle != null) { 15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project msgType = icicle.getString("message_type"); 15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msgType == null) { 15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project msgType = intent.getStringExtra("message_type"); 15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return msgType; 15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private List<DeliveryReportItem> getReportItems() { 16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (mMessageType.equals("sms")) { 16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getSmsReportItems(); 16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getMmsReportItems(); 16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private List<DeliveryReportItem> getSmsReportItems() { 16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String selection = "_id = " + mMessageId; 17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor c = SqliteWrapper.query(this, getContentResolver(), Sms.CONTENT_URI, 17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SMS_REPORT_STATUS_PROJECTION, selection, null, null); 17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c == null) { 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c.getCount() <= 0) { 17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project List<DeliveryReportItem> items = new ArrayList<DeliveryReportItem>(); 18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project while (c.moveToNext()) { 18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project items.add(new DeliveryReportItem( 18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project getString(R.string.recipient_label) + c.getString(COLUMN_RECIPIENT), 18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project getString(R.string.status_label) + 18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project getSmsStatusText(c.getInt(COLUMN_DELIVERY_STATUS)))); 18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return items; 18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.close(); 19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private String getMmsReportStatusText( 19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsReportRequest request, 19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Map<String, MmsReportStatus> reportStatus) { 19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (reportStatus == null) { 19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // haven't received any reports. 19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_pending); 20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String recipient = request.getRecipient(); 20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project recipient = (Mms.isEmailAddress(recipient))? 20420b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick Mms.extractAddrSpec(recipient): PhoneNumberUtils.stripSeparators(recipient); 20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsReportStatus status = queryStatusByRecipient(reportStatus, recipient); 20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (status == null) { 20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // haven't received any reports. 20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_pending); 20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (request.isReadReportRequested()) { 21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (status.readStatus != 0) { 21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch (status.readStatus) { 21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.READ_STATUS_READ: 21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_read); 21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.READ_STATUS__DELETED_WITHOUT_BEING_READ: 21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_unread); 21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch (status.deliveryStatus) { 22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case 0: // No delivery report received so far. 22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_pending); 22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.STATUS_FORWARDED: 22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.STATUS_RETRIEVED: 22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_received); 22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.STATUS_REJECTED: 22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_rejected); 23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project default: 23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_failed); 23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static MmsReportStatus queryStatusByRecipient( 23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Map<String, MmsReportStatus> status, String recipient) { 23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Set<String> recipientSet = status.keySet(); 23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Iterator<String> iterator = recipientSet.iterator(); 23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project while (iterator.hasNext()) { 24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String r = iterator.next(); 24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (Mms.isEmailAddress(recipient)) { 24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (TextUtils.equals(r, recipient)) { 24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return status.get(r); 24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project else if (PhoneNumberUtils.compare(r, recipient)) { 24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return status.get(r); 24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private List<DeliveryReportItem> getMmsReportItems() { 25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project List<MmsReportRequest> reportReqs = getMmsReportRequests(); 25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (null == reportReqs) { 25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (reportReqs.size() == 0) { 26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Map<String, MmsReportStatus> reportStatus = getMmsReportStatus(); 26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project List<DeliveryReportItem> items = new ArrayList<DeliveryReportItem>(); 26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (MmsReportRequest reportReq : reportReqs) { 26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String statusText = getString(R.string.status_label) + 26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project getMmsReportStatusText(reportReq, reportStatus); 26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project items.add(new DeliveryReportItem(getString(R.string.recipient_label) + 26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project reportReq.getRecipient(), statusText)); 27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return items; 27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private Map<String, MmsReportStatus> getMmsReportStatus() { 27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = Uri.withAppendedPath(Mms.REPORT_STATUS_URI, 27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String.valueOf(mMessageId)); 27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor c = SqliteWrapper.query(this, getContentResolver(), uri, 27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MMS_REPORT_STATUS_PROJECTION, null, null, null); 27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c == null) { 28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Map<String, MmsReportStatus> statusMap = 28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new HashMap<String, MmsReportStatus>(); 28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project while (c.moveToNext()) { 28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String recipient = c.getString(COLUMN_RECIPIENT); 29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project recipient = (Mms.isEmailAddress(recipient))? 29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.extractAddrSpec(recipient): 29220b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick PhoneNumberUtils.stripSeparators(recipient); 29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsReportStatus status = new MmsReportStatus( 29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.getInt(COLUMN_DELIVERY_STATUS), 29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.getInt(COLUMN_READ_STATUS)); 29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project statusMap.put(recipient, status); 29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return statusMap; 29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.close(); 30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private List<MmsReportRequest> getMmsReportRequests() { 30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = Uri.withAppendedPath(Mms.REPORT_REQUEST_URI, 30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String.valueOf(mMessageId)); 30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor c = SqliteWrapper.query(this, getContentResolver(), uri, 30872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MMS_REPORT_REQUEST_PROJECTION, null, null, null); 30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c == null) { 31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c.getCount() <= 0) { 31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project List<MmsReportRequest> reqList = new ArrayList<MmsReportRequest>(); 32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project while (c.moveToNext()) { 32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project reqList.add(new MmsReportRequest( 32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.getString(COLUMN_RECIPIENT), 32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.getInt(COLUMN_DELIVERY_REPORT), 32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.getInt(COLUMN_READ_REPORT))); 32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return reqList; 32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.close(); 32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private String getSmsStatusText(int status) { 33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (status == Sms.STATUS_NONE) { 33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // No delivery report requested 33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_none); 33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (status >= Sms.STATUS_FAILED) { 33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Failure 33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_failed); 33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (status >= Sms.STATUS_PENDING) { 34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Pending 34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_pending); 34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Success 34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getString(R.string.status_received); 34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final class MmsReportStatus { 34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final int deliveryStatus; 35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final int readStatus; 35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public MmsReportStatus(int drStatus, int rrStatus) { 35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project deliveryStatus = drStatus; 35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project readStatus = rrStatus; 35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final class MmsReportRequest { 35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final String mRecipient; 36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final boolean mIsDeliveryReportRequsted; 36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final boolean mIsReadReportRequested; 36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public MmsReportRequest(String recipient, int drValue, int rrValue) { 36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mRecipient = recipient; 36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mIsDeliveryReportRequsted = drValue == PduHeaders.VALUE_YES; 36672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mIsReadReportRequested = rrValue == PduHeaders.VALUE_YES; 36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public String getRecipient() { 37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mRecipient; 37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public boolean isDeliveryReportRequested() { 37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mIsDeliveryReportRequsted; 37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public boolean isReadReportRequested() { 37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mIsReadReportRequested; 37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 382