/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.systemui.stackdivider; import android.annotation.Nullable; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Shader; import android.util.AttributeSet; import android.view.View; import android.view.WindowManager; import com.android.systemui.R; /** * Shadow for the minimized dock state on homescreen. */ public class MinimizedDockShadow extends View { private final Paint mShadowPaint = new Paint(); private int mDockSide = WindowManager.DOCKED_INVALID; public MinimizedDockShadow(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public void setDockSide(int dockSide) { if (dockSide != mDockSide) { mDockSide = dockSide; updatePaint(getLeft(), getTop(), getRight(), getBottom()); invalidate(); } } private void updatePaint(int left, int top, int right, int bottom) { int startColor = mContext.getResources().getColor( R.color.minimize_dock_shadow_start, null); int endColor = mContext.getResources().getColor( R.color.minimize_dock_shadow_end, null); final int middleColor = Color.argb( (Color.alpha(startColor) + Color.alpha(endColor)) / 2, 0, 0, 0); final int quarter = Color.argb( (int) (Color.alpha(startColor) * 0.25f + Color.alpha(endColor) * 0.75f), 0, 0, 0); if (mDockSide == WindowManager.DOCKED_TOP) { mShadowPaint.setShader(new LinearGradient( 0, 0, 0, bottom - top, new int[] { startColor, middleColor, quarter, endColor }, new float[] { 0f, 0.35f, 0.6f, 1f }, Shader.TileMode.CLAMP)); } else if (mDockSide == WindowManager.DOCKED_LEFT) { mShadowPaint.setShader(new LinearGradient( 0, 0, right - left, 0, new int[] { startColor, middleColor, quarter, endColor }, new float[] { 0f, 0.35f, 0.6f, 1f }, Shader.TileMode.CLAMP)); } else if (mDockSide == WindowManager.DOCKED_RIGHT) { mShadowPaint.setShader(new LinearGradient( right - left, 0, 0, 0, new int[] { startColor, middleColor, quarter, endColor }, new float[] { 0f, 0.35f, 0.6f, 1f }, Shader.TileMode.CLAMP)); } } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (changed) { updatePaint(left, top, right, bottom); invalidate(); } } @Override protected void onDraw(Canvas canvas) { canvas.drawRect(0, 0, getWidth(), getHeight(), mShadowPaint); } @Override public boolean hasOverlappingRendering() { return false; } }