diff --git a/lawnchair/src/app/lawnchair/ui/StretchEdgeEffect.java b/lawnchair/src/app/lawnchair/ui/StretchEdgeEffect.java index a2ba1015e6..15166655c1 100644 --- a/lawnchair/src/app/lawnchair/ui/StretchEdgeEffect.java +++ b/lawnchair/src/app/lawnchair/ui/StretchEdgeEffect.java @@ -377,10 +377,14 @@ public class StretchEdgeEffect extends EdgeEffectCompat { } public void applyStretch(Canvas canvas, @EdgeEffectPosition int position) { + applyStretch(canvas, position, 0, 0); + } + + public void applyStretch(Canvas canvas, @EdgeEffectPosition int position, int translationX, int translationY) { mTmpOut[0] = 0f; getScale(mTmpOut, position); if (mTmpOut[0] == 1f) { - canvas.scale(mTmpOut[1], mTmpOut[2], mTmpOut[3], mTmpOut[4]); + canvas.scale(mTmpOut[1], mTmpOut[2], mTmpOut[3] - translationX, mTmpOut[4] - translationY); } } diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index b423871259..3d3eafdfdc 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -61,6 +61,8 @@ import com.android.launcher3.views.ActivityContext; import java.util.ArrayList; import java.util.function.Consumer; +import app.lawnchair.ui.StretchEdgeEffect; + /** * An abstraction of the original Workspace which supports browsing through a * sequential list of "pages" @@ -190,8 +192,8 @@ public abstract class PagedView extends ViewGrou } protected void initEdgeEffect() { - mEdgeGlowLeft = new EdgeEffectCompat(getContext()); - mEdgeGlowRight = new EdgeEffectCompat(getContext()); + mEdgeGlowLeft = EdgeEffectCompat.create(getContext(), this); + mEdgeGlowRight = EdgeEffectCompat.create(getContext(), this); } public void initParentViews(View parent) { @@ -1768,11 +1770,28 @@ public abstract class PagedView extends ViewGrou @Override public void draw(Canvas canvas) { + if (!Utilities.ATLEAST_S) drawStretchEdgeEffect(canvas); super.draw(canvas); - drawEdgeEffect(canvas); + if (Utilities.ATLEAST_S) drawEdgeEffect(canvas); pageEndTransition(); } + protected void drawStretchEdgeEffect(Canvas canvas) { + if (mAllowOverScroll && (!mEdgeGlowRight.isFinished() || !mEdgeGlowLeft.isFinished())) { + final int width = getWidth(); + final int height = getHeight(); + if (!mEdgeGlowLeft.isFinished() && mEdgeGlowLeft instanceof StretchEdgeEffect) { + mEdgeGlowLeft.setSize(width, height); + ((StretchEdgeEffect) mEdgeGlowLeft).applyStretch(canvas, StretchEdgeEffect.POSITION_LEFT); + } + if (!mEdgeGlowRight.isFinished() && mEdgeGlowRight instanceof StretchEdgeEffect) { + mEdgeGlowRight.setSize(width, height); + ((StretchEdgeEffect) mEdgeGlowRight).applyStretch(canvas, StretchEdgeEffect.POSITION_RIGHT, + -Math.max(mMaxScroll, getScrollX()), 0); + } + } + } + protected void drawEdgeEffect(Canvas canvas) { if (mAllowOverScroll && (!mEdgeGlowRight.isFinished() || !mEdgeGlowLeft.isFinished())) { final int width = getWidth(); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 633677045c..d4344aa7e6 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -978,7 +978,7 @@ public class Workspace extends PagedView public void setLauncherOverlay(LauncherOverlay overlay) { mOverlayEdgeEffect = overlay == null ? null : new OverlayEdgeEffect(getContext(), overlay); EdgeEffectCompat newEffect = overlay == null - ? new EdgeEffectCompat(getContext()) : mOverlayEdgeEffect; + ? EdgeEffectCompat.create(getContext(), this) : mOverlayEdgeEffect; if (mIsRtl) { mEdgeGlowRight = newEffect; } else { diff --git a/src/com/android/launcher3/util/EdgeEffectCompat.java b/src/com/android/launcher3/util/EdgeEffectCompat.java index 491582b87f..0323440d4f 100644 --- a/src/com/android/launcher3/util/EdgeEffectCompat.java +++ b/src/com/android/launcher3/util/EdgeEffectCompat.java @@ -16,10 +16,13 @@ package com.android.launcher3.util; import android.content.Context; +import android.view.View; import android.widget.EdgeEffect; import com.android.launcher3.Utilities; +import app.lawnchair.ui.StretchEdgeEffect; + /** * Extension of {@link EdgeEffect} to allow backwards compatibility */ @@ -43,4 +46,14 @@ public class EdgeEffectCompat extends EdgeEffect { return deltaDistance; } } + + private static final Runnable EMPTY_RUNNABLE = () -> {}; + + public static EdgeEffectCompat create(Context context, View view) { + if (Utilities.ATLEAST_S) { + return new EdgeEffectCompat(context); + } else { + return new StretchEdgeEffect(context, EMPTY_RUNNABLE, view::postInvalidateOnAnimation); + } + } }