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