1bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi/*
2bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi * Copyright (C) 2014 The Android Open Source Project
3bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi *
4bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
5bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi * you may not use this file except in compliance with the License.
6bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi * You may obtain a copy of the License at
7bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi *
8bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
9bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi *
10bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi * Unless required by applicable law or agreed to in writing, software
11bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
12bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi * See the License for the specific language governing permissions and
14bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi * limitations under the License
15bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi */
16bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
17bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggipackage com.android.systemui.statusbar.policy;
18bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
19bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.graphics.Canvas;
20bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.graphics.Color;
21bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.graphics.ColorFilter;
2298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggiimport android.graphics.LightingColorFilter;
23bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.graphics.Paint;
24bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.graphics.PixelFormat;
25bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.graphics.RadialGradient;
26bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.graphics.Rect;
27bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.graphics.Shader;
28bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.graphics.drawable.Drawable;
29bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.util.LayoutDirection;
30bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport android.view.View;
31bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
32bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport com.android.systemui.R;
33bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
34bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi/**
35bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi * Gradient background for the user switcher on Keyguard.
36bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi */
37bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggipublic class KeyguardUserSwitcherScrim extends Drawable
38bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        implements View.OnLayoutChangeListener {
39bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
40bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    private static final float OUTER_EXTENT = 2.5f;
41bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    private static final float INNER_EXTENT = 0.75f;
42bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
43bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    private int mDarkColor;
44bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    private int mTop;
452d1ef3012c98c07877816f3587514cca98609550Adrian Roos    private int mAlpha = 255;
46bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    private Paint mRadialGradientPaint = new Paint();
4798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    private int mLayoutWidth;
48bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
49bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    public KeyguardUserSwitcherScrim(View host) {
50bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        host.addOnLayoutChangeListener(this);
51bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        mDarkColor = host.getResources().getColor(
52bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi                R.color.keyguard_user_switcher_background_gradient_color);
53bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    }
54bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
55bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    @Override
56bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    public void draw(Canvas canvas) {
57bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        boolean isLtr = getLayoutDirection() == LayoutDirection.LTR;
58bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        Rect bounds = getBounds();
59bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        float width = bounds.width() * OUTER_EXTENT;
60bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        float height = (mTop + bounds.height()) * OUTER_EXTENT;
61bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        canvas.translate(0, -mTop);
6298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        canvas.scale(1, height / width);
63bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        canvas.drawRect(isLtr ? bounds.right - width : 0, 0,
64bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi                isLtr ? bounds.right : bounds.left + width, width, mRadialGradientPaint);
65bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    }
66bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
67bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    @Override
68bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    public void setAlpha(int alpha) {
6998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        mAlpha = alpha;
7098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        updatePaint();
7198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        invalidateSelf();
7298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    }
7398f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi
7498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    @Override
7598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    public int getAlpha() {
7698f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        return mAlpha;
77bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    }
78bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
79bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    @Override
80bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    public void setColorFilter(ColorFilter cf) {
81bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    }
82bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
83bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    @Override
84bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    public int getOpacity() {
85bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        return PixelFormat.TRANSLUCENT;
86bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    }
87bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi
88bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    @Override
89bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
90bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi            int oldTop, int oldRight, int oldBottom) {
91bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) {
9298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            mLayoutWidth = right - left;
93bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi            mTop = top;
9498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            updatePaint();
95bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi        }
96bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi    }
9798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi
9898f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    private void updatePaint() {
9998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        if (mLayoutWidth == 0) {
10098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            return;
10198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        }
10298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        float radius = mLayoutWidth * OUTER_EXTENT;
10398f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        boolean isLtr = getLayoutDirection() == LayoutDirection.LTR;
10498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        mRadialGradientPaint.setShader(
10598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                new RadialGradient(isLtr ? mLayoutWidth : 0, 0, radius,
10698f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                        new int[] { Color.argb(
10798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                                        (int) (Color.alpha(mDarkColor) * mAlpha / 255f), 0, 0, 0),
10898f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                                Color.TRANSPARENT },
10998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                        new float[] { Math.max(0f, mLayoutWidth * INNER_EXTENT / radius), 1f },
11098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                        Shader.TileMode.CLAMP));
11198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    }
112bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi}
113