From c87d41f36939ec5523228cb6ddc289a5fb0363e5 Mon Sep 17 00:00:00 2001 From: Johannes Gallmann Date: Wed, 13 Nov 2024 10:23:20 +0000 Subject: [PATCH] Never scale navbar scrim in all apps and widget picker The navbar scrim is scaled during the predictive back animation. This should be prevented since the navbar itself does not change it's position or scale. Bug: 373544911 Test: Manual, i.e. verifying that the navbar scrim remains in its original position during the predictive back animation (with 3-button-nav) on phones and tablets Flag: com.android.window.flags.predictive_back_three_button_nav Change-Id: Iaffd31de5493dea8c856ad3d5b441cca066bbad8 --- .../allapps/ActivityAllAppsContainerView.java | 18 ++++++++++++++++-- .../launcher3/widget/BaseWidgetSheet.java | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java index 1b58987500..c938482284 100644 --- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java @@ -28,6 +28,7 @@ import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCH import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.ScrollableLayoutManager.PREDICTIVE_BACK_MIN_SCALE; import static com.android.launcher3.views.RecyclerViewFastScroller.FastScrollerLocation.ALL_APPS_SCROLLER; +import static com.android.window.flags.Flags.predictiveBackThreeButtonNav; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -1173,8 +1174,10 @@ public class ActivityAllAppsContainerView super.dispatchDraw(canvas); if (mNavBarScrimHeight > 0) { - canvas.drawRect(0, getHeight() - mNavBarScrimHeight, getWidth(), getHeight(), - mNavBarScrimPaint); + float left = (getWidth() - getWidth() / getScaleX()) / 2; + float top = getHeight() / 2f + (getHeight() / 2f - mNavBarScrimHeight) / getScaleY(); + canvas.drawRect(left, top, getWidth() / getScaleX(), + top + mNavBarScrimHeight / getScaleY(), mNavBarScrimPaint); } } @@ -1340,6 +1343,17 @@ public class ActivityAllAppsContainerView invalidateHeader(); } + @Override + public void setScaleY(float scaleY) { + super.setScaleY(scaleY); + if (predictiveBackThreeButtonNav() && mNavBarScrimHeight > 0) { + // Call invalidate to prevent navbar scrim from scaling. The navbar scrim is drawn + // directly onto the canvas. To prevent it from being scaled with the canvas, there's a + // counter scale applied in dispatchDraw. + invalidate(20, getHeight() - mNavBarScrimHeight, getWidth(), getHeight()); + } + } + /** * Set {@link Animator.AnimatorListener} on {@link mAllAppsTransitionController} to observe * animation of backing out of all apps search view to all apps view. diff --git a/src/com/android/launcher3/widget/BaseWidgetSheet.java b/src/com/android/launcher3/widget/BaseWidgetSheet.java index 1c0d94cbf4..fda5175794 100644 --- a/src/com/android/launcher3/widget/BaseWidgetSheet.java +++ b/src/com/android/launcher3/widget/BaseWidgetSheet.java @@ -20,6 +20,7 @@ import static com.android.launcher3.Flags.enableWidgetTapToAdd; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.anim.AnimatorListeners.forSuccessCallback; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_WIDGET_ADD_BUTTON_TAP; +import static com.android.window.flags.Flags.predictiveBackThreeButtonNav; import android.content.Context; import android.graphics.Canvas; @@ -127,6 +128,17 @@ public abstract class BaseWidgetSheet extends AbstractSlideInView setupNavBarColor(); } + @Override + public void setScaleY(float scaleY) { + super.setScaleY(scaleY); + if (predictiveBackThreeButtonNav() && mNavBarScrimHeight > 0) { + // Call invalidate to prevent navbar scrim from scaling. The navbar scrim is drawn + // directly onto the canvas. To prevent it from being scaled with the canvas, there's a + // counter scale applied in dispatchDraw. + invalidate(); + } + } + @Override public final void onClick(View v) { WidgetCell wc; @@ -318,8 +330,10 @@ public abstract class BaseWidgetSheet extends AbstractSlideInView super.dispatchDraw(canvas); if (mNavBarScrimHeight > 0) { - canvas.drawRect(0, getHeight() - mNavBarScrimHeight, getWidth(), getHeight(), - mNavBarScrimPaint); + float left = (getWidth() - getWidth() / getScaleX()) / 2; + float top = getHeight() / 2f + (getHeight() / 2f - mNavBarScrimHeight) / getScaleY(); + canvas.drawRect(left, top, getWidth() / getScaleX(), + top + mNavBarScrimHeight / getScaleY(), mNavBarScrimPaint); } }