179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangpackage com.android.mail.bitmap;
279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.content.res.Resources;
479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.graphics.Canvas;
579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.graphics.Paint;
679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.graphics.Paint.Align;
779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.graphics.Rect;
879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.graphics.drawable.Drawable;
979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
1079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport com.android.bitmap.BitmapCache;
11b41b91112df8b4bf5adee6f0360dc7848f95fe26Mark Weiimport com.android.bitmap.DecodeAggregator;
1279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport com.android.mail.R;
1379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport com.android.mail.browse.ConversationItemViewCoordinates;
1479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
1579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
1679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang/**
1779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang * A 2x1 grid of attachment drawables. Supports showing a small "+N" badge in the corner.
1879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang */
1979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangpublic class AttachmentGridDrawable extends CompositeDrawable<AttachmentDrawable>
2079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        implements Parallaxable {
2179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
2279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public static final int MAX_VISIBLE_ATTACHMENT_COUNT = 2;
2379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
2479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private BitmapCache mCache;
25b41b91112df8b4bf5adee6f0360dc7848f95fe26Mark Wei    private DecodeAggregator mDecodeAggregator;
2679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private String mOverflowText;
2779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private ConversationItemViewCoordinates mCoordinates;
2879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private float mParallaxFraction = 0.5f;
2979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
3079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private final Resources mResources;
3179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private final Drawable mPlaceholder;
3279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private final Drawable mProgress;
3379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private final int mOverflowTextColor;
3479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private final int mOverflowBadgeColor;
3579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private final Paint mPaint = new Paint();
3679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private final Rect mRect = new Rect();
3779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
3879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public AttachmentGridDrawable(Resources res, Drawable placeholder, Drawable progress) {
3979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        super(MAX_VISIBLE_ATTACHMENT_COUNT);
4079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mResources = res;
4179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mPlaceholder = placeholder;
4279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mProgress = progress;
4379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mOverflowTextColor = res.getColor(R.color.ap_overflow_text_color);
4479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mOverflowBadgeColor = res.getColor(R.color.ap_overflow_badge_color);
4579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
4679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mPaint.setAntiAlias(true);
4779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
4879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
4979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    @Override
5079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    protected AttachmentDrawable createDivisionDrawable() {
5165b6d180f50922a3393795203cae68a5a2f6a33dMark Wei        final AttachmentDrawable result = new AttachmentDrawable(mResources, mCache,
5265b6d180f50922a3393795203cae68a5a2f6a33dMark Wei                mDecodeAggregator, mCoordinates, mPlaceholder, mProgress);
5379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        return result;
5479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
5579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
5679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public void setBitmapCache(BitmapCache cache) {
5779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mCache = cache;
5879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
5979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
60b41b91112df8b4bf5adee6f0360dc7848f95fe26Mark Wei    public void setDecodeAggregator(final DecodeAggregator decodeAggregator) {
6165b6d180f50922a3393795203cae68a5a2f6a33dMark Wei        this.mDecodeAggregator = decodeAggregator;
6265b6d180f50922a3393795203cae68a5a2f6a33dMark Wei    }
6365b6d180f50922a3393795203cae68a5a2f6a33dMark Wei
6479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public void setOverflowText(String text) {
6579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mOverflowText = text;
6679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        layoutOverflowBadge();
6779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
6879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
6979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public void setCoordinates(ConversationItemViewCoordinates coordinates) {
7079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mCoordinates = coordinates;
7179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        layoutOverflowBadge();
7279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
7379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
7479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private void layoutOverflowBadge() {
7579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        if (mCoordinates == null || mOverflowText == null) {
7679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            return;
7779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        }
7879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mPaint.setTextSize(mCoordinates.overflowFontSize);
7979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mPaint.setTypeface(mCoordinates.overflowTypeface);
8079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mPaint.setTextAlign(Align.CENTER);
8179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mPaint.getTextBounds(mOverflowText, 0, mOverflowText.length(), mRect);
8279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
8379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
8479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    @Override
8579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public void draw(Canvas canvas) {
8679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        for (int i = 0; i < mCount; i++) {
8779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            mDrawables.get(i).setParallaxFraction(mParallaxFraction);
8879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        }
8979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
9079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        super.draw(canvas);
9179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
9279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        // Overflow badge and count
9379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        if (mOverflowText != null && mCoordinates != null) {
9479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            final float radius = mCoordinates.overflowDiameter / 2f;
9579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            // transform item-level coordinates into local drawable coordinate space
9679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            final float x = mCoordinates.overflowXEnd - mCoordinates.attachmentPreviewsX - radius;
9779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            final float y = mCoordinates.overflowYEnd - mCoordinates.attachmentPreviewsY - radius;
9879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
9979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            mPaint.setColor(mOverflowBadgeColor);
10079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            canvas.drawCircle(x, y, radius, mPaint);
10179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
10279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            mPaint.setColor(mOverflowTextColor);
10379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            canvas.drawText(mOverflowText, x, y + (mRect.height() / 2f), mPaint);
10479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        }
10579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
10679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
10779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    @Override
10879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public void setParallaxFraction(float fraction) {
10979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mParallaxFraction = fraction;
11079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
11179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
11279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang}
113