13484638cad97e255a412b0489a63873fb3ca4218Sunny Goyalpackage com.android.launcher3;
23484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
33484638cad97e255a412b0489a63873fb3ca4218Sunny Goyalimport android.animation.ObjectAnimator;
495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyalimport android.content.res.Resources.Theme;
595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyalimport android.content.res.TypedArray;
63484638cad97e255a412b0489a63873fb3ca4218Sunny Goyalimport android.graphics.Canvas;
795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyalimport android.graphics.Color;
83484638cad97e255a412b0489a63873fb3ca4218Sunny Goyalimport android.graphics.ColorFilter;
93484638cad97e255a412b0489a63873fb3ca4218Sunny Goyalimport android.graphics.Paint;
103484638cad97e255a412b0489a63873fb3ca4218Sunny Goyalimport android.graphics.PixelFormat;
113484638cad97e255a412b0489a63873fb3ca4218Sunny Goyalimport android.graphics.Rect;
123484638cad97e255a412b0489a63873fb3ca4218Sunny Goyalimport android.graphics.RectF;
133484638cad97e255a412b0489a63873fb3ca4218Sunny Goyalimport android.graphics.drawable.Drawable;
143484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
153484638cad97e255a412b0489a63873fb3ca4218Sunny Goyalclass PreloadIconDrawable extends Drawable {
1695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
173484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    private static final float ANIMATION_PROGRESS_STOPPED = -1.0f;
183484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    private static final float ANIMATION_PROGRESS_STARTED = 0f;
193484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    private static final float ANIMATION_PROGRESS_COMPLETED = 1.0f;
203484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
2195abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private static final float MIN_SATUNATION = 0.2f;
2295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private static final float MIN_LIGHTNESS = 0.6f;
2395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
2495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private static final float ICON_SCALE_FACTOR = 0.5f;
2595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private static final int DEFAULT_COLOR = 0xFF009688;
263484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
2795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private static final Rect sTempRect = new Rect();
283484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
2995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private final RectF mIndicatorRect = new RectF();
3095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private boolean mIndicatorRectDirty;
313484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
3295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private final Paint mPaint;
333484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    final Drawable mIcon;
343484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
3595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private Drawable mBgDrawable;
3695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private int mRingOutset;
3795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
3895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private int mIndicatorColor = 0;
3995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
403484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    /**
413484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal     * Indicates the progress of the preloader [0-100]. If it goes above 100, only the icon
423484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal     * is shown with no progress bar.
433484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal     */
443484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    private int mProgress = 0;
453484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
463484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    private float mAnimationProgress = ANIMATION_PROGRESS_STOPPED;
473484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    private ObjectAnimator mAnimator;
483484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
4995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    public PreloadIconDrawable(Drawable icon, Theme theme) {
503484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        mIcon = icon;
513484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
5295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
5395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mPaint.setStyle(Paint.Style.STROKE);
5495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mPaint.setStrokeCap(Paint.Cap.ROUND);
5595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
563484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        setBounds(icon.getBounds());
5795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        applyTheme(theme);
5895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        onLevelChange(0);
5995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    }
603484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
6195abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    @Override
6295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    public void applyTheme(Theme t) {
6395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        TypedArray ta = t.obtainStyledAttributes(R.styleable.PreloadIconDrawable);
6495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mBgDrawable = ta.getDrawable(R.styleable.PreloadIconDrawable_background);
6595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mBgDrawable.setFilterBitmap(true);
6695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mPaint.setStrokeWidth(ta.getDimension(R.styleable.PreloadIconDrawable_indicatorSize, 0));
6795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mRingOutset = ta.getDimensionPixelSize(R.styleable.PreloadIconDrawable_ringOutset, 0);
6895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        ta.recycle();
6995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        onBoundsChange(getBounds());
7095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        invalidateSelf();
7195abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    }
7295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
7395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    @Override
7495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    protected void onBoundsChange(Rect bounds) {
7595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mIcon.setBounds(bounds);
7695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        if (mBgDrawable != null) {
7795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            sTempRect.set(bounds);
7895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            sTempRect.inset(-mRingOutset, -mRingOutset);
7995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            mBgDrawable.setBounds(sTempRect);
803484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        }
8195abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mIndicatorRectDirty = true;
8295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    }
8395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
8495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    public int getOutset() {
8595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        return mRingOutset;
8695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    }
8795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
8895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    /**
8995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal     * The size of the indicator is same as the content region of the {@link #mBgDrawable} minus
9095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal     * half the stroke size to accommodate the indicator.
9195abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal     */
9295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private void initIndicatorRect() {
9395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        Drawable d = mBgDrawable;
9495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        Rect bounds = d.getBounds();
9595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
9695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        d.getPadding(sTempRect);
9795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        // Amount by which padding has to be scaled
9895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        float paddingScaleX = ((float) bounds.width()) / d.getIntrinsicWidth();
9995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        float paddingScaleY = ((float) bounds.height()) / d.getIntrinsicHeight();
10095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mIndicatorRect.set(
10195abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal                bounds.left + sTempRect.left * paddingScaleX,
10295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal                bounds.top + sTempRect.top * paddingScaleY,
10395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal                bounds.right - sTempRect.right * paddingScaleX,
10495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal                bounds.bottom - sTempRect.bottom * paddingScaleY);
10595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
10695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        float inset = mPaint.getStrokeWidth() / 2;
10795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mIndicatorRect.inset(inset, inset);
10895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mIndicatorRectDirty = false;
1093484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    }
1103484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1113484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    @Override
1123484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    public void draw(Canvas canvas) {
11395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        final Rect r = new Rect(getBounds());
11495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        if (canvas.getClipBounds(sTempRect) && !Rect.intersects(sTempRect, r)) {
1153484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            // The draw region has been clipped.
1163484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            return;
1173484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        }
11895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        if (mIndicatorRectDirty) {
11995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            initIndicatorRect();
12095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        }
1213484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        final float iconScale;
1223484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1233484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        if ((mAnimationProgress >= ANIMATION_PROGRESS_STARTED)
1243484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal                && (mAnimationProgress < ANIMATION_PROGRESS_COMPLETED)) {
1253484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            mPaint.setAlpha((int) ((1 - mAnimationProgress) * 255));
12695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            mBgDrawable.setAlpha(mPaint.getAlpha());
12795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            mBgDrawable.draw(canvas);
12895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            canvas.drawOval(mIndicatorRect, mPaint);
1293484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
13095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            iconScale = ICON_SCALE_FACTOR + (1 - ICON_SCALE_FACTOR) * mAnimationProgress;
1313484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        } else if (mAnimationProgress == ANIMATION_PROGRESS_STOPPED) {
1323484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            mPaint.setAlpha(255);
1333484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            iconScale = ICON_SCALE_FACTOR;
13495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            mBgDrawable.setAlpha(255);
13595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            mBgDrawable.draw(canvas);
1363484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1373484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            if (mProgress >= 100) {
13895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal                canvas.drawOval(mIndicatorRect, mPaint);
1393484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            } else if (mProgress > 0) {
14095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal                canvas.drawArc(mIndicatorRect, -90, mProgress * 3.6f, false, mPaint);
1413484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            }
1423484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        } else {
1433484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            iconScale = 1;
1443484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        }
1453484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1463484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        canvas.save();
1473484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        canvas.scale(iconScale, iconScale, r.exactCenterX(), r.exactCenterY());
1483484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        mIcon.draw(canvas);
1493484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        canvas.restore();
1503484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    }
1513484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1523484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    @Override
1533484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    public int getOpacity() {
1543484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        return PixelFormat.TRANSLUCENT;
1553484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    }
1563484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1573484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    @Override
1583484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    public void setAlpha(int alpha) {
1593484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        mIcon.setAlpha(alpha);
1603484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    }
1613484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1623484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    @Override
1633484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    public void setColorFilter(ColorFilter cf) {
1643484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        mIcon.setColorFilter(cf);
1653484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    }
1663484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1673484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    @Override
1683484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    protected boolean onLevelChange(int level) {
1693484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        mProgress = level;
1703484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1713484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        // Stop Animation
1723484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        if (mAnimator != null) {
1733484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            mAnimator.cancel();
1743484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            mAnimator = null;
1753484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        }
1763484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        mAnimationProgress = ANIMATION_PROGRESS_STOPPED;
17795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        if (level > 0) {
17895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            // Set the paint color only when the level changes, so that the dominant color
17995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            // is only calculated when needed.
18095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            mPaint.setColor(getIndicatorColor());
18195abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        }
18295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        if (mIcon instanceof FastBitmapDrawable) {
18395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            ((FastBitmapDrawable) mIcon).setGhostModeEnabled(level <= 0);
18495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        }
1853484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1863484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        invalidateSelf();
1873484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        return true;
1883484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    }
1893484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
1903484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    /**
1913484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal     * Runs the finish animation if it is has not been run after last level change.
1923484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal     */
193349426234e8c5a0e5bcf2c8d94dbb9844b5f724aSunny Goyal    public void maybePerformFinishedAnimation() {
1943484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        if (mAnimationProgress > ANIMATION_PROGRESS_STOPPED) {
195349426234e8c5a0e5bcf2c8d94dbb9844b5f724aSunny Goyal            return;
1963484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        }
1973484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        if (mAnimator != null) {
1983484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            mAnimator.cancel();
1993484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        }
2003484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        setAnimationProgress(ANIMATION_PROGRESS_STARTED);
2013484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        mAnimator = ObjectAnimator.ofFloat(this, "animationProgress",
2023484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal                ANIMATION_PROGRESS_STARTED, ANIMATION_PROGRESS_COMPLETED);
2033484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        mAnimator.start();
2043484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    }
2053484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
2063484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    public void setAnimationProgress(float progress) {
2073484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        if (progress != mAnimationProgress) {
2083484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            mAnimationProgress = progress;
2093484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal            invalidateSelf();
2103484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        }
2113484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    }
2123484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal
2133484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    public float getAnimationProgress() {
2143484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal        return mAnimationProgress;
2153484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal    }
21695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
21795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    @Override
21895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    public int getIntrinsicHeight() {
21995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        return mIcon.getIntrinsicHeight();
22095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    }
22195abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
22295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    @Override
22395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    public int getIntrinsicWidth() {
22495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        return mIcon.getIntrinsicWidth();
22595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    }
22695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
22795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    private int getIndicatorColor() {
22895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        if (mIndicatorColor != 0) {
22995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            return mIndicatorColor;
23095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        }
23195abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        if (!(mIcon instanceof FastBitmapDrawable)) {
23295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            mIndicatorColor = DEFAULT_COLOR;
23395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            return mIndicatorColor;
23495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        }
23595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mIndicatorColor = Utilities.findDominantColorByHue(
23695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal                ((FastBitmapDrawable) mIcon).getBitmap(), 20);
23795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal
23895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        // Make sure that the dominant color has enough saturation to be visible properly.
23995abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        float[] hsv = new float[3];
24095abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        Color.colorToHSV(mIndicatorColor, hsv);
24195abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        if (hsv[1] < MIN_SATUNATION) {
24295abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            mIndicatorColor = DEFAULT_COLOR;
24395abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal            return mIndicatorColor;
24495abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        }
24595abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        hsv[2] = Math.max(MIN_LIGHTNESS, hsv[2]);
24695abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        mIndicatorColor = Color.HSVToColor(hsv);
24795abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal        return mIndicatorColor;
24895abbb330ce9bbaf23594245f0f8a795c8118038Sunny Goyal    }
2493484638cad97e255a412b0489a63873fb3ca4218Sunny Goyal}
250