1692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren/*
2692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren * Copyright (C) 2012 The Android Open Source Project
3692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren *
4692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren * Licensed under the Apache License, Version 2.0 (the "License");
5692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren * you may not use this file except in compliance with the License.
6692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren * You may obtain a copy of the License at
7692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren *
8692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren *      http://www.apache.org/licenses/LICENSE-2.0
9692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren *
10692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren * Unless required by applicable law or agreed to in writing, software
11692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren * distributed under the License is distributed on an "AS IS" BASIS,
12692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren * See the License for the specific language governing permissions and
14692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren * limitations under the License.
15692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren */
16692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard;
18692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
19692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.Bitmap;
20692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.Canvas;
21692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.Color;
22692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.ColorFilter;
23692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.Paint;
24692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.Path;
25692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.PixelFormat;
26692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.PorterDuff;
27692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.PorterDuffXfermode;
28692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.Rect;
29692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.RectF;
30692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenimport android.graphics.drawable.Drawable;
31692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
32692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wrenclass KeyguardCircleFramedDrawable extends Drawable {
33692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
34692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private final Bitmap mBitmap;
35692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private final int mSize;
36692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private final Paint mPaint;
37692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private final float mShadowRadius;
38692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private final float mStrokeWidth;
39692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private final int mFrameColor;
40692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private final int mHighlightColor;
41692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private final int mFrameShadowColor;
42692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
43692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private float mScale;
44692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private Path mFramePath;
45692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private Rect mSrcRect;
46692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private RectF mDstRect;
47692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private RectF mFrameRect;
48692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    private boolean mPressed;
49692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
50692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    public KeyguardCircleFramedDrawable(Bitmap bitmap, int size,
51692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren            int frameColor, float strokeWidth,
52692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren            int frameShadowColor, float shadowRadius,
53692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren            int highlightColor) {
54692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        super();
55692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mSize = size;
56692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mShadowRadius = shadowRadius;
57692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mFrameColor = frameColor;
58692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mFrameShadowColor = frameShadowColor;
59692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mStrokeWidth = strokeWidth;
60692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mHighlightColor = highlightColor;
61692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
62692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mBitmap = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);
63692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        final Canvas canvas = new Canvas(mBitmap);
64692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
65692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        final int width = bitmap.getWidth();
66692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        final int height = bitmap.getHeight();
67692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        final int square = Math.min(width, height);
68692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
69692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        final Rect cropRect = new Rect((width - square) / 2, (height - square) / 2, square, square);
70692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        final RectF circleRect = new RectF(0f, 0f, mSize, mSize);
71692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        circleRect.inset(mStrokeWidth / 2f, mStrokeWidth / 2f);
72692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        circleRect.inset(mShadowRadius, mShadowRadius);
73692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
74692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        final Path fillPath = new Path();
75692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        fillPath.addArc(circleRect, 0f, 360f);
76692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
77692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        canvas.drawColor(0, PorterDuff.Mode.CLEAR);
78692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
79692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        // opaque circle matte
80692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPaint = new Paint();
81692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPaint.setAntiAlias(true);
82692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPaint.setColor(Color.BLACK);
83692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPaint.setStyle(Paint.Style.FILL);
84692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        canvas.drawPath(fillPath, mPaint);
85692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
86692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        // mask in the icon where the bitmap is opaque
87692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
88692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        canvas.drawBitmap(bitmap, cropRect, circleRect, mPaint);
89692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
90692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        // prepare paint for frame drawing
91692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPaint.setXfermode(null);
92692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
93692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mScale = 1f;
94692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
95692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mSrcRect = new Rect(0, 0, mSize, mSize);
96692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mDstRect = new RectF(0, 0, mSize, mSize);
97692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mFrameRect = new RectF(mDstRect);
98692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mFramePath = new Path();
99692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    }
100692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
1016fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani    public void reset() {
1026fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani        mScale = 1f;
1036fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani        mPressed = false;
1046fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani    }
1056fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani
106692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    @Override
107692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    public void draw(Canvas canvas) {
108692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        // clear background
109692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        final float outside = Math.min(canvas.getWidth(), canvas.getHeight());
110692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        final float inside = mScale * outside;
111692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        final float pad = (outside - inside) / 2f;
112692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
113692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mDstRect.set(pad, pad, outside - pad, outside - pad);
114692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        canvas.drawBitmap(mBitmap, mSrcRect, mDstRect, null);
115692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
116692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mFrameRect.set(mDstRect);
117692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mFrameRect.inset(mStrokeWidth / 2f, mStrokeWidth / 2f);
118692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mFrameRect.inset(mShadowRadius, mShadowRadius);
119692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
120692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mFramePath.reset();
121692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mFramePath.addArc(mFrameRect, 0f, 360f);
122692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
123692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        // white frame
124692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        if (mPressed) {
125692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren            mPaint.setStyle(Paint.Style.FILL);
126692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren            mPaint.setColor(Color.argb((int) (0.33f * 255),
127692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren                            Color.red(mHighlightColor),
128692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren                            Color.green(mHighlightColor),
129692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren                            Color.blue(mHighlightColor)));
130692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren            canvas.drawPath(mFramePath, mPaint);
131692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        }
132692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPaint.setStrokeWidth(mStrokeWidth);
133692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPaint.setStyle(Paint.Style.STROKE);
134692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPaint.setColor(mPressed ? mHighlightColor : mFrameColor);
135692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPaint.setShadowLayer(mShadowRadius, 0f, 0f, mFrameShadowColor);
136692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        canvas.drawPath(mFramePath, mPaint);
137692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    }
138692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
139692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    public void setScale(float scale) {
140692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mScale = scale;
141692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    }
142692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
143692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    public float getScale() {
144692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        return mScale;
145692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    }
146692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
147692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    public void setPressed(boolean pressed) {
148692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        mPressed = pressed;
149692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    }
150692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
151692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    @Override
152692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    public int getOpacity() {
153692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren        return PixelFormat.TRANSLUCENT;
154692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    }
155692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
156692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    @Override
157692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    public void setAlpha(int alpha) {
158692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    }
159692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren
160692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    @Override
161692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    public void setColorFilter(ColorFilter cf) {
162692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren    }
1636fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani
1646fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani    public boolean verifyParams(float iconSize, int frameColor, float stroke,
1656fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani            int frameShadowColor, float shadowRadius, int highlightColor) {
1666fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani        return mSize == iconSize
1676fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani                && mFrameColor == frameColor
1686fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani                && mStrokeWidth == stroke
1696fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani                && mFrameShadowColor == frameShadowColor
1706fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani                && mShadowRadius == shadowRadius
1716fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani                && mHighlightColor == highlightColor;
1726fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani    }
173692bb13352b9ad5166adc0dd55ae693d9181f611Chris Wren}
174