130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu/*
230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * Copyright (C) 2013 The Android Open Source Project
330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu *
430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * Licensed under the Apache License, Version 2.0 (the "License");
530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * you may not use this file except in compliance with the License.
630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * You may obtain a copy of the License at
730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu *
830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu *      http://www.apache.org/licenses/LICENSE-2.0
930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu *
1030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * Unless required by applicable law or agreed to in writing, software
1130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * distributed under the License is distributed on an "AS IS" BASIS,
1230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * See the License for the specific language governing permissions and
1430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * limitations under the License.
1530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu */
1630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
1730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liupackage com.android.settingslib.drawable;
1830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
1930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.content.Context;
2030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.content.res.Resources;
2130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.Bitmap;
2230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.Canvas;
2330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.Color;
2430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.ColorFilter;
2530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.Paint;
2630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.Path;
2730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.PixelFormat;
2830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.PorterDuff;
2930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.PorterDuffXfermode;
3030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.Rect;
3130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.RectF;
3230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.drawable.Drawable;
3330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
3430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport com.android.settingslib.R;
3530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
3630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu/**
3730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * Converts the user avatar icon to a circularly clipped one.
3830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu * TODO: Move this to an internal framework class and share with the one in Keyguard.
3930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu */
4030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liupublic class CircleFramedDrawable extends Drawable {
4130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
4230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    private final Bitmap mBitmap;
4330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    private final int mSize;
4430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    private final Paint mPaint;
4530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
4630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    private float mScale;
4730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    private Rect mSrcRect;
4830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    private RectF mDstRect;
4930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
5030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public static CircleFramedDrawable getInstance(Context context, Bitmap icon) {
5130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        Resources res = context.getResources();
5230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        float iconSize = res.getDimension(R.dimen.circle_avatar_size);
5330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
5430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        CircleFramedDrawable instance = new CircleFramedDrawable(icon, (int) iconSize);
5530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        return instance;
5630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
5730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
5830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public CircleFramedDrawable(Bitmap icon, int size) {
5930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        super();
6030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mSize = size;
6130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
6230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mBitmap = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);
6330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        final Canvas canvas = new Canvas(mBitmap);
6430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
6530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        final int width = icon.getWidth();
6630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        final int height = icon.getHeight();
6730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        final int square = Math.min(width, height);
6830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
6930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        final Rect cropRect = new Rect((width - square) / 2, (height - square) / 2, square, square);
7030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        final RectF circleRect = new RectF(0f, 0f, mSize, mSize);
7130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
7230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        final Path fillPath = new Path();
7330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        fillPath.addArc(circleRect, 0f, 360f);
7430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
7530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        canvas.drawColor(0, PorterDuff.Mode.CLEAR);
7630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
7730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        // opaque circle matte
7830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mPaint = new Paint();
7930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mPaint.setAntiAlias(true);
8030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mPaint.setColor(Color.BLACK);
8130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mPaint.setStyle(Paint.Style.FILL);
8230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        canvas.drawPath(fillPath, mPaint);
8330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
8430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        // mask in the icon where the bitmap is opaque
8530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
8630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        canvas.drawBitmap(icon, cropRect, circleRect, mPaint);
8730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
8830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        // prepare paint for frame drawing
8930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mPaint.setXfermode(null);
9030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
9130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mScale = 1f;
9230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
9330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mSrcRect = new Rect(0, 0, mSize, mSize);
9430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mDstRect = new RectF(0, 0, mSize, mSize);
9530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
9630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
9730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    @Override
9830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public void draw(Canvas canvas) {
9930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        final float inside = mScale * mSize;
10030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        final float pad = (mSize - inside) / 2f;
10130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
10230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mDstRect.set(pad, pad, mSize - pad, mSize - pad);
10330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        canvas.drawBitmap(mBitmap, mSrcRect, mDstRect, null);
10430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
10530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
10630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public void setScale(float scale) {
10730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        mScale = scale;
10830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
10930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
11030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public float getScale() {
11130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        return mScale;
11230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
11330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
11430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    @Override
11530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public int getOpacity() {
11630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        return PixelFormat.TRANSLUCENT;
11730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
11830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
11930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    @Override
12030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public void setAlpha(int alpha) {
12130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
12230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
12330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    @Override
12430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public void setColorFilter(ColorFilter cf) {
12530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
12630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
12730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    @Override
12830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public int getIntrinsicWidth() {
12930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        return mSize;
13030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
13130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
13230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    @Override
13330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public int getIntrinsicHeight() {
13430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        return mSize;
13530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
13630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu}
137