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.model;
1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.lang.ref.SoftReference;
21d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Arrays;
22d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.HashSet;
23d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Set;
24d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chen
25d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport org.w3c.dom.events.Event;
26d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport org.w3c.dom.smil.ElementTime;
27d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chen
28d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.content.Context;
29d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.graphics.Bitmap;
30d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.graphics.BitmapFactory;
31d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.net.Uri;
32d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.text.TextUtils;
33d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.util.Log;
34d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chen
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.ContentRestrictionException;
360d4645de339b4681d18198ba7451e7b8807116f9Tom Taylorimport com.android.mms.ExceedMessageSizeException;
379242286c35743422051d439d7460cd0a1426899cWei Huangimport com.android.mms.LogTag;
3851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.MmsApp;
3910eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylorimport com.android.mms.MmsConfig;
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.dom.smil.SmilMediaElementImpl;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.ui.UriImage;
4251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.ItemLoadedCallback;
4351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.ItemLoadedFuture;
4451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.ThumbnailManager;
45f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.MmsException;
46f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.PduPart;
47f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.PduPersister;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class ImageModel extends RegionMediaModel {
51ab845dee6565a8dfc384186bc8f2e801a2b087e1Ye Wen    private static final String TAG = LogTag.TAG;
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean DEBUG = false;
53150c4179995cc0a75f934ef194372f9295957ca2Joe Onorato    private static final boolean LOCAL_LOGV = false;
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5537880013315d8b7abefd9081b2c36b060083d6faTom Taylor    private static final int PICTURE_SIZE_LIMIT = 100 * 1024;
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
571009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev    /**
581009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev     * These are the image content types that MMS supports. Anything else needs to be transcoded
591009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev     * into one of these content types before being sent over MMS.
601009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev     */
611009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev    private static final Set<String> SUPPORTED_MMS_IMAGE_CONTENT_TYPES =
621009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev        new HashSet<String>(Arrays.asList(new String[] {
631009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev                "image/jpeg",
641009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev            }));
651009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private int mWidth;
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private int mHeight;
6837880013315d8b7abefd9081b2c36b060083d6faTom Taylor    private SoftReference<Bitmap> mFullSizeBitmapCache = new SoftReference<Bitmap>(null);
6951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    private ItemLoadedFuture mItemLoadedFuture;
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ImageModel(Context context, Uri uri, RegionModel region)
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            throws MmsException {
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super(context, SmilHelper.ELEMENT_TAG_IMAGE, uri, region);
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        initModelFromUri(uri);
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        checkContentRestriction();
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ImageModel(Context context, String contentType, String src,
790ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            Uri uri, RegionModel region) throws MmsException {
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super(context, SmilHelper.ELEMENT_TAG_IMAGE,
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                contentType, src, uri, region);
820ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        decodeImageBounds(uri);
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void initModelFromUri(Uri uri) throws MmsException {
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        UriImage uriImage = new UriImage(mContext, uri);
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContentType = uriImage.getContentType();
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (TextUtils.isEmpty(mContentType)) {
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            throw new MmsException("Type of media is unknown.");
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSrc = uriImage.getSrc();
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mWidth = uriImage.getWidth();
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mHeight = uriImage.getHeight();
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (LOCAL_LOGV) {
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.v(TAG, "New ImageModel created:"
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    + " mSrc=" + mSrc
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    + " mContentType=" + mContentType
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    + " mUri=" + uri);
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1040ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor    private void decodeImageBounds(Uri uri) {
1050ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        UriImage uriImage = new UriImage(mContext, uri);
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mWidth = uriImage.getWidth();
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mHeight = uriImage.getHeight();
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (LOCAL_LOGV) {
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.v(TAG, "Image bounds: " + mWidth + "x" + mHeight);
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // EventListener Interface
1151009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev    @Override
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void handleEvent(Event evt) {
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (evt.getType().equals(SmilMediaElementImpl.SMIL_MEDIA_START_EVENT)) {
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mVisible = true;
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (mFill != ElementTime.FILL_FREEZE) {
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mVisible = false;
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(false);
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getWidth() {
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mWidth;
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getHeight() {
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mHeight;
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void checkContentRestriction() throws ContentRestrictionException {
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        ContentRestriction cr = ContentRestrictionFactory.getContentRestriction();
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        cr.checkImageContentType(mContentType);
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
139721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor    public ItemLoadedFuture loadThumbnailBitmap(ItemLoadedCallback callback) {
14051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        ThumbnailManager thumbnailManager = MmsApp.getApplication().getThumbnailManager();
141721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor        mItemLoadedFuture = thumbnailManager.getThumbnail(getUri(), callback);
142721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor        return mItemLoadedFuture;
14351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    }
14451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor
14551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    public void cancelThumbnailLoading() {
1469c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor        if (mItemLoadedFuture != null && !mItemLoadedFuture.isDone()) {
14751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor            if (Log.isLoggable(LogTag.APP, Log.DEBUG)) {
14851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor                Log.v(TAG, "cancelThumbnailLoading for: " + this);
149bb689a98bd5dcc5e4b3f0d7e102decff346dc631Tom Taylor            }
1509c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor            mItemLoadedFuture.cancel(getUri());
15151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor            mItemLoadedFuture = null;
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1550ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor    private Bitmap createBitmap(int thumbnailBoundsLimit, Uri uri) {
1560ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        byte[] data = UriImage.getResizedImageData(mWidth, mHeight,
1570ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor                thumbnailBoundsLimit, thumbnailBoundsLimit, PICTURE_SIZE_LIMIT, uri, mContext);
1580ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        if (LOCAL_LOGV) {
1590ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            Log.v(TAG, "createBitmap size: " + (data == null ? data : data.length));
1600ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        }
1610ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        return data == null ? null : BitmapFactory.decodeByteArray(data, 0, data.length);
1620ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor    }
1630ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor
1640ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor    public Bitmap getBitmap(int width, int height)  {
16537880013315d8b7abefd9081b2c36b060083d6faTom Taylor        Bitmap bm = mFullSizeBitmapCache.get();
16637880013315d8b7abefd9081b2c36b060083d6faTom Taylor        if (bm == null) {
16737880013315d8b7abefd9081b2c36b060083d6faTom Taylor            try {
1680ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor                bm = createBitmap(Math.max(width, height), getUri());
16937880013315d8b7abefd9081b2c36b060083d6faTom Taylor                if (bm != null) {
17037880013315d8b7abefd9081b2c36b060083d6faTom Taylor                    mFullSizeBitmapCache = new SoftReference<Bitmap>(bm);
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
17237880013315d8b7abefd9081b2c36b060083d6faTom Taylor            } catch (OutOfMemoryError ex) {
17337880013315d8b7abefd9081b2c36b060083d6faTom Taylor                // fall through and return a null bitmap. The callers can handle a null
17437880013315d8b7abefd9081b2c36b060083d6faTom Taylor                // result and show R.drawable.ic_missing_thumbnail_picture
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17737880013315d8b7abefd9081b2c36b060083d6faTom Taylor        return bm;
17837880013315d8b7abefd9081b2c36b060083d6faTom Taylor    }
17937880013315d8b7abefd9081b2c36b060083d6faTom Taylor
18010eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    @Override
18110eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    public boolean getMediaResizable() {
18210eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        return true;
18310eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    }
18410eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor
18510eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    @Override
18610eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    protected void resizeMedia(int byteLimit, long messageId) throws MmsException {
18710eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        UriImage image = new UriImage(mContext, getUri());
1881009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev
1891009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev        int widthLimit = MmsConfig.getMaxImageWidth();
1901009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev        int heightLimit = MmsConfig.getMaxImageHeight();
19137260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        int size = getMediaSize();
1921009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev        // In mms_config.xml, the max width has always been declared larger than the max height.
1931009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev        // Swap the width and height limits if necessary so we scale the picture as little as
1941009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev        // possible.
1951009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev        if (image.getHeight() > image.getWidth()) {
1961009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev            int temp = widthLimit;
1971009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev            widthLimit = heightLimit;
1981009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev            heightLimit = temp;
1990d4645de339b4681d18198ba7451e7b8807116f9Tom Taylor        }
2001009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev
20137260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
20237260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor            Log.v(TAG, "resizeMedia size: " + size + " image.getWidth(): "
20337260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor                    + image.getWidth() + " widthLimit: " + widthLimit
20437260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor                    + " image.getHeight(): " + image.getHeight()
20537260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor                    + " heightLimit: " + heightLimit
20637260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor                    + " image.getContentType(): " + image.getContentType());
20737260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        }
20837260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor
20937260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        // Check if we're already within the limits - in which case we don't need to resize.
21037260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        // The size can be zero here, even when the media has content. See the comment in
21137260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        // MediaModel.initMediaSize. Sometimes it'll compute zero and it's costly to read the
21237260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        // whole stream to compute the size. When we call getResizedImageAsPart(), we'll correctly
21337260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        // set the size.
21437260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        if (size != 0 && size <= byteLimit &&
2151009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev                image.getWidth() <= widthLimit &&
2161009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev                image.getHeight() <= heightLimit &&
2171009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev                SUPPORTED_MMS_IMAGE_CONTENT_TYPES.contains(image.getContentType())) {
21837260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor            if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
21937260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor                Log.v(TAG, "resizeMedia - already sized");
22037260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor            }
2211009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev            return;
2221009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev        }
2231009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev
22410eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        PduPart part = image.getResizedImageAsPart(
2251009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev                widthLimit,
2261009d4bf5ee9fd1f2523e530828de5babb78eb19Todor Kalaydjiev                heightLimit,
22710eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor                byteLimit);
22810eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor
2293b13ad40393f44e16bc65c8df5abc76f1c6fc754Tom Taylor        if (part == null) {
2303b13ad40393f44e16bc65c8df5abc76f1c6fc754Tom Taylor            throw new ExceedMessageSizeException("Not enough memory to turn image into part: " +
2313b13ad40393f44e16bc65c8df5abc76f1c6fc754Tom Taylor                    getUri());
2323b13ad40393f44e16bc65c8df5abc76f1c6fc754Tom Taylor        }
233b02d890bd31dbf4c91390652a35282babec3b889Sang-Jun Park
234bbc5b8d0076b0cdae851bfec636a854ef77bd6ceTodor Kalaydjiev        // Update the content type because it may have changed due to resizing/recompressing
235bbc5b8d0076b0cdae851bfec636a854ef77bd6ceTodor Kalaydjiev        mContentType = new String(part.getContentType());
236bbc5b8d0076b0cdae851bfec636a854ef77bd6ceTodor Kalaydjiev
237b02d890bd31dbf4c91390652a35282babec3b889Sang-Jun Park        String src = getSrc();
238b02d890bd31dbf4c91390652a35282babec3b889Sang-Jun Park        byte[] srcBytes = src.getBytes();
239b02d890bd31dbf4c91390652a35282babec3b889Sang-Jun Park        part.setContentLocation(srcBytes);
240b02d890bd31dbf4c91390652a35282babec3b889Sang-Jun Park        int period = src.lastIndexOf(".");
241b02d890bd31dbf4c91390652a35282babec3b889Sang-Jun Park        byte[] contentId = period != -1 ? src.substring(0, period).getBytes() : srcBytes;
242b02d890bd31dbf4c91390652a35282babec3b889Sang-Jun Park        part.setContentId(contentId);
243b02d890bd31dbf4c91390652a35282babec3b889Sang-Jun Park
24410eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        PduPersister persister = PduPersister.getPduPersister(mContext);
24510eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        this.mSize = part.getData().length;
24637260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor
24737260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
24837260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor            Log.v(TAG, "resizeMedia mSize: " + mSize);
24937260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor        }
25037260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor
251469db72fcf219fd4c60bc9b01c728bdc3e866d40Tom Taylor        Uri newUri = persister.persistPart(part, messageId, null);
25210eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        setUri(newUri);
25310eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    }
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
255