MessageUtils.java revision 161375d2c4eff31add607fc0befa5c781c6fd7f1
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 2086a1cf79bf92dbb2b9d09431379bff6de83c2581Tom Taylorimport com.android.mms.MmsConfig; 2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R; 22812391ad832f3fdac054ad3a50af563da16e99b5Wei Huangimport com.android.mms.LogTag; 23b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrickimport com.android.mms.data.WorkingMessage; 2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.MediaModel; 2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideModel; 2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideshowModel; 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; 35b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrickimport com.google.android.mms.pdu.PduBody; 3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.PduHeaders; 3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.PduPart; 3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.PduPersister; 3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.RetrieveConf; 4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.SendReq; 4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.util.SqliteWrapper; 4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.Activity; 4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.AlertDialog; 4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentUris; 4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context; 4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface; 4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent; 4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface.OnCancelListener; 5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface.OnClickListener; 5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.res.Resources; 5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor; 5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.Bitmap; 5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.Bitmap.CompressFormat; 5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.media.RingtoneManager; 5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri; 5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Handler; 5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.provider.Telephony.Mms; 5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.provider.Telephony.Sms; 6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.PhoneNumberUtils; 6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.TelephonyManager; 6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.TextUtils; 6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.format.DateUtils; 6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.format.Time; 6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.URLSpan; 6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log; 671224b6560c48e146ee304f9c807296f6c22cdefbTom Taylorimport android.widget.Toast; 6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.io.ByteArrayOutputStream; 709242286c35743422051d439d7460cd0a1426899cWei Huangimport java.io.IOException; 7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.ArrayList; 7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.HashMap; 7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.Map; 7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.concurrent.ConcurrentHashMap; 7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/** 7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * An utility class for managing messages. 7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class MessageUtils { 8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project interface ResizeImageResultCallback { 81edd39351defc331fc268a6ed88338f64fe6f17cfTom Taylor void onResizeResult(PduPart part, boolean append); 8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 849242286c35743422051d439d7460cd0a1426899cWei Huang private static final String TAG = LogTag.TAG; 8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String sLocalNumber; 8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Cache of both groups of space-separated ids to their full 8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // comma-separated display names, as well as individual ids to 8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // display names. 9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO: is it possible for canonical address ID keys to be 9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // re-used? SQLite does reuse IDs on NULL id_ insert, but does 9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // anything ever delete from the mmssms.db canonical_addresses 9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // table? Nothing that I could find. 9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final Map<String, String> sRecipientAddress = 9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new ConcurrentHashMap<String, String>(20 /* initial capacity */); 9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private MessageUtils() { 9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Forbidden being instantiated. 9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String getMessageDetails(Context context, Cursor cursor, int size) { 10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (cursor == null) { 10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if ("mms".equals(cursor.getString(MessageListAdapter.COLUMN_MSG_TYPE))) { 10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int type = cursor.getInt(MessageListAdapter.COLUMN_MMS_MESSAGE_TYPE); 10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch (type) { 10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND: 11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getNotificationIndDetails(context, cursor); 11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF: 11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.MESSAGE_TYPE_SEND_REQ: 11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getMultimediaMessageDetails(context, cursor, size); 11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project default: 11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w(TAG, "No details could be retrieved."); 11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return ""; 11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getTextMessageDetails(context, cursor); 12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String getNotificationIndDetails(Context context, Cursor cursor) { 12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder details = new StringBuilder(); 12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Resources res = context.getResources(); 12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project long id = cursor.getLong(MessageListAdapter.COLUMN_ID); 12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, id); 12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project NotificationInd nInd; 13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project nInd = (NotificationInd) PduPersister.getPduPersister( 13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context).load(uri); 13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (MmsException e) { 13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.e(TAG, "Failed to load the message: " + uri, e); 13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return context.getResources().getString(R.string.cannot_get_details); 13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message Type: Mms Notification. 14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_type_label)); 14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.multimedia_notification)); 14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // From: *** 14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String from = extractEncStr(context, nInd.getFrom()); 14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.from_label)); 14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(!TextUtils.isEmpty(from)? from: 14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project res.getString(R.string.hidden_sender_address)); 14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Date: *** 15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString( 15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project R.string.expire_on, 15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MessageUtils.formatTimeStampString( 15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context, nInd.getExpiry() * 1000L, true))); 15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Subject: *** 15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.subject_label)); 16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project EncodedStringValue subject = nInd.getSubject(); 16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (subject != null) { 16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(subject.getString()); 16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message class: Personal/Advertisement/Infomational/Auto 16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_class_label)); 16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(new String(nInd.getMessageClass())); 17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message size: *** KB 17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_size_label)); 17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(String.valueOf((nInd.getMessageSize() + 1023) / 1024)); 17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(context.getString(R.string.kilobyte)); 17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return details.toString(); 17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String getMultimediaMessageDetails( 18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Context context, Cursor cursor, int size) { 18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int type = cursor.getInt(MessageListAdapter.COLUMN_MMS_MESSAGE_TYPE); 18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (type == PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND) { 18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getNotificationIndDetails(context, cursor); 18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder details = new StringBuilder(); 18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Resources res = context.getResources(); 18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project long id = cursor.getLong(MessageListAdapter.COLUMN_ID); 19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, id); 19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MultimediaMessagePdu msg; 19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project msg = (MultimediaMessagePdu) PduPersister.getPduPersister( 19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context).load(uri); 19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (MmsException e) { 19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.e(TAG, "Failed to load the message: " + uri, e); 19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return context.getResources().getString(R.string.cannot_get_details); 20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message Type: Text message. 20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_type_label)); 20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.multimedia_message)); 20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msg instanceof RetrieveConf) { 20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // From: *** 20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String from = extractEncStr(context, ((RetrieveConf) msg).getFrom()); 20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.from_label)); 21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(!TextUtils.isEmpty(from)? from: 21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project res.getString(R.string.hidden_sender_address)); 21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // To: *** 21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.to_address_label)); 21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project EncodedStringValue[] to = msg.getTo(); 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (to != null) { 22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(EncodedStringValue.concat(to)); 22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project else { 22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w(TAG, "recipient list is empty!"); 22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 2259c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor 22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Bcc: *** 22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msg instanceof SendReq) { 22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project EncodedStringValue[] values = ((SendReq) msg).getBcc(); 23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if ((values != null) && (values.length > 0)) { 23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.bcc_label)); 23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(EncodedStringValue.concat(values)); 23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Date: *** 23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int msgBox = cursor.getInt(MessageListAdapter.COLUMN_MMS_MESSAGE_BOX); 24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msgBox == Mms.MESSAGE_BOX_DRAFTS) { 24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.saved_label)); 24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (msgBox == Mms.MESSAGE_BOX_INBOX) { 24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.received_label)); 24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.sent_label)); 24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(MessageUtils.formatTimeStampString( 24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context, msg.getDate() * 1000L, true)); 25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Subject: *** 25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.subject_label)); 25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project EncodedStringValue subject = msg.getSubject(); 25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (subject != null) { 25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String subStr = subject.getString(); 25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message size should include size of subject. 25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project size += subStr.length(); 26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(subStr); 26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Priority: High/Normal/Low 26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.priority_label)); 26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(getPriorityDescription(context, msg.getPriority())); 26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message size: *** KB 26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_size_label)); 27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append((size - 1)/1000 + 1); 27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(" KB"); 27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return details.toString(); 27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String getTextMessageDetails(Context context, Cursor cursor) { 27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder details = new StringBuilder(); 27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Resources res = context.getResources(); 28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Message Type: Text message. 28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.message_type_label)); 28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.text_message)); 28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Address: *** 28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int smsType = cursor.getInt(MessageListAdapter.COLUMN_SMS_TYPE); 28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (Sms.isOutgoingFolder(smsType)) { 28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.to_address_label)); 29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.from_label)); 29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(cursor.getString(MessageListAdapter.COLUMN_SMS_ADDRESS)); 29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Date: *** 29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append('\n'); 29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (smsType == Sms.MESSAGE_TYPE_DRAFT) { 29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.saved_label)); 29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (smsType == Sms.MESSAGE_TYPE_INBOX) { 30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.received_label)); 30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(res.getString(R.string.sent_label)); 30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project long date = cursor.getLong(MessageListAdapter.COLUMN_SMS_DATE); 30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project details.append(MessageUtils.formatTimeStampString(context, date, true)); 30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 308161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor // Error code: *** 309161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor int errorCode = cursor.getInt(MessageListAdapter.COLUMN_SMS_ERROR_CODE); 310161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor if (errorCode != 0) { 311161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor details.append('\n') 312161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor .append(res.getString(R.string.error_code_label)) 313161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor .append(errorCode); 314161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor } 315161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor 31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return details.toString(); 31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static private String getPriorityDescription(Context context, int PriorityValue) { 32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Resources res = context.getResources(); 32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch(PriorityValue) { 32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.PRIORITY_HIGH: 32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return res.getString(R.string.priority_high); 32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.PRIORITY_LOW: 32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return res.getString(R.string.priority_low); 32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.PRIORITY_NORMAL: 32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project default: 32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return res.getString(R.string.priority_normal); 32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static int getAttachmentType(SlideshowModel model) { 33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (model == null) { 334b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick return WorkingMessage.TEXT; 33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int numberOfSlides = model.size(); 33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (numberOfSlides > 1) { 339b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick return WorkingMessage.SLIDESHOW; 34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (numberOfSlides == 1) { 34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Only one slide in the slide-show. 34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SlideModel slide = model.get(0); 34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasVideo()) { 344b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick return WorkingMessage.VIDEO; 34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasAudio() && slide.hasImage()) { 348b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick return WorkingMessage.SLIDESHOW; 34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasAudio()) { 352b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick return WorkingMessage.AUDIO; 35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasImage()) { 356b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick return WorkingMessage.IMAGE; 35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasText()) { 360b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick return WorkingMessage.TEXT; 36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 364b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick return WorkingMessage.TEXT; 36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 3669c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor 36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String formatTimeStampString(Context context, long when) { 36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return formatTimeStampString(context, when, false); 36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String formatTimeStampString(Context context, long when, boolean fullFormat) { 37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Time then = new Time(); 37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project then.set(when); 37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Time now = new Time(); 37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project now.setToNow(); 37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Basic settings for formatDateTime() we want for all cases. 37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int format_flags = DateUtils.FORMAT_NO_NOON_MIDNIGHT | 37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project DateUtils.FORMAT_ABBREV_ALL | 38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project DateUtils.FORMAT_CAP_AMPM; 381836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project 38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // If the message is from a different year, show the date and year. 38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (then.year != now.year) { 38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project format_flags |= DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE; 38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (then.yearDay != now.yearDay) { 38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // If it is from a different day than today, show only the date. 38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project format_flags |= DateUtils.FORMAT_SHOW_DATE; 38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 38972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Otherwise, if the message is from today, show the time. 39072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project format_flags |= DateUtils.FORMAT_SHOW_TIME; 39172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 39272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 393836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project // If the caller has asked for full details, make sure to show the date 394836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project // and time no matter what we've determined above (but still make showing 395836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project // the year only happen if it is a different year from today). 396836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project if (fullFormat) { 397836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project format_flags |= (DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME); 398836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project } 399836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project 40072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return DateUtils.formatDateTime(context, when, format_flags); 40172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 40272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 40372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /** 40472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * @parameter recipientIds space-separated list of ids 40572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 40672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String getRecipientsByIds(Context context, String recipientIds, 40772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean allowQuery) { 40872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String value = sRecipientAddress.get(recipientIds); 40972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (value != null) { 41072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return value; 41172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 41272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!TextUtils.isEmpty(recipientIds)) { 41372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder addressBuf = extractIdsToAddresses( 41472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context, recipientIds, allowQuery); 41572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (addressBuf == null) { 41672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // temporary error? Don't memoize. 41772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return ""; 41872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 41972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project value = addressBuf.toString(); 42072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 42172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project value = ""; 42272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 42372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sRecipientAddress.put(recipientIds, value); 42472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return value; 42572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 42672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 42772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static StringBuilder extractIdsToAddresses(Context context, String recipients, 42872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean allowQuery) { 42972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder addressBuf = new StringBuilder(); 43072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String[] recipientIds = recipients.split(" "); 43172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean firstItem = true; 43272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (String recipientId : recipientIds) { 43372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String value = sRecipientAddress.get(recipientId); 4342f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project 4352f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project if (value == null) { 4362f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project if (!allowQuery) { 4372f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project // when allowQuery is false, if any value from sRecipientAddress.get() is null, 4382f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project // return null for the whole thing. We don't want to stick partial result 4392f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project // into sRecipientAddress for multiple recipient ids. 4402f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project return null; 4412f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project } 4422f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project 44372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = Uri.parse("content://mms-sms/canonical-address/" + recipientId); 44472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor c = SqliteWrapper.query(context, context.getContentResolver(), 44572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project uri, null, null, null, null); 44672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c != null) { 44772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 44872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c.moveToFirst()) { 44972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project value = c.getString(0); 4509c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor sRecipientAddress.put(recipientId, value); 45172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 45272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 45372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.close(); 45472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 45572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 45672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 45772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (value == null) { 45872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project continue; 45972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 46072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (firstItem) { 46172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project firstItem = false; 46272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 46372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project addressBuf.append(";"); 46472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 46572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project addressBuf.append(value); 46672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 46772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 46872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return (addressBuf.length() == 0) ? null : addressBuf; 46972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 47072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 47172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void selectAudio(Context context, int requestCode) { 47272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (context instanceof Activity) { 47372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); 47472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false); 47572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); 4765c0aff95e0c161d22fad145fe344430fd3474bc1Dave Sparks intent.putExtra(RingtoneManager.EXTRA_RINGTONE_INCLUDE_DRM, false); 4779c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, 47872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context.getString(R.string.select_audio)); 47972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ((Activity) context).startActivityForResult(intent, requestCode); 48072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 48172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 48272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 48372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void recordSound(Context context, int requestCode) { 48472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (context instanceof Activity) { 48572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 48672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.setType(ContentType.AUDIO_AMR); 48772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.setClassName("com.android.soundrecorder", 48872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project "com.android.soundrecorder.SoundRecorder"); 48972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 49072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ((Activity) context).startActivityForResult(intent, requestCode); 49172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 49272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 49372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 49472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void selectVideo(Context context, int requestCode) { 49572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project selectMediaByType(context, requestCode, ContentType.VIDEO_UNSPECIFIED); 49672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 49772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 49872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void selectImage(Context context, int requestCode) { 49972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project selectMediaByType(context, requestCode, ContentType.IMAGE_UNSPECIFIED); 50072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 50172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 50272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static void selectMediaByType( 50372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Context context, int requestCode, String contentType) { 50472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (context instanceof Activity) { 50572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 50672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); 50772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 50872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project innerIntent.setType(contentType); 50972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 51072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent wrapperIntent = Intent.createChooser(innerIntent, null); 51172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 51272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ((Activity) context).startActivityForResult(wrapperIntent, requestCode); 51372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 51472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 51572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 51672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void viewSimpleSlideshow(Context context, SlideshowModel slideshow) { 51772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!slideshow.isSimple()) { 51872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project throw new IllegalArgumentException( 51972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project "viewSimpleSlideshow() called on a non-simple slideshow"); 52072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 52172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SlideModel slide = slideshow.get(0); 52272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MediaModel mm = null; 52372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (slide.hasImage()) { 52472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mm = slide.getImage(); 52572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (slide.hasVideo()) { 52672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mm = slide.getVideo(); 52772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 5289c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor 52972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 53072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 5319c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor 5329c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor String contentType; 5339c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor if (mm.isDrmProtected()) { 5349c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor contentType = mm.getDrmObject().getContentType(); 5359c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor } else { 5369c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor contentType = mm.getContentType(); 5379c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor } 5389c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor intent.setDataAndType(mm.getUri(), contentType); 53972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context.startActivity(intent); 54072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 5419c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor 54272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void showErrorDialog(Context context, 54372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String title, String message) { 54472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project AlertDialog.Builder builder = new AlertDialog.Builder(context); 54572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 54672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setIcon(R.drawable.ic_sms_mms_not_delivered); 54772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setTitle(title); 54872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setMessage(message); 54972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setPositiveButton(android.R.string.ok, null); 55072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.show(); 55172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 55272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 553bd09a4b8c2d1f922f1459c4d7b61e7e87ed4ddf3The Android Open Source Project /** 554bd09a4b8c2d1f922f1459c4d7b61e7e87ed4ddf3The Android Open Source Project * The quality parameter which is used to compress JPEG images. 555bd09a4b8c2d1f922f1459c4d7b61e7e87ed4ddf3The Android Open Source Project */ 556bd09a4b8c2d1f922f1459c4d7b61e7e87ed4ddf3The Android Open Source Project public static final int IMAGE_COMPRESSION_QUALITY = 80; 5579242286c35743422051d439d7460cd0a1426899cWei Huang /** 5589242286c35743422051d439d7460cd0a1426899cWei Huang * The minimum quality parameter which is used to compress JPEG images. 5599242286c35743422051d439d7460cd0a1426899cWei Huang */ 5609242286c35743422051d439d7460cd0a1426899cWei Huang public static final int MINIMUM_IMAGE_COMPRESSION_QUALITY = 50; 561bd09a4b8c2d1f922f1459c4d7b61e7e87ed4ddf3The Android Open Source Project 56272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static Uri saveBitmapAsPart(Context context, Uri messageUri, Bitmap bitmap) 56372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project throws MmsException { 564812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang 56572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ByteArrayOutputStream os = new ByteArrayOutputStream(); 566bd09a4b8c2d1f922f1459c4d7b61e7e87ed4ddf3The Android Open Source Project bitmap.compress(CompressFormat.JPEG, IMAGE_COMPRESSION_QUALITY, os); 56772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 56872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project PduPart part = new PduPart(); 56972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 57072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project part.setContentType("image/jpeg".getBytes()); 57172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String contentId = "Image" + System.currentTimeMillis(); 57272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project part.setContentLocation((contentId + ".jpg").getBytes()); 57372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project part.setContentId(contentId.getBytes()); 57472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project part.setData(os.toByteArray()); 57572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 576812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang Uri retVal = PduPersister.getPduPersister(context).persistPart(part, 57772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ContentUris.parseId(messageUri)); 578812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang 579812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { 580812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang log("saveBitmapAsPart: persisted part with uri=" + retVal); 581812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang } 582812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang 583812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang return retVal; 58472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 58572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 586f79b803adc0cee3778cf6aac52d203896cde5d95Christian Gustafsson /** 587f79b803adc0cee3778cf6aac52d203896cde5d95Christian Gustafsson * Message overhead that reduces the maximum image byte size. 588f79b803adc0cee3778cf6aac52d203896cde5d95Christian Gustafsson * 5000 is a realistic overhead number that allows for user to also include 589f79b803adc0cee3778cf6aac52d203896cde5d95Christian Gustafsson * a small MIDI file or a couple pages of text along with the picture. 590f79b803adc0cee3778cf6aac52d203896cde5d95Christian Gustafsson */ 591f79b803adc0cee3778cf6aac52d203896cde5d95Christian Gustafsson public static final int MESSAGE_OVERHEAD = 5000; 592f79b803adc0cee3778cf6aac52d203896cde5d95Christian Gustafsson 59372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void resizeImageAsync(final Context context, 59472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Uri imageUri, final Handler handler, 595edd39351defc331fc268a6ed88338f64fe6f17cfTom Taylor final ResizeImageResultCallback cb, 596edd39351defc331fc268a6ed88338f64fe6f17cfTom Taylor final boolean append) { 59772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 5981224b6560c48e146ee304f9c807296f6c22cdefbTom Taylor // Show a progress toast if the resize hasn't finished 59972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // within one second. 60072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Stash the runnable for showing it away so we can cancel 60172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // it later if the resize completes ahead of the deadline. 60272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Runnable showProgress = new Runnable() { 60372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void run() { 6041224b6560c48e146ee304f9c807296f6c22cdefbTom Taylor Toast.makeText(context, R.string.compressing, Toast.LENGTH_SHORT).show(); 60572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 60672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 60772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Schedule it for one second from now. 60872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project handler.postDelayed(showProgress, 1000); 6099c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor 61072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new Thread(new Runnable() { 61172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void run() { 61272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final PduPart part; 61372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 61472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project UriImage image = new UriImage(context, imageUri); 61572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project part = image.getResizedImageAsPart( 61686a1cf79bf92dbb2b9d09431379bff6de83c2581Tom Taylor MmsConfig.getMaxImageWidth(), 617f79b803adc0cee3778cf6aac52d203896cde5d95Christian Gustafsson MmsConfig.getMaxImageHeight(), 618f79b803adc0cee3778cf6aac52d203896cde5d95Christian Gustafsson MmsConfig.getMaxMessageSize() - MESSAGE_OVERHEAD); 61972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 6201224b6560c48e146ee304f9c807296f6c22cdefbTom Taylor // Cancel pending show of the progress toast if necessary. 62172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project handler.removeCallbacks(showProgress); 62272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 62372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 62472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project handler.post(new Runnable() { 62572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void run() { 626edd39351defc331fc268a6ed88338f64fe6f17cfTom Taylor cb.onResizeResult(part, append); 62772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 62872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }); 62972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 63072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }).start(); 63172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 63272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 63372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void showDiscardDraftConfirmDialog(Context context, 63472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnClickListener listener) { 63572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new AlertDialog.Builder(context) 63672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 63772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .setTitle(R.string.discard_message) 63872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .setMessage(R.string.discard_message_reason) 63972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .setPositiveButton(R.string.yes, listener) 64072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .setNegativeButton(R.string.no, null) 64172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .show(); 64272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 64372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 64413dbe96fc54f9b7190fd415d737f9a56dc409d10Wei Huang public static String getLocalNumber() { 64572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (null == sLocalNumber) { 64672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sLocalNumber = TelephonyManager.getDefault().getLine1Number(); 64772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 64872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return sLocalNumber; 64972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 65072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 65172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static boolean isLocalNumber(String number) { 652f1bf432304bcc277397b028192eaf01a94c6417dWei Huang if (number == null) { 653f1bf432304bcc277397b028192eaf01a94c6417dWei Huang return false; 654f1bf432304bcc277397b028192eaf01a94c6417dWei Huang } 655f1bf432304bcc277397b028192eaf01a94c6417dWei Huang 656f1bf432304bcc277397b028192eaf01a94c6417dWei Huang // we don't use Mms.isEmailAddress() because it is too strict for comparing addresses like 657f1bf432304bcc277397b028192eaf01a94c6417dWei Huang // "foo+caf_=6505551212=tmomail.net@gmail.com", which is the 'from' address from a forwarded email 658f1bf432304bcc277397b028192eaf01a94c6417dWei Huang // message from Gmail. We don't want to treat "foo+caf_=6505551212=tmomail.net@gmail.com" and 659f1bf432304bcc277397b028192eaf01a94c6417dWei Huang // "6505551212" to be the same. 660f1bf432304bcc277397b028192eaf01a94c6417dWei Huang if (number.indexOf('@') >= 0) { 661b6a0383dc77efea9a48e43e4e21a4290e89bf0a4Wei Huang return false; 662b6a0383dc77efea9a48e43e4e21a4290e89bf0a4Wei Huang } 663b6a0383dc77efea9a48e43e4e21a4290e89bf0a4Wei Huang 66472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return PhoneNumberUtils.compare(number, getLocalNumber()); 66572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 66672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 66772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void handleReadReport(final Context context, 66872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final long threadId, 66972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final int status, 67072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Runnable callback) { 67172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String selection = Mms.MESSAGE_TYPE + " = " + PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF 67272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project + " AND " + Mms.READ + " = 0" 67372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project + " AND " + Mms.READ_REPORT + " = " + PduHeaders.VALUE_YES; 67472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 67572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (threadId != -1) { 67672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project selection = selection + " AND " + Mms.THREAD_ID + " = " + threadId; 67772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 67872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 67972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Cursor c = SqliteWrapper.query(context, context.getContentResolver(), 68072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.Inbox.CONTENT_URI, new String[] {Mms._ID, Mms.MESSAGE_ID}, 68172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project selection, null, null); 68272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 68372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c == null) { 68472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return; 68572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 68672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 68772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Map<String, String> map = new HashMap<String, String>(); 68872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 68972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (c.getCount() == 0) { 69072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (callback != null) { 69172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project callback.run(); 69272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 69372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return; 69472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 69572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 69672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project while (c.moveToNext()) { 69772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, c.getLong(0)); 69872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project map.put(c.getString(1), AddressUtils.getFrom(context, uri)); 69972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 70072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 70172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project c.close(); 70272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 70372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 70472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnClickListener positiveListener = new OnClickListener() { 70572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 70672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (final Map.Entry<String, String> entry : map.entrySet()) { 70772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsMessageSender.sendReadRec(context, entry.getValue(), 70872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project entry.getKey(), status); 70972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 71072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 71172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (callback != null) { 71272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project callback.run(); 71372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 71472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 71572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 71672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 71772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnClickListener negativeListener = new OnClickListener() { 71872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 71972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (callback != null) { 72072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project callback.run(); 72172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 72272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 72372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 72472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 72572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnCancelListener cancelListener = new OnCancelListener() { 72672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onCancel(DialogInterface dialog) { 72772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (callback != null) { 72872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project callback.run(); 72972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 73072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 73172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 73272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 73372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project confirmReadReportDialog(context, positiveListener, 73472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project negativeListener, 73572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project cancelListener); 73672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 73772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 73872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static void confirmReadReportDialog(Context context, 73972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnClickListener positiveListener, OnClickListener negativeListener, 74072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project OnCancelListener cancelListener) { 74172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project AlertDialog.Builder builder = new AlertDialog.Builder(context); 74272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setCancelable(true); 74372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setTitle(R.string.confirm); 74472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setMessage(R.string.message_send_read_report); 74572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setPositiveButton(R.string.yes, positiveListener); 74672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setNegativeButton(R.string.no, negativeListener); 74772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.setOnCancelListener(cancelListener); 74872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project builder.show(); 74972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 75072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 75172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static String extractEncStrFromCursor(Cursor cursor, 75272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int columnRawBytes, int columnCharset) { 75372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String rawBytes = cursor.getString(columnRawBytes); 75472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int charset = cursor.getInt(columnCharset); 75572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 75672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (TextUtils.isEmpty(rawBytes)) { 75772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return ""; 75872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (charset == CharacterSets.ANY_CHARSET) { 75972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return rawBytes; 76072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 76172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return new EncodedStringValue(charset, PduPersister.getBytes(rawBytes)).getString(); 76272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 76372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 76472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 76572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String extractEncStr(Context context, EncodedStringValue value) { 76672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (value != null) { 76772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return value.getString(); 76872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 76972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return ""; 77072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 77172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 7729c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor 77372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static ArrayList<String> extractUris(URLSpan[] spans) { 77472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int size = spans.length; 77572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ArrayList<String> accumulator = new ArrayList<String>(); 77672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 77772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (int i = 0; i < size; i++) { 77872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project accumulator.add(spans[i].getURL()); 77972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 78072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return accumulator; 78172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 78272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7834522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen /** 7844522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen * Play/view the message attachments. 7854522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen * TOOD: We need to save the draft before launching another activity to view the attachments. 7864522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen * This is hacky though since we will do saveDraft twice and slow down the UI. 7874522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen * We should pass the slideshow in intent extra to the view activity instead of 7884522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen * asking it to read attachments from database. 7894522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen * @param context 7904522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen * @param msgUri the MMS message URI in database 7914522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen * @param slideshow the slideshow to save 7924522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen * @param persister the PDU persister for updating the database 7934522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen * @param sendReq the SendReq for updating the database 7944522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen */ 7954522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen public static void viewMmsMessageAttachment(Context context, Uri msgUri, 796b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick SlideshowModel slideshow) { 7974522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen boolean isSimple = (slideshow == null) ? false : slideshow.isSimple(); 7984522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen if (isSimple) { 7994522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen // In attachment-editor mode, we only ever have one slide. 8004522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen MessageUtils.viewSimpleSlideshow(context, slideshow); 8014522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen } else { 802b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick // If a slideshow was provided, save it to disk first. 803b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick if (slideshow != null) { 804b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick PduPersister persister = PduPersister.getPduPersister(context); 805b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick try { 806b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick PduBody pb = slideshow.toPduBody(); 807b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick persister.updateParts(msgUri, pb); 808b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick slideshow.sync(pb); 809b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick } catch (MmsException e) { 810b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick Log.e(TAG, "Unable to save message for preview"); 811b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick return; 812b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick } 8134522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen } 8144522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen // Launch the slideshow activity to play/view. 8154522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen Intent intent = new Intent(context, SlideshowActivity.class); 8164522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen intent.setData(msgUri); 8174522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen context.startActivity(intent); 8184522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen } 8194522cafe21816d43626b8ac42e1c5d3667212a97Ye Wen } 8209c5e0566f91c7622a7cf9d53a6a84c56ed4139c1Tom Taylor 821b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick public static void viewMmsMessageAttachment(Context context, WorkingMessage msg) { 822b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick SlideshowModel slideshow = msg.getSlideshow(); 823b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick if (slideshow == null) { 824b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick throw new IllegalStateException("msg.getSlideshow() == null"); 825b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick } 826b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick if (slideshow.isSimple()) { 827b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick MessageUtils.viewSimpleSlideshow(context, slideshow); 828b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick } else { 82916f98e62c279550854e665e25c212ea0b04a6b6bTom Taylor Uri uri = msg.saveAsMms(false); 830b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick viewMmsMessageAttachment(context, uri, slideshow); 831b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick } 832b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick } 833812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang 8349242286c35743422051d439d7460cd0a1426899cWei Huang /** 8359242286c35743422051d439d7460cd0a1426899cWei Huang * Debugging 8369242286c35743422051d439d7460cd0a1426899cWei Huang */ 8379242286c35743422051d439d7460cd0a1426899cWei Huang public static void writeHprofDataToFile(){ 8389242286c35743422051d439d7460cd0a1426899cWei Huang String filename = "/sdcard/mms_oom_hprof_data"; 8399242286c35743422051d439d7460cd0a1426899cWei Huang try { 8409242286c35743422051d439d7460cd0a1426899cWei Huang android.os.Debug.dumpHprofData(filename); 8419242286c35743422051d439d7460cd0a1426899cWei Huang Log.i(TAG, "##### written hprof data to " + filename); 8429242286c35743422051d439d7460cd0a1426899cWei Huang } catch (IOException ex) { 8439242286c35743422051d439d7460cd0a1426899cWei Huang Log.e(TAG, "writeHprofDataToFile: caught " + ex); 8449242286c35743422051d439d7460cd0a1426899cWei Huang } 8459242286c35743422051d439d7460cd0a1426899cWei Huang } 8469242286c35743422051d439d7460cd0a1426899cWei Huang 847817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom public static boolean isAlias(String string) { 848f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang if (!MmsConfig.isAliasEnabled()) { 849f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang return false; 850f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang } 851f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang 852f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang if (TextUtils.isEmpty(string)) { 853f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang return false; 854f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang } 855f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang 856f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang if (Mms.isPhoneNumber(string)) { 857f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang return false; 858f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang } 859f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang 860f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang if (!isAlphaNumeric(string)) { 861f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang return false; 862f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang } 863f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang 864f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang int len = string.length(); 865f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang 866f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang if (len < MmsConfig.getAliasMinChars() || len > MmsConfig.getAliasMaxChars()) { 867f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang return false; 868f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang } 869f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang 870f6ddd0bb7fff9f479f6c306d3d3e154c6c533061Wei Huang return true; 871817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom } 872817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom 873817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom public static boolean isAlphaNumeric(String s) { 874817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom char[] chars = s.toCharArray(); 875817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom for (int x = 0; x < chars.length; x++) { 876817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom char c = chars[x]; 877817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom if ((c >= 'a') && (c <= 'z')) continue; 878817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom if ((c >= 'A') && (c <= 'Z')) continue; 879817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom if ((c >= '0') && (c <= '9')) continue; 880817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom return false; 881817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom } 882817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom return true; 883817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom } 884817eb982a66303a8f87fc3061e3493a232627e96Satish Roddom 885812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang private static void log(String msg) { 886812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang Log.d(TAG, "[MsgUtils] " + msg); 887812391ad832f3fdac054ad3a50af563da16e99b5Wei Huang } 88872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 889