/*
* 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;
}
}