From 139752d9c795174b9bc07b43d052d1ee5c98adb8 Mon Sep 17 00:00:00 2001 From: paphonb Date: Thu, 23 Aug 2018 22:44:15 +0700 Subject: [PATCH] Implement blur --- quickstep/res/layout/scrim_view.xml | 2 +- .../quickstep/views/ShelfScrimView.java | 22 +++- .../lawnchair/LawnchairLauncher.kt | 5 + .../lawnchair/blur/BlurDrawable.kt | 10 +- .../lawnchair/views/BlurScrimView.kt | 120 ++++++++++++++++++ src/com/android/launcher3/Launcher.java | 6 + .../android/launcher3/views/ScrimView.java | 13 +- 7 files changed, 163 insertions(+), 15 deletions(-) create mode 100644 src/ch/deletescape/lawnchair/views/BlurScrimView.kt diff --git a/quickstep/res/layout/scrim_view.xml b/quickstep/res/layout/scrim_view.xml index 2cc37f9cc4..9eb71adb2d 100644 --- a/quickstep/res/layout/scrim_view.xml +++ b/quickstep/res/layout/scrim_view.xml @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - 0 - mPaint.alpha = alpha - mCornerPaint.alpha = alpha + if (mAlpha != alpha) { + mAlpha = alpha + mShouldDraw = alpha > 0 + mPaint.alpha = alpha + } } override fun setColorFilter(colorFilter: ColorFilter?) { diff --git a/src/ch/deletescape/lawnchair/views/BlurScrimView.kt b/src/ch/deletescape/lawnchair/views/BlurScrimView.kt new file mode 100644 index 0000000000..3f438f7254 --- /dev/null +++ b/src/ch/deletescape/lawnchair/views/BlurScrimView.kt @@ -0,0 +1,120 @@ +package ch.deletescape.lawnchair.views + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.util.Log +import ch.deletescape.lawnchair.blur.BlurDrawable +import ch.deletescape.lawnchair.blur.BlurWallpaperProvider +import ch.deletescape.lawnchair.blurWallpaperProvider +import com.android.launcher3.anim.Interpolators.ACCEL_2 +import com.android.quickstep.views.ShelfScrimView + +/* + * Copyright (C) 2018 paphonb@xda + * + * 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. + */ + +class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(context, attrs) { + + private val blurDrawableCallback by lazy { + object : Drawable.Callback { + override fun unscheduleDrawable(who: Drawable?, what: Runnable?) { + + } + + override fun invalidateDrawable(who: Drawable?) { + invalidate() + } + + override fun scheduleDrawable(who: Drawable?, what: Runnable?, `when`: Long) { + + } + } + } + + private val provider by lazy { context.blurWallpaperProvider } + private val useFlatColor get() = mLauncher.deviceProfile.isVerticalBarLayout + private val blurRadius get() = if (useFlatColor) 0f else mRadius + private var blurDrawable: BlurDrawable? = null + + private fun createBlurDrawable(): BlurDrawable? { + blurDrawable?.apply { if (isAttachedToWindow) stopListening() } + return if (BlurWallpaperProvider.isEnabled) { + provider.createDrawable(blurRadius, false).apply { callback = blurDrawableCallback } + } else { + null + }?.apply { + setBounds(left, top, right, bottom) + if (isAttachedToWindow) startListening() + } + } + + override fun reInitUi() { + super.reInitUi() + blurDrawable = createBlurDrawable() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + blurDrawable?.startListening() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + + blurDrawable?.stopListening() + } + + override fun setProgress(progress: Float) { + blurDrawable?.alpha = if (useFlatColor) ((1 - progress) * 255).toInt() else 255 + super.setProgress(progress) + } + + override fun onDrawFlatColor(canvas: Canvas) { + blurDrawable?.draw(canvas) + } + + override fun onDrawRoundRect(canvas: Canvas, left: Float, top: Float, right: Float, bottom: Float, rx: Float, ry: Float, paint: Paint) { + blurDrawable?.run { + setBounds(left.toInt(), top.toInt(), right.toInt(), bottom.toInt()) + draw(canvas) + } + super.onDrawRoundRect(canvas, left, top, right, bottom, rx, ry, paint) + } + + override fun updateColors() { + super.updateColors() + if (useFlatColor) { + blurDrawable?.alpha = ((1 - mProgress) * 255).toInt() + } else { + if (mProgress >= mMoveThreshold) { + blurDrawable?.alpha = Math.round(255 * ACCEL_2.getInterpolation( + (1 - mProgress) / (1 - mMoveThreshold))) + } else { + blurDrawable?.alpha = 255 + } + } + } + + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + if (useFlatColor) { + blurDrawable?.setBounds(left, top, right, bottom) + } + } +} diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index f36b0dedd3..69b436e169 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -376,6 +376,8 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, // TODO: We can probably avoid rebind when only screen size changed. rebindModel(); + + onRotationChanged(); } mOldConfig.setTo(newConfig); @@ -2453,6 +2455,10 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, return mDeviceProfile.isVerticalBarLayout(); } + protected void onRotationChanged() { + + } + public static Launcher getLauncher(Context context) { if (context instanceof Launcher) { return (Launcher) context; diff --git a/src/com/android/launcher3/views/ScrimView.java b/src/com/android/launcher3/views/ScrimView.java index 6e3ef07052..1919a968d4 100644 --- a/src/com/android/launcher3/views/ScrimView.java +++ b/src/com/android/launcher3/views/ScrimView.java @@ -32,10 +32,7 @@ import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.RectEvaluator; import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Rect; -import android.graphics.RectF; +import android.graphics.*; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; @@ -428,4 +425,12 @@ public class ScrimView extends View implements Insettable, OnChangeListener, public int getDragHandleSize() { return mDragHandleSize; } + + protected void onDrawFlatColor(Canvas canvas) { + + } + + protected void onDrawRoundRect(Canvas canvas, float left, float top, float right, float bottom, float rx, float ry, Paint paint) { + + } }