Makes spring variable dynamic resources so that they can be changed via plugin
Bug: 147302669
Change-Id: Ia4e74ff46a4d8338a56ea75ed826b69102c42d93
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/FallbackSwipeHandler.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/FallbackSwipeHandler.java
index 4179080..65fba08 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/FallbackSwipeHandler.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/FallbackSwipeHandler.java
@@ -420,7 +420,7 @@
this::createNewInputProxyHandler);
RectFSpringAnim anim = createWindowAnimationToHome(mCurrentShift.value, duration);
anim.addAnimatorListener(endListener);
- anim.start(mEndVelocityPxPerMs);
+ anim.start(mContext, mEndVelocityPxPerMs);
mFinishAnimation = RunningWindowAnim.wrap(anim);
} else {
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java
index de90e0b..3807e45 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java
@@ -64,7 +64,6 @@
import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.logging.UserEventDispatcher;
-import com.android.launcher3.model.PagedViewOrientedState;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
@@ -942,7 +941,7 @@
}
});
getOrientationHandler().adjustFloatingIconStartVelocity(velocityPxPerMs);
- windowAnim.start(velocityPxPerMs);
+ windowAnim.start(mContext, velocityPxPerMs);
homeAnimFactory.playAtomicAnimation(velocityPxPerMs.y);
mRunningWindowAnim = RunningWindowAnim.wrap(windowAnim);
mLauncherTransitionController = null;
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/RectFSpringAnim.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/RectFSpringAnim.java
index a59c99c..682c92c 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/RectFSpringAnim.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/RectFSpringAnim.java
@@ -16,6 +16,7 @@
package com.android.quickstep.util;
import android.animation.Animator;
+import android.content.Context;
import android.content.res.Resources;
import android.graphics.PointF;
import android.graphics.RectF;
@@ -28,6 +29,8 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.FlingSpringAnim;
+import com.android.launcher3.util.DynamicResource;
+import com.android.systemui.plugins.ResourceProvider;
import java.util.ArrayList;
import java.util.List;
@@ -137,7 +140,12 @@
mAnimatorListeners.add(animatorListener);
}
- public void start(PointF velocityPxPerMs) {
+ /**
+ * Starts the fling/spring animation.
+ * @param context The activity context.
+ * @param velocityPxPerMs Velocity of swipe in px/ms.
+ */
+ public void start(Context context, PointF velocityPxPerMs) {
// Only tell caller that we ended if both x and y animations have ended.
OnAnimationEndListener onXEndListener = ((animation, canceled, centerX, velocityX) -> {
mRectXAnimEnded = true;
@@ -166,10 +174,14 @@
mMinVisChange, minYValue, maxYValue, springVelocityFactor, onYEndListener);
float minVisibleChange = Math.abs(1f / mStartRect.height());
+ ResourceProvider rp = DynamicResource.provider(context);
+ float damping = rp.getFloat(R.dimen.swipe_up_rect_damping_ratio);
+ float stiffness = rp.getFloat(R.dimen.swipe_up_rect_stiffness);
+
mRectScaleAnim = new SpringAnimation(this, RECT_SCALE_PROGRESS)
.setSpring(new SpringForce(1f)
- .setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY)
- .setStiffness(SpringForce.STIFFNESS_LOW))
+ .setDampingRatio(damping)
+ .setStiffness(stiffness))
.setStartVelocity(velocityPxPerMs.y * minVisibleChange)
.setMaxValue(1f)
.setMinimumVisibleChange(minVisibleChange)
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java
index babf13e..d2805ed 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java
@@ -41,7 +41,9 @@
import com.android.launcher3.anim.PropertySetter;
import com.android.launcher3.anim.SpringAnimationBuilder;
import com.android.launcher3.graphics.OverviewScrim;
+import com.android.launcher3.util.DynamicResource;
import com.android.quickstep.views.RecentsView;
+import com.android.systemui.plugins.ResourceProvider;
/**
* Creates an animation where all the workspace items are moved into their final location,
@@ -55,9 +57,6 @@
private static final float MAX_VELOCITY_PX_PER_S = 22f;
- private static final float DAMPING_RATIO = 0.7f;
- private static final float STIFFNESS = 150f;
-
private final float mVelocity;
private final float mSpringTransY;
@@ -177,9 +176,12 @@
v.setTranslationY(mSpringTransY);
+ ResourceProvider rp = DynamicResource.provider(v.getContext());
+ float stiffness = rp.getFloat(R.dimen.staggered_stiffness);
+ float damping = rp.getFloat(R.dimen.staggered_damping_ratio);
ObjectAnimator springTransY = new SpringAnimationBuilder<>(v, VIEW_TRANSLATE_Y)
- .setStiffness(STIFFNESS)
- .setDampingRatio(DAMPING_RATIO)
+ .setStiffness(stiffness)
+ .setDampingRatio(damping)
.setMinimumVisibleChange(1f)
.setEndValue(0)
.setStartVelocity(mVelocity)
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java
index 4bd1215..55b095f 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java
@@ -80,7 +80,6 @@
import android.widget.ListView;
import androidx.annotation.Nullable;
-import androidx.dynamicanimation.animation.SpringForce;
import com.android.launcher3.BaseActivity;
import com.android.launcher3.DeviceProfile;
@@ -103,6 +102,7 @@
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
import com.android.launcher3.util.ComponentKey;
+import com.android.launcher3.util.DynamicResource;
import com.android.launcher3.util.OverScroller;
import com.android.launcher3.util.PendingAnimation;
import com.android.launcher3.util.Themes;
@@ -117,6 +117,7 @@
import com.android.quickstep.ViewUtils;
import com.android.quickstep.util.AppWindowAnimationHelper;
import com.android.quickstep.util.LayoutUtils;
+import com.android.systemui.plugins.ResourceProvider;
import com.android.systemui.shared.recents.IPinnedStackAnimationListener;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData;
@@ -1199,10 +1200,14 @@
int secondaryTaskDimension = mOrientationHandler.getSecondaryDimension(taskView);
int verticalFactor = mOrientationHandler.getTaskDismissDirectionFactor();
if (UNSTABLE_SPRINGS.get() && taskView instanceof TaskView) {
+ ResourceProvider rp = DynamicResource.provider(mActivity);
+ float dampingRatio = rp.getFloat(R.dimen.dismiss_task_trans_y_damping_ratio);
+ float stiffness = rp.getFloat(R.dimen.dismiss_task_trans_y_stiffness);
+
addAnim(new SpringObjectAnimator<>(taskView, secondaryViewTranslate,
- MIN_VISIBLE_CHANGE_PIXELS, SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY,
- SpringForce.STIFFNESS_MEDIUM, 0, verticalFactor * secondaryTaskDimension),
- duration, LINEAR, anim);
+ MIN_VISIBLE_CHANGE_PIXELS, dampingRatio,
+ stiffness, 0, verticalFactor * secondaryTaskDimension),
+ duration, LINEAR, anim);
} else {
addAnim(ObjectAnimator.ofFloat(taskView, secondaryViewTranslate,
verticalFactor * secondaryTaskDimension), duration, LINEAR, anim);
@@ -1276,10 +1281,13 @@
int scrollDiff = newScroll[i] - oldScroll[i] + offset;
if (scrollDiff != 0) {
if (UNSTABLE_SPRINGS.get() && child instanceof TaskView) {
+ ResourceProvider rp = DynamicResource.provider(mActivity);
+ float damping = rp.getFloat(R.dimen.dismiss_task_trans_x_damping_ratio);
+ float stiffness = rp.getFloat(R.dimen.dismiss_task_trans_x_stiffness);
+
addAnim(new SpringObjectAnimator<>(child, VIEW_TRANSLATE_X,
- MIN_VISIBLE_CHANGE_PIXELS, SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY,
- SpringForce.STIFFNESS_MEDIUM,
- 0, scrollDiff), duration, ACCEL, anim);
+ MIN_VISIBLE_CHANGE_PIXELS, damping,
+ stiffness, 0, scrollDiff), duration, ACCEL, anim);
} else {
Property translationProperty = mOrientationHandler.getPrimaryViewTranslate();
addAnim(ObjectAnimator.ofFloat(child, translationProperty, scrollDiff),
diff --git a/res/values/config.xml b/res/values/config.xml
index 8aff6da..35e5e6d 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -121,5 +121,41 @@
<bool name="config_enableTaskSnapshotPreloading">true</bool>
<!-- Configuration resources -->
- <array name="dynamic_resources"> </array>
+ <item name="all_apps_spring_damping_ratio" type="dimen" format="float">0.75</item>
+ <item name="all_apps_spring_stiffness" type="dimen" format="float">600</item>
+
+ <item name="dismiss_task_trans_y_damping_ratio" type="dimen" format="float">0.5</item>
+ <item name="dismiss_task_trans_y_stiffness" type="dimen" format="float">1500</item>
+
+ <item name="dismiss_task_trans_x_damping_ratio" type="dimen" format="float">0.5</item>
+ <item name="dismiss_task_trans_x_stiffness" type="dimen" format="float">1500</item>
+
+ <item name="horizontal_spring_damping_ratio" type="dimen" format="float">0.75</item>
+ <item name="horizontal_spring_stiffness" type="dimen" format="float">200</item>
+
+ <item name="swipe_up_rect_damping_ratio" type="dimen" format="float">0.75</item>
+ <item name="swipe_up_rect_stiffness" type="dimen" format="float">200</item>
+
+ <item name="staggered_damping_ratio" type="dimen" format="float">0.7</item>
+ <item name="staggered_stiffness" type="dimen" format="float">150</item>
+
+ <array name="dynamic_resources">
+ <item>@dimen/all_apps_spring_damping_ratio</item>
+ <item>@dimen/all_apps_spring_stiffness</item>
+
+ <item>@dimen/dismiss_task_trans_y_damping_ratio</item>
+ <item>@dimen/dismiss_task_trans_y_stiffness</item>
+
+ <item>@dimen/dismiss_task_trans_x_damping_ratio</item>
+ <item>@dimen/dismiss_task_trans_x_stiffness</item>
+
+ <item>@dimen/horizontal_spring_damping_ratio</item>
+ <item>@dimen/horizontal_spring_stiffness</item>
+
+ <item>@dimen/swipe_up_rect_damping_ratio</item>
+ <item>@dimen/swipe_up_rect_stiffness</item>
+
+ <item>@dimen/staggered_damping_ratio</item>
+ <item>@dimen/staggered_stiffness</item>
+ </array>
</resources>
diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
index e49ff30..2179162 100644
--- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -32,8 +32,10 @@
import com.android.launcher3.anim.AnimatorSetBuilder;
import com.android.launcher3.anim.PropertySetter;
import com.android.launcher3.anim.SpringObjectAnimator;
+import com.android.launcher3.util.DynamicResource;
import com.android.launcher3.util.Themes;
import com.android.launcher3.views.ScrimView;
+import com.android.systemui.plugins.ResourceProvider;
/**
* Handles AllApps view transition.
@@ -47,9 +49,6 @@
*/
public class AllAppsTransitionController implements StateHandler, OnDeviceProfileChangeListener {
- private static final float SPRING_DAMPING_RATIO = 0.75f;
- private static final float SPRING_STIFFNESS = 600f;
-
public static final FloatProperty<AllAppsTransitionController> ALL_APPS_PROGRESS =
new FloatProperty<AllAppsTransitionController>("allAppsProgress") {
@@ -187,8 +186,12 @@
public Animator createSpringAnimation(float... progressValues) {
if (UNSTABLE_SPRINGS.get()) {
+ ResourceProvider rp = DynamicResource.provider(mLauncher);
+ float damping = rp.getFloat(R.dimen.all_apps_spring_damping_ratio);
+ float stiffness = rp.getFloat(R.dimen.all_apps_spring_stiffness);
+
return new SpringObjectAnimator<>(this, ALL_APPS_PROGRESS, 1f / mShiftRange,
- SPRING_DAMPING_RATIO, SPRING_STIFFNESS, progressValues);
+ damping, stiffness, progressValues);
}
return ObjectAnimator.ofFloat(this, ALL_APPS_PROGRESS, progressValues);
}
diff --git a/src/com/android/launcher3/util/DynamicResource.java b/src/com/android/launcher3/util/DynamicResource.java
index 8a75767..e6ee186 100644
--- a/src/com/android/launcher3/util/DynamicResource.java
+++ b/src/com/android/launcher3/util/DynamicResource.java
@@ -69,6 +69,11 @@
}
@Override
+ public float getFloat(@DimenRes int resId) {
+ return mContext.getResources().getFloat(resId);
+ }
+
+ @Override
public void onPluginConnected(ResourceProvider plugin, Context context) {
mPlugin = plugin;
}
diff --git a/src/com/android/launcher3/util/OverScroller.java b/src/com/android/launcher3/util/OverScroller.java
index fc8a138..3c398b8 100644
--- a/src/com/android/launcher3/util/OverScroller.java
+++ b/src/com/android/launcher3/util/OverScroller.java
@@ -26,11 +26,13 @@
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
-import androidx.dynamicanimation.animation.DynamicAnimation;
import androidx.dynamicanimation.animation.FloatPropertyCompat;
import androidx.dynamicanimation.animation.SpringAnimation;
import androidx.dynamicanimation.animation.SpringForce;
+import com.android.launcher3.R;
+import com.android.systemui.plugins.ResourceProvider;
+
/**
* Based on {@link android.widget.OverScroller} supporting only 1-d scrolling and with more
* customization options.
@@ -425,6 +427,7 @@
// Current state of the animation.
private int mState = SPLINE;
+ private Context mContext;
private SpringAnimation mSpring;
// Constant gravity value, used in the deceleration phase.
@@ -500,6 +503,7 @@
}
SplineOverScroller(Context context) {
+ mContext = context;
mFinished = true;
final float ppi = context.getResources().getDisplayMetrics().density * 160.0f;
mPhysicalCoeff = SensorManager.GRAVITY_EARTH // g (m/s^2)
@@ -560,9 +564,12 @@
}
mSpring = new SpringAnimation(this, SPRING_PROPERTY);
+ ResourceProvider rp = DynamicResource.provider(mContext);
+ float stiffness = rp.getFloat(R.dimen.horizontal_spring_stiffness);
+ float damping = rp.getFloat(R.dimen.horizontal_spring_damping_ratio);
mSpring.setSpring(new SpringForce(mFinal)
- .setStiffness(SpringForce.STIFFNESS_LOW)
- .setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY));
+ .setStiffness(stiffness)
+ .setDampingRatio(damping));
mSpring.setStartVelocity(velocity);
mSpring.animateToFinalPosition(mFinal);
mSpring.addEndListener((animation, canceled, value, velocity1) -> {
diff --git a/src_plugins/com/android/systemui/plugins/ResourceProvider.java b/src_plugins/com/android/systemui/plugins/ResourceProvider.java
index eaed9e7..d1767a0 100644
--- a/src_plugins/com/android/systemui/plugins/ResourceProvider.java
+++ b/src_plugins/com/android/systemui/plugins/ResourceProvider.java
@@ -44,4 +44,9 @@
* @see android.content.res.Resources#getColor(int)
*/
int getColor(int resId);
+
+ /**
+ * @see android.content.res.Resources#getFloat(int)
+ */
+ float getFloat(int resId);
}