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