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