From 950a10738b801f7ce6463027fdde9000e6aab49a Mon Sep 17 00:00:00 2001 From: Alex Chau Date: Fri, 16 Sep 2022 14:53:11 +0800 Subject: [PATCH 1/2] Fix STATE_DEPTH stuck at 1 after setting wallpaper - Made BaseDepthController.setDepth/mDepth private, all get/set should be done through STATE_DEPTH or WIDGET_DEPTH - Generified ClampedDepthProperty into Utilities.ClampedProperty to apply on STATE_DEPTH Bug: 240580498 Test: Go to walppaper&style, set new wallpaper, then go to widget picker, wallpaper depth should transition smoothly Change-Id: I53cdedf970fd7ffba6a952c4edf4b34251b01f07 --- .../statehandlers/DepthController.java | 50 ++----------------- .../uioverrides/QuickstepLauncher.java | 9 ++-- .../quickstep/LauncherActivityInterface.java | 5 +- .../quickstep/util/BaseDepthController.java | 4 +- .../android/launcher3/LauncherAnimUtils.java | 28 +++++++++++ .../launcher3/util/MultiPropertyFactory.java | 9 ++-- 6 files changed, 47 insertions(+), 58 deletions(-) diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java index e3fd3f9a06..2a78bdf197 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java +++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java @@ -23,7 +23,6 @@ import static com.android.launcher3.states.StateAnimationConfig.SKIP_DEPTH_CONTR import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; -import android.util.FloatProperty; import android.view.CrossWindowBlurListeners; import android.view.View; import android.view.ViewRootImpl; @@ -32,7 +31,6 @@ import android.view.ViewTreeObserver; import com.android.launcher3.BaseActivity; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; -import com.android.launcher3.Utilities; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.statemanager.StateManager.StateHandler; import com.android.launcher3.states.StateAnimationConfig; @@ -47,43 +45,12 @@ import java.util.function.Consumer; public class DepthController extends BaseDepthController implements StateHandler, BaseActivity.MultiWindowModeChangedListener { - /** - * A property that updates the background blur within a given range of values (ie. even if the - * animator goes beyond 0..1, the interpolated value will still be bounded). - */ - public static class ClampedDepthProperty extends FloatProperty { - private final float mMinValue; - private final float mMaxValue; - - public ClampedDepthProperty(float minValue, float maxValue) { - super("depthClamped"); - mMinValue = minValue; - mMaxValue = maxValue; - } - - @Override - public void setValue(DepthController depthController, float depth) { - depthController.setDepth(Utilities.boundToRange(depth, mMinValue, mMaxValue)); - } - - @Override - public Float get(DepthController depthController) { - return depthController.mDepth; - } - } - private final ViewTreeObserver.OnDrawListener mOnDrawListener = this::onLauncherDraw; private final Consumer mCrossWindowBlurListener = this::setCrossWindowBlursEnabled; private final Runnable mOpaquenessListener = this::applyDepthAndBlur; - /** - * If we're launching and app and should not be blurring the screen for performance reasons. - */ - private boolean mBlurDisabledForAppLaunch; - - // Workaround for animating the depth when multiwindow mode changes. private boolean mIgnoreStateChangesDuringMultiWindowAnimation = false; @@ -145,12 +112,8 @@ public class DepthController extends BaseDepthController implements StateHandler return; } - float toDepth = toState.getDepth(mLauncher); - if (Float.compare(mDepth, toDepth) != 0) { - setDepth(toDepth); - } else if (toState == LauncherState.OVERVIEW) { - applyDepthAndBlur(); - } else if (toState == LauncherState.BACKGROUND_APP) { + STATE_DEPTH.set(this, toState.getDepth(mLauncher)); + if (toState == LauncherState.BACKGROUND_APP) { mLauncher.getDragLayer().getViewTreeObserver().addOnDrawListener(mOnDrawListener); } } @@ -164,10 +127,7 @@ public class DepthController extends BaseDepthController implements StateHandler } float toDepth = toState.getDepth(mLauncher); - if (Float.compare(mDepth, toDepth) != 0) { - animation.setFloat(this, STATE_DEPTH, toDepth, - config.getInterpolator(ANIM_DEPTH, LINEAR)); - } + animation.setFloat(this, STATE_DEPTH, toDepth, config.getInterpolator(ANIM_DEPTH, LINEAR)); } @Override @@ -198,9 +158,9 @@ public class DepthController extends BaseDepthController implements StateHandler writer.println(prefix + "\tmMaxBlurRadius=" + mMaxBlurRadius); writer.println(prefix + "\tmCrossWindowBlursEnabled=" + mCrossWindowBlursEnabled); writer.println(prefix + "\tmSurface=" + mSurface); - writer.println(prefix + "\tmDepth=" + mDepth); + writer.println(prefix + "\tmStateDepth=" + STATE_DEPTH.get(this)); + writer.println(prefix + "\tmWidgetDepth=" + WIDGET_DEPTH.get(this)); writer.println(prefix + "\tmCurrentBlur=" + mCurrentBlur); - writer.println(prefix + "\tmBlurDisabledForAppLaunch=" + mBlurDisabledForAppLaunch); writer.println(prefix + "\tmInEarlyWakeUp=" + mInEarlyWakeUp); writer.println(prefix + "\tmIgnoreStateChangesDuringMultiWindowAnimation=" + mIgnoreStateChangesDuringMultiWindowAnimation); diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index ee9845ba78..3203f44ce2 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -186,6 +186,8 @@ public class QuickstepLauncher extends Launcher { private SafeCloseable mViewCapture; + private boolean mEnableWidgetDepth; + @Override protected void setupViews() { super.setupViews(); @@ -206,6 +208,9 @@ public class QuickstepLauncher extends Launcher { mTISBindHelper = new TISBindHelper(this, this::onTISConnected); mDepthController = new DepthController(this); mHotseatPredictionController = new HotseatPredictionController(this); + + mEnableWidgetDepth = ENABLE_WIDGET_PICKER_DEPTH.get() + && SystemProperties.getBoolean("ro.launcher.depth.widget", true); } @Override @@ -587,9 +592,7 @@ public class QuickstepLauncher extends Launcher { public void onWidgetsTransition(float progress) { super.onWidgetsTransition(progress); onTaskbarInAppDisplayProgressUpdate(progress, WIDGETS_PAGE_PROGRESS_INDEX); - // Change of wallpaper depth in widget picker is disabled for tests as it causes flakiness - // on very slow cuttlefish devices. - if (ENABLE_WIDGET_PICKER_DEPTH.get() && !Utilities.IS_RUNNING_IN_TEST_HARNESS) { + if (mEnableWidgetDepth) { WIDGET_DEPTH.set(getDepthController(), Utilities.mapToRange(progress, 0f, 1f, 0f, getDeviceProfile().bottomSheetDepth, EMPHASIZED)); diff --git a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java index 1cb17cb815..e9588d60fb 100644 --- a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java +++ b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java @@ -34,11 +34,11 @@ import androidx.annotation.UiThread; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.LauncherInitListener; import com.android.launcher3.LauncherState; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.statehandlers.DepthController; -import com.android.launcher3.statehandlers.DepthController.ClampedDepthProperty; import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.taskbar.LauncherTaskbarUIController; import com.android.launcher3.touch.PagedOrientationHandler; @@ -129,7 +129,8 @@ public final class LauncherActivityInterface extends float fromDepthRatio = BACKGROUND_APP.getDepth(activity); float toDepthRatio = OVERVIEW.getDepth(activity); pa.addFloat(getDepthController(), - new ClampedDepthProperty(fromDepthRatio, toDepthRatio), + new LauncherAnimUtils.ClampedProperty<>( + DepthController.STATE_DEPTH, fromDepthRatio, toDepthRatio), fromDepthRatio, toDepthRatio, LINEAR); } }; diff --git a/quickstep/src/com/android/quickstep/util/BaseDepthController.java b/quickstep/src/com/android/quickstep/util/BaseDepthController.java index 29ae9a13ca..064e67515c 100644 --- a/quickstep/src/com/android/quickstep/util/BaseDepthController.java +++ b/quickstep/src/com/android/quickstep/util/BaseDepthController.java @@ -71,7 +71,7 @@ public class BaseDepthController { * Ratio from 0 to 1, where 0 is fully zoomed out, and 1 is zoomed in. * @see android.service.wallpaper.WallpaperService.Engine#onZoomChanged(float) */ - protected float mDepth; + private float mDepth; protected SurfaceControl mSurface; @@ -143,7 +143,7 @@ public class BaseDepthController { } } - protected void setDepth(float depth) { + private void setDepth(float depth) { depth = Utilities.boundToRange(depth, 0, 1); // Round out the depth to dedupe frequent, non-perceptable updates int depthI = (int) (depth * 256); diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java index b858d1a13a..4e80d41402 100644 --- a/src/com/android/launcher3/LauncherAnimUtils.java +++ b/src/com/android/launcher3/LauncherAnimUtils.java @@ -218,4 +218,32 @@ public class LauncherAnimUtils { } }; } + + /** + * A property that updates the specified property within a given range of values (ie. even if + * the animator goes beyond 0..1, the interpolated value will still be bounded). + * @param the specified property + */ + public static class ClampedProperty extends FloatProperty { + private final FloatProperty mProperty; + private final float mMinValue; + private final float mMaxValue; + + public ClampedProperty(FloatProperty property, float minValue, float maxValue) { + super(property.getName() + "Clamped"); + mProperty = property; + mMinValue = minValue; + mMaxValue = maxValue; + } + + @Override + public void setValue(T t, float v) { + mProperty.set(t, Utilities.boundToRange(v, mMinValue, mMaxValue)); + } + + @Override + public Float get(T t) { + return mProperty.get(t); + } + } } diff --git a/src/com/android/launcher3/util/MultiPropertyFactory.java b/src/com/android/launcher3/util/MultiPropertyFactory.java index e7a7785323..43daf087ee 100644 --- a/src/com/android/launcher3/util/MultiPropertyFactory.java +++ b/src/com/android/launcher3/util/MultiPropertyFactory.java @@ -107,12 +107,9 @@ public class MultiPropertyFactory { @Override public Float get(T object) { - // The scale of the view should match mLastAggregatedValue. Still, if it has been - // changed without using this property, it can differ. As this get method is usually - // used to set the starting point on an animation, this would result in some jumps - // when the view scale is different than the last aggregated value. To stay on the - // safe side, let's return the real view scale. - return mProperty.get(object); + // Callers of MultiProperty should only care about the sub-property that it sets. If + // the overall value is needed, mProperty.get should be called directly. + return mValue; } @Override From 1852459977aa220a07d4663310dbf03df273f02f Mon Sep 17 00:00:00 2001 From: Alex Chau Date: Tue, 18 Oct 2022 17:06:15 +0100 Subject: [PATCH 2/2] Enable wallpaper blur for widget picker Fix: 240580498 Test: Go to walppaper&style, set new wallpaper, then go to widget picker, wallpaper depth should transition smoothly Change-Id: Iadabd0e755f861fb1e8967209dd647faed6e4916 --- src/com/android/launcher3/config/FeatureFlags.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index 3a530affad..211ec77f4b 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -283,7 +283,7 @@ public final class FeatureFlags { "In foldables, when reordering the icons and widgets, is now going to use both sides"); public static final BooleanFlag ENABLE_WIDGET_PICKER_DEPTH = new DeviceFlag( - "ENABLE_WIDGET_PICKER_DEPTH", false, "Enable changing depth in widget picker."); + "ENABLE_WIDGET_PICKER_DEPTH", true, "Enable changing depth in widget picker."); public static final BooleanFlag SHOW_DELIGHTFUL_PAGINATION_FOLDER = new DeviceFlag( "SHOW_DELIGHTFUL_PAGINATION_FOLDER", false,