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