MessageUtils.java revision 72735c62aba8fd2a9420a0f9f83d22543e3c164f
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.MmsConfig; 2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R; 2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.MediaModel; 2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideModel; 2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideshowModel; 2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.CarrierContentRestriction; 2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.transaction.MessagingNotification; 2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.transaction.MmsMessageSender; 2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.util.AddressUtils; 2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.ContentType; 3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.MmsException; 3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.CharacterSets; 3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.EncodedStringValue; 3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.MultimediaMessagePdu; 3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.NotificationInd; 3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.PduHeaders; 3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.PduPart; 3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.PduPersister; 3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.RetrieveConf; 3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.SendReq; 4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.util.SqliteWrapper; 4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.Activity; 4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.AlertDialog; 4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.ProgressDialog; 4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentUris; 4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentValues; 4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context; 4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface; 4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent; 5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface.OnCancelListener; 5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface.OnClickListener; 5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.res.Resources; 5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor; 5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.Bitmap; 5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.Bitmap.CompressFormat; 5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.media.RingtoneManager; 5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri; 5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Handler; 5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.provider.Settings; 6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.provider.Telephony.Mms; 6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.provider.Telephony.Sms; 6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.provider.Telephony.Threads; 6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.PhoneNumberUtils; 6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.TelephonyManager; 6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.TextUtils; 6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.format.DateUtils; 6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.format.Time; 6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.URLSpan; 6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log; 7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.io.ByteArrayOutputStream; 7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.ArrayList; 7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.HashMap; 7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.Map; 7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.concurrent.ConcurrentHashMap; 7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/** 7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * An utility class for managing messages. 7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class MessageUtils { 8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project interface ResizeImageResultCallback { 8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project void onResizeResult(PduPart part); 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String TAG = "MessageUtils"; 8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String sLocalNumber; 8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Cache of both groups of space-separated ids to their full 8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // comma-separated display names, as well as individual ids to 9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // display names. 9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO: is it possible for canonical address ID keys to be 9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // re-used? SQLite does reuse IDs on NULL id_ insert, but does 9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // anything ever delete from the mmssms.db canonical_addresses 9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // table? Nothing that I could find. 9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final Map<String, String> sRecipientAddress = 9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new ConcurrentHashMap<String, String>(20 /* initial capacity */); 9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static final int READ_THREAD = 1; 9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private MessageUtils() { 10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Forbidden being instantiated. 10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String getMessageDetails(Context context, Cursor cursor, int size) { 10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (cursor == null) { 10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if ("mms".equals(cursor.getString(MessageListAdapter.COLUMN_MSG_TYPE))) { 11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int type = cursor.getInt(MessageListAdapter.COLUMN_MMS_MESSAGE_TYPE); 11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch (type) { 11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND: 11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getNotificationIndDetails(context, cursor); 11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF: 11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.MESSAGE_TYPE_SEND_REQ: 11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getMultimediaMessageDetails(context, cursor, size); 11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project default: 11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w(TAG, "No details could be retrieved."); 11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return ""; 12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getTextMessageDetails(context, cursor); 12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String getNotificationIndDetails(Context context, Cursor cursor) { 12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder details = new StringBuilder(); 12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Resources res = context.getResources(); 12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project long id = cursor.getLong(MessageListAdapter.COLUMN_ID); 13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, id); 13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project NotificationInd nInd; 13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project nInd = (NotificationInd) PduPersister.getPduPersister( 13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context).load(uri); 13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (MmsException e) { 13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.e(TAG, "Failed to load the message: " + uri, e); 13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return context.getResources().getString(R.string.cannot_get_details); 14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message Type: Mms Notification. 14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_type_label)); 14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.multimedia_notification)); 14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // From: *** 14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String from = extractEncStr(context, nInd.getFrom()); 14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.from_label)); 15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(!TextUtils.isEmpty(from)? from: 15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project res.getString(R.string.hidden_sender_address)); 15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Date: *** 15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString( 15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project R.string.expire_on, 15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MessageUtils.formatTimeStampString( 15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context, nInd.getExpiry() * 1000L, true))); 15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Subject: *** 16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.subject_label)); 16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project EncodedStringValue subject = nInd.getSubject(); 16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (subject != null) { 16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(subject.getString()); 16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message class: Personal/Advertisement/Infomational/Auto 17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_class_label)); 17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(new String(nInd.getMessageClass())); 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message size: *** KB 17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_size_label)); 17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(String.valueOf((nInd.getMessageSize() + 1023) / 1024)); 17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(context.getString(R.string.kilobyte)); 17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return details.toString(); 18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String getMultimediaMessageDetails( 18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Context context, Cursor cursor, int size) { 18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int type = cursor.getInt(MessageListAdapter.COLUMN_MMS_MESSAGE_TYPE); 18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (type == PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND) { 18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getNotificationIndDetails(context, cursor); 18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder details = new StringBuilder(); 19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Resources res = context.getResources(); 19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project long id = cursor.getLong(MessageListAdapter.COLUMN_ID); 19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, id); 19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MultimediaMessagePdu msg; 19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project msg = (MultimediaMessagePdu) PduPersister.getPduPersister( 19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context).load(uri); 20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (MmsException e) { 20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.e(TAG, "Failed to load the message: " + uri, e); 20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return context.getResources().getString(R.string.cannot_get_details); 20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message Type: Text message. 20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_type_label)); 20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.multimedia_message)); 20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msg instanceof RetrieveConf) { 21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // From: *** 21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String from = extractEncStr(context, ((RetrieveConf) msg).getFrom()); 21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.from_label)); 21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(!TextUtils.isEmpty(from)? from: 21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project res.getString(R.string.hidden_sender_address)); 21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // To: *** 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.to_address_label)); 22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project EncodedStringValue[] to = msg.getTo(); 22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (to != null) { 22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(EncodedStringValue.concat(to)); 22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project else { 22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w(TAG, "recipient list is empty!"); 22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Bcc: *** 23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msg instanceof SendReq) { 23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project EncodedStringValue[] values = ((SendReq) msg).getBcc(); 23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if ((values != null) && (values.length > 0)) { 23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.bcc_label)); 23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(EncodedStringValue.concat(values)); 23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Date: *** 24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int msgBox = cursor.getInt(MessageListAdapter.COLUMN_MMS_MESSAGE_BOX); 24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msgBox == Mms.MESSAGE_BOX_DRAFTS) { 24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.saved_label)); 24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (msgBox == Mms.MESSAGE_BOX_INBOX) { 24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.received_label)); 24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.sent_label)); 24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(MessageUtils.formatTimeStampString( 25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context, msg.getDate() * 1000L, true)); 25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Subject: *** 25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.subject_label)); 25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project EncodedStringValue subject = msg.getSubject(); 25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (subject != null) { 26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String subStr = subject.getString(); 26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message size should include size of subject. 26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project size += subStr.length(); 26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(subStr); 26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Priority: High/Normal/Low 26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.priority_label)); 26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(getPriorityDescription(context, msg.getPriority())); 27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message size: *** KB 27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_size_label)); 27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append((size - 1)/1000 + 1); 27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(" KB"); 27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return details.toString(); 27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String getTextMessageDetails(Context context, Cursor cursor) { 28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder details = new StringBuilder(); 28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Resources res = context.getResources(); 28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message Type: Text message. 28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_type_label)); 28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.text_message)); 28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Address: *** 28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int smsType = cursor.getInt(MessageListAdapter.COLUMN_SMS_TYPE); 29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (Sms.isOutgoingFolder(smsType)) { 29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.to_address_label)); 29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.from_label)); 29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(cursor.getString(MessageListAdapter.COLUMN_SMS_ADDRESS)); 29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Date: *** 29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (smsType == Sms.MESSAGE_TYPE_DRAFT) { 30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.saved_label)); 30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (smsType == Sms.MESSAGE_TYPE_INBOX) { 30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.received_label)); 30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.sent_label)); 30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 30872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project long date = cursor.getLong(MessageListAdapter.COLUMN_SMS_DATE); 30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(MessageUtils.formatTimeStampString(context, date, true)); 31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return details.toString(); 31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static private String getPriorityDescription(Context context, int PriorityValue) { 31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Resources res = context.getResources(); 31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch(PriorityValue) { 31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.PRIORITY_HIGH: 31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return res.getString(R.string.priority_high); 31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.PRIORITY_LOW: 32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return res.getString(R.string.priority_low); 32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.PRIORITY_NORMAL: 32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project default: 32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return res.getString(R.string.priority_normal); 32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static int getAttachmentType(SlideshowModel model) { 32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (model == null) { 32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return AttachmentEditor.EMPTY; 33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int numberOfSlides = model.size(); 33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (numberOfSlides > 1) { 33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return AttachmentEditor.SLIDESHOW_ATTACHMENT; 33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (numberOfSlides == 1) { 33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Only one slide in the slide-show. 33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SlideModel slide = model.get(0); 33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasVideo()) { 33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return AttachmentEditor.VIDEO_ATTACHMENT; 34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasAudio() && slide.hasImage()) { 34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return AttachmentEditor.SLIDESHOW_ATTACHMENT; 34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasAudio()) { 34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return AttachmentEditor.AUDIO_ATTACHMENT; 34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasImage()) { 35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return AttachmentEditor.IMAGE_ATTACHMENT; 35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasText()) { 35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return AttachmentEditor.TEXT_ONLY; 35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return AttachmentEditor.EMPTY; 36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String formatTimeStampString(Context context, long when) { 36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return formatTimeStampString(context, when, false); 36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 36672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String formatTimeStampString(Context context, long when, boolean fullFormat) { 36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Time then = new Time(); 36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project then.set(when); 36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Time now = new Time(); 37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project now.setToNow(); 37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Basic settings for formatDateTime() we want for all cases. 37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int format_flags = DateUtils.FORMAT_NO_NOON_MIDNIGHT | 37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project DateUtils.FORMAT_ABBREV_ALL | 37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project DateUtils.FORMAT_CAP_AMPM; 37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // If the message is from a different year, show the date and year. 37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (then.year != now.year) { 37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project format_flags |= DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE; 38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (then.yearDay != now.yearDay) { 38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // If it is from a different day than today, show only the date. 38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project format_flags |= DateUtils.FORMAT_SHOW_DATE; 38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Otherwise, if the message is from today, show the time. 38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project format_flags |= DateUtils.FORMAT_SHOW_TIME; 38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return DateUtils.formatDateTime(context, when, format_flags); 38972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 39072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 39172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /** 39272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * @parameter recipientIds space-separated list of ids 39372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 39472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String getRecipientsByIds(Context context, String recipientIds, 39572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean allowQuery) { 39672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String value = sRecipientAddress.get(recipientIds); 39772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (value != null) { 39872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return value; 39972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 40072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!TextUtils.isEmpty(recipientIds)) { 40172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder addressBuf = extractIdsToAddresses( 40272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context, recipientIds, allowQuery); 40372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (addressBuf == null) { 40472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // temporary error? Don't memoize. 40572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return ""; 40672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 40772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project value = addressBuf.toString(); 40872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 40972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project value = ""; 41072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 41172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sRecipientAddress.put(recipientIds, value); 41272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return value; 41372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 41472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 41572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static StringBuilder extractIdsToAddresses(Context context, String recipients, 41672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean allowQuery) { 41772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder addressBuf = new StringBuilder(); 41872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String[] recipientIds = recipients.split(" "); 41972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean firstItem = true; 42072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (String recipientId : recipientIds) { 42172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String value = sRecipientAddress.get(recipientId); 42272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (value == null && allowQuery) { 42372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = Uri.parse("content://mms-sms/canonical-address/" + recipientId); 42472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor c = SqliteWrapper.query(context, context.getContentResolver(), 42572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project uri, null, null, null, null); 42672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c != null) { 42772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 42872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c.moveToFirst()) { 42972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project value = c.getString(0); 43072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 43172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 43272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.close(); 43372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 43472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 43572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 43672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (value == null) { 43772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project continue; 43872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 43972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sRecipientAddress.put(recipientId, value); 44072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (firstItem) { 44172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project firstItem = false; 44272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 44372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project addressBuf.append(";"); 44472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 44572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project addressBuf.append(value); 44672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 44772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 44872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return (addressBuf.length() == 0) ? null : addressBuf; 44972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 45072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 45172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String getAddressByThreadId(Context context, long threadId) { 45272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String[] projection = new String[] { Threads.RECIPIENT_IDS }; 45372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 45472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri.Builder builder = Threads.CONTENT_URI.buildUpon(); 45572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.appendQueryParameter("simple", "true"); 45672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(), 45772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.build(), projection, 45872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Threads._ID + "=" + threadId, null, null); 45972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 46072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (cursor != null) { 46172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 46272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if ((cursor.getCount() == 1) && cursor.moveToFirst()) { 46372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String address = getRecipientsByIds(context, 46472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project cursor.getString(0), true /* allow query */); 46572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!TextUtils.isEmpty(address)) { 46672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return address; 46772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 46872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 46972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 47072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project cursor.close(); 47172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 47272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 47372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 47472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 47572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 47672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void selectAudio(Context context, int requestCode) { 47772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (context instanceof Activity) { 47872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); 47972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false); 48072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); 48172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, 48272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context.getString(R.string.select_audio)); 48372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ((Activity) context).startActivityForResult(intent, requestCode); 48472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 48572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 48672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 48772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void recordSound(Context context, int requestCode) { 48872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (context instanceof Activity) { 48972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 49072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.setType(ContentType.AUDIO_AMR); 49172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.setClassName("com.android.soundrecorder", 49272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project "com.android.soundrecorder.SoundRecorder"); 49372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 49472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ((Activity) context).startActivityForResult(intent, requestCode); 49572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 49672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 49772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 49872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void selectVideo(Context context, int requestCode) { 49972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project selectMediaByType(context, requestCode, ContentType.VIDEO_UNSPECIFIED); 50072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 50172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 50272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void selectImage(Context context, int requestCode) { 50372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project selectMediaByType(context, requestCode, ContentType.IMAGE_UNSPECIFIED); 50472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 50572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 50672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static void selectMediaByType( 50772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Context context, int requestCode, String contentType) { 50872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (context instanceof Activity) { 50972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 51072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); 51172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 51272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project innerIntent.setType(contentType); 51372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 51472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent wrapperIntent = Intent.createChooser(innerIntent, null); 51572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 51672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ((Activity) context).startActivityForResult(wrapperIntent, requestCode); 51772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 51872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 51972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 52072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void viewSimpleSlideshow(Context context, SlideshowModel slideshow) { 52172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!slideshow.isSimple()) { 52272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project throw new IllegalArgumentException( 52372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project "viewSimpleSlideshow() called on a non-simple slideshow"); 52472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 52572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SlideModel slide = slideshow.get(0); 52672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MediaModel mm = null; 52772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasImage()) { 52872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mm = slide.getImage(); 52972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (slide.hasVideo()) { 53072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mm = slide.getVideo(); 53172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 53272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 53372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 53472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 53572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.setType(mm.getContentType()); 53672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.setData(mm.getUri()); 53772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context.startActivity(intent); 53872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 53972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 54072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void showErrorDialog(Context context, 54172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String title, String message) { 54272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project AlertDialog.Builder builder = new AlertDialog.Builder(context); 54372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 54472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setIcon(R.drawable.ic_sms_mms_not_delivered); 54572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setTitle(title); 54672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setMessage(message); 54772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setPositiveButton(android.R.string.ok, null); 54872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.show(); 54972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 55072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 55172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static Uri saveBitmapAsPart(Context context, Uri messageUri, Bitmap bitmap) 55272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project throws MmsException { 55372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ByteArrayOutputStream os = new ByteArrayOutputStream(); 55472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project bitmap.compress(CompressFormat.JPEG, 55572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsConfig.IMAGE_COMPRESSION_QUALITY, os); 55672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 55772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project PduPart part = new PduPart(); 55872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 55972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project part.setContentType("image/jpeg".getBytes()); 56072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String contentId = "Image" + System.currentTimeMillis(); 56172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project part.setContentLocation((contentId + ".jpg").getBytes()); 56272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project part.setContentId(contentId.getBytes()); 56372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project part.setData(os.toByteArray()); 56472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 56572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return PduPersister.getPduPersister(context).persistPart(part, 56672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ContentUris.parseId(messageUri)); 56772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 56872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 56972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void markAsRead(Context context, long threadId) { 57072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MessageUtils.handleReadReport(context, threadId, 57172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project PduHeaders.READ_STATUS_READ, null); 57272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 57372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ContentValues values = new ContentValues(1); 57472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project values.put("read", READ_THREAD); 57572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SqliteWrapper.update(context, context.getContentResolver(), 57672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ContentUris.withAppendedId(Threads.CONTENT_URI, threadId), 57772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project values, "read=0", null); 57872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 57972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MessagingNotification.updateNewMessageIndicator(context, threadId); 58072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 58172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 58272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void resizeImageAsync(final Context context, 58372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Uri imageUri, final Handler handler, 58472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final ResizeImageResultCallback cb) { 58572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 58672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Show a progress dialog if the resize hasn't finished 58772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // within one second. 58872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 58972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Make the progress dialog. 59072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final ProgressDialog progressDialog = new ProgressDialog(context); 59172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project progressDialog.setTitle(context.getText(R.string.image_too_large)); 59272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project progressDialog.setMessage(context.getText(R.string.compressing)); 59372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project progressDialog.setIndeterminate(true); 59472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project progressDialog.setCancelable(false); 59572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 59672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Stash the runnable for showing it away so we can cancel 59772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // it later if the resize completes ahead of the deadline. 59872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Runnable showProgress = new Runnable() { 59972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void run() { 60072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project progressDialog.show(); 60172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 60272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 60372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Schedule it for one second from now. 60472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project handler.postDelayed(showProgress, 1000); 60572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 60672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new Thread(new Runnable() { 60772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void run() { 60872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final PduPart part; 60972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 61072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project UriImage image = new UriImage(context, imageUri); 61172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project part = image.getResizedImageAsPart( 61272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project CarrierContentRestriction.IMAGE_WIDTH_LIMIT, 61372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project CarrierContentRestriction.IMAGE_HEIGHT_LIMIT); 61472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 61572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Cancel pending show of the progress dialog if necessary. 61672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project handler.removeCallbacks(showProgress); 61772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Dismiss the progress dialog if it's around. 61872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project progressDialog.dismiss(); 61972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 62072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 62172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project handler.post(new Runnable() { 62272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void run() { 62372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project cb.onResizeResult(part); 62472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 62572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }); 62672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 62772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }).start(); 62872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 62972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 63072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void showDiscardDraftConfirmDialog(Context context, 63172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnClickListener listener) { 63272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new AlertDialog.Builder(context) 63372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 63472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .setTitle(R.string.discard_message) 63572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .setMessage(R.string.discard_message_reason) 63672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .setPositiveButton(R.string.yes, listener) 63772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .setNegativeButton(R.string.no, null) 63872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .show(); 63972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 64072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 64172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String getLocalNumber() { 64272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (null == sLocalNumber) { 64372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sLocalNumber = TelephonyManager.getDefault().getLine1Number(); 64472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 64572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return sLocalNumber; 64672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 64772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 64872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static boolean isLocalNumber(String number) { 64972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return PhoneNumberUtils.compare(number, getLocalNumber()); 65072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 65172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 65272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void handleReadReport(final Context context, 65372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final long threadId, 65472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final int status, 65572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Runnable callback) { 65672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String selection = Mms.MESSAGE_TYPE + " = " + PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF 65772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project + " AND " + Mms.READ + " = 0" 65872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project + " AND " + Mms.READ_REPORT + " = " + PduHeaders.VALUE_YES; 65972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 66072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (threadId != -1) { 66172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project selection = selection + " AND " + Mms.THREAD_ID + " = " + threadId; 66272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 66372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 66472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Cursor c = SqliteWrapper.query(context, context.getContentResolver(), 66572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.Inbox.CONTENT_URI, new String[] {Mms._ID, Mms.MESSAGE_ID}, 66672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project selection, null, null); 66772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 66872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c == null) { 66972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return; 67072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 67172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 67272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Map<String, String> map = new HashMap<String, String>(); 67372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 67472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c.getCount() == 0) { 67572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (callback != null) { 67672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project callback.run(); 67772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 67872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return; 67972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 68072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 68172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project while (c.moveToNext()) { 68272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, c.getLong(0)); 68372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project map.put(c.getString(1), AddressUtils.getFrom(context, uri)); 68472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 68572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 68672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.close(); 68772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 68872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 68972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnClickListener positiveListener = new OnClickListener() { 69072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 69172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (final Map.Entry<String, String> entry : map.entrySet()) { 69272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsMessageSender.sendReadRec(context, entry.getValue(), 69372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project entry.getKey(), status); 69472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 69572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 69672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (callback != null) { 69772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project callback.run(); 69872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 69972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 70072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 70172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 70272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnClickListener negativeListener = new OnClickListener() { 70372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 70472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (callback != null) { 70572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project callback.run(); 70672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 70772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 70872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 70972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 71072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnCancelListener cancelListener = new OnCancelListener() { 71172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onCancel(DialogInterface dialog) { 71272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (callback != null) { 71372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project callback.run(); 71472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 71572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 71672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 71772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 71872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project confirmReadReportDialog(context, positiveListener, 71972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project negativeListener, 72072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project cancelListener); 72172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 72272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 72372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static void confirmReadReportDialog(Context context, 72472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnClickListener positiveListener, OnClickListener negativeListener, 72572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnCancelListener cancelListener) { 72672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project AlertDialog.Builder builder = new AlertDialog.Builder(context); 72772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setCancelable(true); 72872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setTitle(R.string.confirm); 72972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setMessage(R.string.message_send_read_report); 73072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setPositiveButton(R.string.yes, positiveListener); 73172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setNegativeButton(R.string.no, negativeListener); 73272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setOnCancelListener(cancelListener); 73372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.show(); 73472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 73572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 73672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String extractEncStrFromCursor(Cursor cursor, 73772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int columnRawBytes, int columnCharset) { 73872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String rawBytes = cursor.getString(columnRawBytes); 73972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int charset = cursor.getInt(columnCharset); 74072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 74172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (TextUtils.isEmpty(rawBytes)) { 74272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return ""; 74372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (charset == CharacterSets.ANY_CHARSET) { 74472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return rawBytes; 74572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 74672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return new EncodedStringValue(charset, PduPersister.getBytes(rawBytes)).getString(); 74772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 74872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 74972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 75072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String extractEncStr(Context context, EncodedStringValue value) { 75172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (value != null) { 75272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return value.getString(); 75372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 75472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return ""; 75572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 75672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 75772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 75872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static ArrayList<String> extractUris(URLSpan[] spans) { 75972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int size = spans.length; 76072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ArrayList<String> accumulator = new ArrayList<String>(); 76172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 76272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (int i = 0; i < size; i++) { 76372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project accumulator.add(spans[i].getURL()); 76472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 76572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return accumulator; 76672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 76772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 76872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 769