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