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