18f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein/* 28f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * Copyright (C) 2012 Google Inc. 38f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * Licensed to The Android Open Source Project. 48f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * 58f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License"); 68f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * you may not use this file except in compliance with the License. 78f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * You may obtain a copy of the License at 88f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * 98f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * http://www.apache.org/licenses/LICENSE-2.0 108f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * 118f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * Unless required by applicable law or agreed to in writing, software 128f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS, 138f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 148f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * See the License for the specific language governing permissions and 158f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * limitations under the License. 168f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein */ 178f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein 18237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sappersteinpackage com.android.mail.ui; 19237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 202ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sappersteinimport android.content.ContentResolver; 21237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sappersteinimport android.content.Context; 22237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sappersteinimport android.graphics.Bitmap; 2362066e47fe69c33b60ed970e46809ba81d044064Mark Weiimport android.os.Parcel; 2462066e47fe69c33b60ed970e46809ba81d044064Mark Weiimport android.os.Parcelable; 25afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sappersteinimport android.text.TextUtils; 26237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sappersteinimport android.util.AttributeSet; 27e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Weiimport android.util.DisplayMetrics; 28237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sappersteinimport android.view.View; 29237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sappersteinimport android.widget.ImageView; 304f347e811052f446c3958c76db278bcd7b39a44fAndy Huangimport android.widget.ImageView.ScaleType; 31237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sappersteinimport android.widget.RelativeLayout; 32afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sappersteinimport android.widget.TextView; 33237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 345c721d9e6df069b6385929817bb2b61faeba25a3Andrew Sappersteinimport com.android.ex.photo.util.ImageUtils; 35237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sappersteinimport com.android.mail.R; 36237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sappersteinimport com.android.mail.providers.Attachment; 37afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sappersteinimport com.android.mail.utils.AttachmentUtils; 384f347e811052f446c3958c76db278bcd7b39a44fAndy Huangimport com.android.mail.utils.LogTag; 39237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sappersteinimport com.android.mail.utils.LogUtils; 40237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 41237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein/** 4262066e47fe69c33b60ed970e46809ba81d044064Mark Wei * Base class for attachment tiles that handles the work of fetching and displaying the bitmaps for 4362066e47fe69c33b60ed970e46809ba81d044064Mark Wei * the tiles. 44237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein */ 454f347e811052f446c3958c76db278bcd7b39a44fAndy Huangpublic abstract class AttachmentTile extends RelativeLayout implements AttachmentBitmapHolder { 46237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein protected Attachment mAttachment; 47237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein private ImageView mIcon; 48484e4e3483852fe1b313bb55cc43fe0c259664e0mindyp private ImageView mDefaultIcon; 49afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein private TextView mTitle; 50afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein private TextView mSubtitle; 51afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein private String mAttachmentSizeText; 52afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein private String mDisplayType; 534cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein private boolean mDefaultThumbnailSet; 5462066e47fe69c33b60ed970e46809ba81d044064Mark Wei private AttachmentPreviewCache mAttachmentPreviewCache; 55237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 56b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrook private static final String LOG_TAG = LogTag.getLogTag(); 57e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // previews with width/height or height/width less than this value will be 58e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // considered skinny 59e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei private static final float skinnyThresholdRatio = 0.5f; 60e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei 61db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein private boolean mAlwaysShowInfoText; 62db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein 63237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 64237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein /** 6562066e47fe69c33b60ed970e46809ba81d044064Mark Wei * Returns true if the attachment should be rendered as a tile. with a large image preview. 66237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein * @param attachment the attachment to render 67237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein * @return true if the attachment should be rendered as a tile 68237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein */ 69237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein public static boolean isTiledAttachment(final Attachment attachment) { 708750066b10f80e2a8080016973b3296d76d18266Mark Wei return ImageUtils.isImageMimeType(attachment.getContentType()); 71237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein } 72237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 73237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein public AttachmentTile(Context context) { 74237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein this(context, null); 75237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein } 76237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 77237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein public AttachmentTile(Context context, AttributeSet attrs) { 78237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein super(context, attrs); 794cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein mDefaultThumbnailSet = true; 80db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein mAlwaysShowInfoText = false; 81237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein } 82237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 83237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein @Override 84237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein protected void onFinishInflate() { 85237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein super.onFinishInflate(); 86237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 87afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein mTitle = (TextView) findViewById(R.id.attachment_tile_title); 88afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein mSubtitle = (TextView) findViewById(R.id.attachment_tile_subtitle); 89237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein mIcon = (ImageView) findViewById(R.id.attachment_tile_image); 90484e4e3483852fe1b313bb55cc43fe0c259664e0mindyp mDefaultIcon = (ImageView) findViewById(R.id.attachment_default_image); 91237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein } 92237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 931dc25e45b43aaab2ed869381de1b1276cf72b08fAndrew Sapperstein @Override 941dc25e45b43aaab2ed869381de1b1276cf72b08fAndrew Sapperstein protected void onLayout(boolean changed, int l, int t, int r, int b) { 951dc25e45b43aaab2ed869381de1b1276cf72b08fAndrew Sapperstein super.onLayout(changed, l, t, r, b); 961dc25e45b43aaab2ed869381de1b1276cf72b08fAndrew Sapperstein 972e607aebf60ae43413d244548a7e41edf681e4a7Jin Cao ThumbnailLoadTask.setupThumbnailPreview(mAttachmentPreviewCache, this, mAttachment, null); 981dc25e45b43aaab2ed869381de1b1276cf72b08fAndrew Sapperstein } 991dc25e45b43aaab2ed869381de1b1276cf72b08fAndrew Sapperstein 1004f347e811052f446c3958c76db278bcd7b39a44fAndy Huang public Attachment getAttachment() { 1014f347e811052f446c3958c76db278bcd7b39a44fAndy Huang return mAttachment; 1024f347e811052f446c3958c76db278bcd7b39a44fAndy Huang } 1034f347e811052f446c3958c76db278bcd7b39a44fAndy Huang 104237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein /** 105237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein * Render or update an attachment's view. This happens immediately upon instantiation, and 106237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein * repeatedly as status updates stream in, so only properties with new or changed values will 107237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein * cause sub-views to update. 108237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein */ 1094f347e811052f446c3958c76db278bcd7b39a44fAndy Huang protected void render(Attachment attachment, AttachmentPreviewCache attachmentPreviewCache) { 110237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein if (attachment == null) { 111237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein setVisibility(View.INVISIBLE); 112237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein return; 113237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein } 114237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 115237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein final Attachment prevAttachment = mAttachment; 116237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein mAttachment = attachment; 11762066e47fe69c33b60ed970e46809ba81d044064Mark Wei mAttachmentPreviewCache = attachmentPreviewCache; 118237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 119237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein LogUtils.d(LOG_TAG, "got attachment list row: name=%s state/dest=%d/%d dled=%d" + 120519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon " contentUri=%s MIME=%s flags=%d", attachment.getName(), attachment.state, 121237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein attachment.destination, attachment.downloadedSize, attachment.contentUri, 122519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon attachment.getContentType(), attachment.flags); 123237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 124519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon if ((attachment.flags & Attachment.FLAG_DUMMY_ATTACHMENT) != 0) { 125519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon // TODO: This is not an ideal string, but it's too late in KLP to add new strings. 126519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon mTitle.setText(R.string.load_more); 127519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon } else if (prevAttachment == null 128381c6b390dfbfdf7040dcc2193438c70c6f66b9fMark Wei || !TextUtils.equals(attachment.getName(), prevAttachment.getName())) { 1298750066b10f80e2a8080016973b3296d76d18266Mark Wei mTitle.setText(attachment.getName()); 130afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein } 131afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein 132afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein if (prevAttachment == null || attachment.size != prevAttachment.size) { 133afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein mAttachmentSizeText = AttachmentUtils.convertToHumanReadableSize(getContext(), 134afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein attachment.size); 135afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein mDisplayType = AttachmentUtils.getDisplayType(getContext(), attachment); 136afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein updateSubtitleText(); 137afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein } 138afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein 1392e607aebf60ae43413d244548a7e41edf681e4a7Jin Cao ThumbnailLoadTask.setupThumbnailPreview(mAttachmentPreviewCache, this, attachment, 1402e607aebf60ae43413d244548a7e41edf681e4a7Jin Cao prevAttachment); 141237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein } 142237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 143afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein private void updateSubtitleText() { 144afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein // TODO: make this a formatted resource when we have a UX design. 145afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein // not worth translation right now. 146afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein StringBuilder sb = new StringBuilder(); 147afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein sb.append(mAttachmentSizeText); 148519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon if (mDisplayType != null) { 149519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon sb.append(' '); 150519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon sb.append(mDisplayType); 151519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon } 152afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein mSubtitle.setText(sb.toString()); 153afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein } 154afff6d79b4ea2713ef75bfdad8abd7e21ee20080Andrew Sapperstein 15562066e47fe69c33b60ed970e46809ba81d044064Mark Wei @Override 1562ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein public void setThumbnailToDefault() { 1572e607aebf60ae43413d244548a7e41edf681e4a7Jin Cao final Bitmap cachedPreview = mAttachmentPreviewCache.get(mAttachment); 15862066e47fe69c33b60ed970e46809ba81d044064Mark Wei if (cachedPreview != null) { 15962066e47fe69c33b60ed970e46809ba81d044064Mark Wei setThumbnail(cachedPreview); 16062066e47fe69c33b60ed970e46809ba81d044064Mark Wei return; 16162066e47fe69c33b60ed970e46809ba81d044064Mark Wei } 162484e4e3483852fe1b313bb55cc43fe0c259664e0mindyp mDefaultIcon.setVisibility(View.VISIBLE); 1636c9771c0966a9aded0706c363233bbd3efaa5a9cAndrew Sapperstein mTitle.setVisibility(View.VISIBLE); 1646c9771c0966a9aded0706c363233bbd3efaa5a9cAndrew Sapperstein mSubtitle.setVisibility(View.VISIBLE); 1654cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein mDefaultThumbnailSet = true; 166237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein } 167237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 16862066e47fe69c33b60ed970e46809ba81d044064Mark Wei @Override 1692ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein public void setThumbnail(Bitmap result) { 170e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei if (result == null) { 171e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei return; 172e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei } 173e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei 174484e4e3483852fe1b313bb55cc43fe0c259664e0mindyp // We got a real thumbnail; hide the default thumbnail. 175484e4e3483852fe1b313bb55cc43fe0c259664e0mindyp mDefaultIcon.setVisibility(View.GONE); 176db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein if (!mAlwaysShowInfoText) { 177db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein mTitle.setVisibility(View.GONE); 178db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein mSubtitle.setVisibility(View.GONE); 179db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein } 180e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei 181e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei final int maxSize = getResources().getInteger(R.integer.attachment_preview_max_size); 182e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei final int width = result.getWidth(); 183e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei final int height = result.getHeight(); 184e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei final int scaledWidth = width * getResources().getDisplayMetrics().densityDpi 185e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei / DisplayMetrics.DENSITY_DEFAULT; 186e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei final int scaledHeight = height * getResources().getDisplayMetrics().densityDpi 187e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei / DisplayMetrics.DENSITY_DEFAULT; 188e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // ratio of the image 189e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei final float ratio = Math.min((float) width / height, (float) height / width); 190e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei 191e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei final boolean large = width >= maxSize || scaledWidth >= mIcon.getWidth() 192e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei || height >= maxSize || scaledHeight >= mIcon.getHeight(); 193e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei final boolean skinny = 194e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // the image is loooong 195e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei ratio < skinnyThresholdRatio && 196e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // AND if the image was centered and cropped, the resulting 197e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // image would still be loooong 198e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei !(scaledWidth >= mIcon.getHeight() * skinnyThresholdRatio 199e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei && scaledHeight >= mIcon.getWidth() * skinnyThresholdRatio); 200e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei LogUtils.d(LOG_TAG, "scaledWidth: %d, scaledHeight: %d, large: %b, skinny: %b", scaledWidth, 201e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei scaledHeight, large, skinny); 202e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei 203e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei if (large) { 204e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // preview fills up at least 1 dimension 205e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei if (skinny) { 206e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // just center. The shorter dimension stays the same while the 207e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // longer dimension is cropped 208e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei mIcon.setScaleType(ScaleType.CENTER); 209e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei } else { 210e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // fill. Both dimensions are scaled to fill the box, the longer 211e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // dimension is cropped 212e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei mIcon.setScaleType(ScaleType.CENTER_CROP); 213e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei } 21449d9fbc062289cdcf5ce3c57cc41927c8213c40aMark Wei } else { 215e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei // preview is small. just center 216e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei mIcon.setScaleType(ScaleType.CENTER); 21749d9fbc062289cdcf5ce3c57cc41927c8213c40aMark Wei } 218e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei 219e16b4dddf6a310e0e70908fdffd7bad45d97a99cMark Wei mIcon.setImageBitmap(result); 22062066e47fe69c33b60ed970e46809ba81d044064Mark Wei mAttachmentPreviewCache.set(mAttachment, result); 2214cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein mDefaultThumbnailSet = false; 2222ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein } 223237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 22462066e47fe69c33b60ed970e46809ba81d044064Mark Wei @Override 2252ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein public int getThumbnailWidth() { 2262ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein return mIcon.getWidth(); 2272ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein } 228237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 22962066e47fe69c33b60ed970e46809ba81d044064Mark Wei @Override 2302ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein public int getThumbnailHeight() { 2312ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein return mIcon.getHeight(); 2322ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein } 233237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein 2342ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein @Override 2352ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein public ContentResolver getResolver() { 2362ea06183aa826b28fe6ebdb454da49ba3878bc4fAndrew Sapperstein return getContext().getContentResolver(); 237237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein } 2384cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein 2394cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein @Override 2404cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein public boolean bitmapSetToDefault() { 2414cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein return mDefaultThumbnailSet; 2424cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein } 24362066e47fe69c33b60ed970e46809ba81d044064Mark Wei 24462066e47fe69c33b60ed970e46809ba81d044064Mark Wei public static final class AttachmentPreview implements Parcelable { 24562066e47fe69c33b60ed970e46809ba81d044064Mark Wei public String attachmentIdentifier; 24662066e47fe69c33b60ed970e46809ba81d044064Mark Wei public Bitmap preview; 24762066e47fe69c33b60ed970e46809ba81d044064Mark Wei 24862066e47fe69c33b60ed970e46809ba81d044064Mark Wei @Override 24962066e47fe69c33b60ed970e46809ba81d044064Mark Wei public int describeContents() { 25062066e47fe69c33b60ed970e46809ba81d044064Mark Wei return 0; 25162066e47fe69c33b60ed970e46809ba81d044064Mark Wei } 25262066e47fe69c33b60ed970e46809ba81d044064Mark Wei 25362066e47fe69c33b60ed970e46809ba81d044064Mark Wei @Override 25462066e47fe69c33b60ed970e46809ba81d044064Mark Wei public void writeToParcel(Parcel dest, int flags) { 25562066e47fe69c33b60ed970e46809ba81d044064Mark Wei dest.writeString(attachmentIdentifier); 25662066e47fe69c33b60ed970e46809ba81d044064Mark Wei dest.writeParcelable(preview, 0); 25762066e47fe69c33b60ed970e46809ba81d044064Mark Wei } 25862066e47fe69c33b60ed970e46809ba81d044064Mark Wei 25962066e47fe69c33b60ed970e46809ba81d044064Mark Wei public static final Parcelable.Creator<AttachmentPreview> CREATOR 26062066e47fe69c33b60ed970e46809ba81d044064Mark Wei = new Parcelable.Creator<AttachmentPreview>() { 26162066e47fe69c33b60ed970e46809ba81d044064Mark Wei @Override 26262066e47fe69c33b60ed970e46809ba81d044064Mark Wei public AttachmentPreview createFromParcel(Parcel in) { 26362066e47fe69c33b60ed970e46809ba81d044064Mark Wei return new AttachmentPreview(in); 26462066e47fe69c33b60ed970e46809ba81d044064Mark Wei } 26562066e47fe69c33b60ed970e46809ba81d044064Mark Wei 26662066e47fe69c33b60ed970e46809ba81d044064Mark Wei @Override 26762066e47fe69c33b60ed970e46809ba81d044064Mark Wei public AttachmentPreview[] newArray(int size) { 26862066e47fe69c33b60ed970e46809ba81d044064Mark Wei return new AttachmentPreview[size]; 26962066e47fe69c33b60ed970e46809ba81d044064Mark Wei } 27062066e47fe69c33b60ed970e46809ba81d044064Mark Wei }; 27162066e47fe69c33b60ed970e46809ba81d044064Mark Wei 27262066e47fe69c33b60ed970e46809ba81d044064Mark Wei private AttachmentPreview(Parcel in) { 27362066e47fe69c33b60ed970e46809ba81d044064Mark Wei attachmentIdentifier = in.readString(); 27462066e47fe69c33b60ed970e46809ba81d044064Mark Wei preview = in.readParcelable(null); 27562066e47fe69c33b60ed970e46809ba81d044064Mark Wei } 27662066e47fe69c33b60ed970e46809ba81d044064Mark Wei 27762066e47fe69c33b60ed970e46809ba81d044064Mark Wei public AttachmentPreview(Attachment attachment, Bitmap preview) { 27869c4ddb7a49f11377143c9ff1c7b85b2450449e9Mark Wei this.attachmentIdentifier = attachment.getIdentifierUri().toString(); 27962066e47fe69c33b60ed970e46809ba81d044064Mark Wei this.preview = preview; 28062066e47fe69c33b60ed970e46809ba81d044064Mark Wei } 28162066e47fe69c33b60ed970e46809ba81d044064Mark Wei } 28262066e47fe69c33b60ed970e46809ba81d044064Mark Wei 28362066e47fe69c33b60ed970e46809ba81d044064Mark Wei public interface AttachmentPreviewCache { 28462066e47fe69c33b60ed970e46809ba81d044064Mark Wei void set(Attachment attachment, Bitmap preview); 28562066e47fe69c33b60ed970e46809ba81d044064Mark Wei Bitmap get(Attachment attachment); 28662066e47fe69c33b60ed970e46809ba81d044064Mark Wei } 2871aee17e324f204080baaabceb64f4edf73681542Mark Wei 2881aee17e324f204080baaabceb64f4edf73681542Mark Wei @Override 2891aee17e324f204080baaabceb64f4edf73681542Mark Wei public void thumbnailLoadFailed() { 2901aee17e324f204080baaabceb64f4edf73681542Mark Wei setThumbnailToDefault(); 2911aee17e324f204080baaabceb64f4edf73681542Mark Wei } 292db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein 293db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein protected void setAlwaysShowInfoText(boolean alwaysShowInfoText) { 294db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein mAlwaysShowInfoText = alwaysShowInfoText; 295db65689be3ada3965c12312ad60b2a5d6917a98eAndrew Sapperstein } 296237129ddf57a1e25469d8990322fb7913e18ae20Andrew Sapperstein} 297