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