1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.systemui.bubbles; 17 18 import android.content.Context; 19 import android.content.res.TypedArray; 20 import android.graphics.Canvas; 21 import android.graphics.Point; 22 import android.graphics.Rect; 23 import android.util.AttributeSet; 24 import android.widget.ImageView; 25 26 import com.android.internal.graphics.ColorUtils; 27 import com.android.systemui.R; 28 29 /** 30 * View that circle crops its contents and supports displaying a coloured dot on a top corner. 31 */ 32 public class BadgedImageView extends ImageView { 33 34 private BadgeRenderer mDotRenderer; 35 private int mIconSize; 36 private Rect mTempBounds = new Rect(); 37 private Point mTempPoint = new Point(); 38 39 private float mDotScale = 0f; 40 private int mUpdateDotColor; 41 private boolean mShowUpdateDot; 42 private boolean mOnLeft; 43 BadgedImageView(Context context)44 public BadgedImageView(Context context) { 45 this(context, null); 46 } 47 BadgedImageView(Context context, AttributeSet attrs)48 public BadgedImageView(Context context, AttributeSet attrs) { 49 this(context, attrs, 0); 50 } 51 BadgedImageView(Context context, AttributeSet attrs, int defStyleAttr)52 public BadgedImageView(Context context, AttributeSet attrs, int defStyleAttr) { 53 this(context, attrs, defStyleAttr, 0); 54 } 55 BadgedImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)56 public BadgedImageView(Context context, AttributeSet attrs, int defStyleAttr, 57 int defStyleRes) { 58 super(context, attrs, defStyleAttr, defStyleRes); 59 mIconSize = getResources().getDimensionPixelSize(R.dimen.individual_bubble_size); 60 mDotRenderer = new BadgeRenderer(getContext()); 61 62 TypedArray ta = context.obtainStyledAttributes( 63 new int[] {android.R.attr.colorBackgroundFloating}); 64 ta.recycle(); 65 } 66 67 @Override onDraw(Canvas canvas)68 public void onDraw(Canvas canvas) { 69 super.onDraw(canvas); 70 if (mShowUpdateDot) { 71 getDrawingRect(mTempBounds); 72 mTempPoint.set((getWidth() - mIconSize) / 2, getPaddingTop()); 73 mDotRenderer.draw(canvas, mUpdateDotColor, mTempBounds, mDotScale, mTempPoint, 74 mOnLeft); 75 } 76 } 77 78 /** 79 * Set whether the dot should appear on left or right side of the view. 80 */ setDotPosition(boolean onLeft)81 public void setDotPosition(boolean onLeft) { 82 mOnLeft = onLeft; 83 invalidate(); 84 } 85 getDotPosition()86 public boolean getDotPosition() { 87 return mOnLeft; 88 } 89 90 /** 91 * Set whether the dot should show or not. 92 */ setShowDot(boolean showBadge)93 public void setShowDot(boolean showBadge) { 94 mShowUpdateDot = showBadge; 95 invalidate(); 96 } 97 98 /** 99 * @return whether the dot is being displayed. 100 */ isShowingDot()101 public boolean isShowingDot() { 102 return mShowUpdateDot; 103 } 104 105 /** 106 * The colour to use for the dot. 107 */ setDotColor(int color)108 public void setDotColor(int color) { 109 mUpdateDotColor = ColorUtils.setAlphaComponent(color, 255 /* alpha */); 110 invalidate(); 111 } 112 113 /** 114 * How big the dot should be, fraction from 0 to 1. 115 */ setDotScale(float fraction)116 public void setDotScale(float fraction) { 117 mDotScale = fraction; 118 invalidate(); 119 } 120 getDotScale()121 public float getDotScale() { 122 return mDotScale; 123 } 124 } 125