1 /*
2  * Copyright (C) 2016 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.emergency;
17 
18 import android.content.Context;
19 import android.content.res.Resources;
20 import android.graphics.Bitmap;
21 import android.graphics.Canvas;
22 import android.graphics.Color;
23 import android.graphics.ColorFilter;
24 import android.graphics.Paint;
25 import android.graphics.Path;
26 import android.graphics.PixelFormat;
27 import android.graphics.PorterDuff;
28 import android.graphics.PorterDuffXfermode;
29 import android.graphics.Rect;
30 import android.graphics.RectF;
31 import android.graphics.drawable.Drawable;
32 
33 /**
34  * Converts the user avatar icon to a circularly clipped one.
35  * TODO: Use CircleFramedDrawable from Settings once it's moved to frameworks.
36  */
37 public class CircleFramedDrawable extends Drawable {
38 
39     private final Bitmap mBitmap;
40     private final int mSize;
41     private final Paint mPaint;
42 
43     private float mScale;
44     private Rect mSrcRect;
45     private RectF mDstRect;
46 
getInstance(Context context, Bitmap icon)47     public static CircleFramedDrawable getInstance(Context context, Bitmap icon) {
48         Resources res = context.getResources();
49         float iconSize = res.getDimension(R.dimen.circle_avatar_size);
50 
51         CircleFramedDrawable instance = new CircleFramedDrawable(icon, (int) iconSize);
52         return instance;
53     }
54 
CircleFramedDrawable(Bitmap icon, int size)55     public CircleFramedDrawable(Bitmap icon, int size) {
56         super();
57         mSize = size;
58 
59         mBitmap = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);
60         final Canvas canvas = new Canvas(mBitmap);
61 
62         final int width = icon.getWidth();
63         final int height = icon.getHeight();
64         final int square = Math.min(width, height);
65 
66         final Rect cropRect = new Rect((width - square) / 2, (height - square) / 2, square, square);
67         final RectF circleRect = new RectF(0f, 0f, mSize, mSize);
68 
69         final Path fillPath = new Path();
70         fillPath.addArc(circleRect, 0f, 360f);
71 
72         canvas.drawColor(0, PorterDuff.Mode.CLEAR);
73 
74         // opaque circle matte
75         mPaint = new Paint();
76         mPaint.setAntiAlias(true);
77         mPaint.setColor(Color.BLACK);
78         mPaint.setStyle(Paint.Style.FILL);
79         canvas.drawPath(fillPath, mPaint);
80 
81         // mask in the icon where the bitmap is opaque
82         mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
83         canvas.drawBitmap(icon, cropRect, circleRect, mPaint);
84 
85         // prepare paint for frame drawing
86         mPaint.setXfermode(null);
87 
88         mScale = 1f;
89 
90         mSrcRect = new Rect(0, 0, mSize, mSize);
91         mDstRect = new RectF(0, 0, mSize, mSize);
92     }
93 
94     @Override
draw(Canvas canvas)95     public void draw(Canvas canvas) {
96         final float inside = mScale * mSize;
97         final float pad = (mSize - inside) / 2f;
98 
99         mDstRect.set(pad, pad, mSize - pad, mSize - pad);
100         canvas.drawBitmap(mBitmap, mSrcRect, mDstRect, null);
101     }
102 
setScale(float scale)103     public void setScale(float scale) {
104         mScale = scale;
105     }
106 
getScale()107     public float getScale() {
108         return mScale;
109     }
110 
111     @Override
getOpacity()112     public int getOpacity() {
113         return PixelFormat.TRANSLUCENT;
114     }
115 
116     @Override
setAlpha(int alpha)117     public void setAlpha(int alpha) {
118     }
119 
120     @Override
setColorFilter(ColorFilter cf)121     public void setColorFilter(ColorFilter cf) {
122     }
123 
124     @Override
getIntrinsicWidth()125     public int getIntrinsicWidth() {
126         return mSize;
127     }
128 
129     @Override
getIntrinsicHeight()130     public int getIntrinsicHeight() {
131         return mSize;
132     }
133 }
134 
135