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