12917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi/* 22917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * Copyright (C) 2016 The Android Open Source Project 32917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * 42917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 52917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * you may not use this file except in compliance with the License. 62917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * You may obtain a copy of the License at 72917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * 82917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 92917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * 102917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * Unless required by applicable law or agreed to in writing, software 112917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 122917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * See the License for the specific language governing permissions and 142917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * limitations under the License 152917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi */ 162917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 172917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggipackage com.android.systemui.stackdivider; 182917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 192917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport android.annotation.Nullable; 202917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport android.content.Context; 212917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport android.graphics.Canvas; 222917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport android.graphics.Color; 232917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport android.graphics.LinearGradient; 242917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport android.graphics.Paint; 252917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport android.graphics.Shader; 262917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport android.util.AttributeSet; 272917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport android.view.View; 282917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport android.view.WindowManager; 292917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 302917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggiimport com.android.systemui.R; 312917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 322917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi/** 332917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi * Shadow for the minimized dock state on homescreen. 342917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi */ 352917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggipublic class MinimizedDockShadow extends View { 362917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 372917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi private final Paint mShadowPaint = new Paint(); 382917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 392917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi private int mDockSide = WindowManager.DOCKED_INVALID; 402917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 412917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi public MinimizedDockShadow(Context context, @Nullable AttributeSet attrs) { 422917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi super(context, attrs); 432917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } 442917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 452917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi public void setDockSide(int dockSide) { 462917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi if (dockSide != mDockSide) { 472917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi mDockSide = dockSide; 482917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi updatePaint(getLeft(), getTop(), getRight(), getBottom()); 492917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi invalidate(); 502917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } 512917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } 522917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 532917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi private void updatePaint(int left, int top, int right, int bottom) { 542917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi int startColor = mContext.getResources().getColor( 552917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi R.color.minimize_dock_shadow_start, null); 562917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi int endColor = mContext.getResources().getColor( 572917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi R.color.minimize_dock_shadow_end, null); 582917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi final int middleColor = Color.argb( 592917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi (Color.alpha(startColor) + Color.alpha(endColor)) / 2, 0, 0, 0); 602917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi final int quarter = Color.argb( 612917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi (int) (Color.alpha(startColor) * 0.25f + Color.alpha(endColor) * 0.75f), 622917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 0, 0, 0); 632917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi if (mDockSide == WindowManager.DOCKED_TOP) { 642917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi mShadowPaint.setShader(new LinearGradient( 652917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 0, 0, 0, bottom - top, 662917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi new int[] { startColor, middleColor, quarter, endColor }, 672917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi new float[] { 0f, 0.35f, 0.6f, 1f }, Shader.TileMode.CLAMP)); 682917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } else if (mDockSide == WindowManager.DOCKED_LEFT) { 692917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi mShadowPaint.setShader(new LinearGradient( 702917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 0, 0, right - left, 0, 712917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi new int[] { startColor, middleColor, quarter, endColor }, 722917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi new float[] { 0f, 0.35f, 0.6f, 1f }, Shader.TileMode.CLAMP)); 732917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } else if (mDockSide == WindowManager.DOCKED_RIGHT) { 742917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi mShadowPaint.setShader(new LinearGradient( 752917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi right - left, 0, 0, 0, 762917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi new int[] { startColor, middleColor, quarter, endColor }, 772917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi new float[] { 0f, 0.35f, 0.6f, 1f }, Shader.TileMode.CLAMP)); 782917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } 792917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } 802917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 812917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi @Override 822917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 832917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi super.onLayout(changed, left, top, right, bottom); 842917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi if (changed) { 852917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi updatePaint(left, top, right, bottom); 862917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi invalidate(); 872917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } 882917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } 892917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 902917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi @Override 912917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi protected void onDraw(Canvas canvas) { 922917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi canvas.drawRect(0, 0, getWidth(), getHeight(), mShadowPaint); 932917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } 942917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 952917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi @Override 962917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi public boolean hasOverlappingRendering() { 972917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi return false; 982917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } 992917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi} 100