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