Makes spring variable dynamic resources so that they can be changed via plugin

Bug: 147302669
Change-Id: Ia4e74ff46a4d8338a56ea75ed826b69102c42d93
This commit is contained in:
Jon Miranda
2020-03-02 13:18:55 -08:00
parent acaf0749b3
commit 7edcd7803f
10 changed files with 103 additions and 26 deletions

View File

@@ -420,7 +420,7 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
this::createNewInputProxyHandler);
RectFSpringAnim anim = createWindowAnimationToHome(mCurrentShift.value, duration);
anim.addAnimatorListener(endListener);
anim.start(mEndVelocityPxPerMs);
anim.start(mContext, mEndVelocityPxPerMs);
mFinishAnimation = RunningWindowAnim.wrap(anim);
} else {

View File

@@ -64,7 +64,6 @@ import com.android.launcher3.anim.AnimationSuccessListener;
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 @@ public class LauncherSwipeHandler<T extends BaseDraggingActivity>
}
});
getOrientationHandler().adjustFloatingIconStartVelocity(velocityPxPerMs);
windowAnim.start(velocityPxPerMs);
windowAnim.start(mContext, velocityPxPerMs);
homeAnimFactory.playAtomicAnimation(velocityPxPerMs.y);
mRunningWindowAnim = RunningWindowAnim.wrap(windowAnim);
mLauncherTransitionController = null;

View File

@@ -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 androidx.dynamicanimation.animation.SpringForce;
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 @@ public class RectFSpringAnim {
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 @@ public class RectFSpringAnim {
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)

View File

@@ -41,7 +41,9 @@ import com.android.launcher3.anim.AnimatorSetBuilder;
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 @@ public class StaggeredWorkspaceAnim {
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 @@ public class StaggeredWorkspaceAnim {
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)

View File

@@ -80,7 +80,6 @@ import android.view.animation.Interpolator;
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;
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.TaskUtils;
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 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
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 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
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),

View File

@@ -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>

View File

@@ -32,8 +32,10 @@ import com.android.launcher3.anim.AnimationSuccessListener;
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 @@ import com.android.launcher3.views.ScrimView;
*/
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 class AllAppsTransitionController implements StateHandler, OnDeviceProfil
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);
}

View File

@@ -68,6 +68,11 @@ public class DynamicResource implements ResourceProvider, PluginListener<Resourc
return mContext.getResources().getColor(resId, null);
}
@Override
public float getFloat(@DimenRes int resId) {
return mContext.getResources().getFloat(resId);
}
@Override
public void onPluginConnected(ResourceProvider plugin, Context context) {
mPlugin = plugin;

View File

@@ -26,11 +26,13 @@ import android.view.ViewConfiguration;
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 @@ public class OverScroller {
// 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 @@ public class OverScroller {
}
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 @@ public class OverScroller {
}
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) -> {

View File

@@ -44,4 +44,9 @@ public interface ResourceProvider extends Plugin {
* @see android.content.res.Resources#getColor(int)
*/
int getColor(int resId);
/**
* @see android.content.res.Resources#getFloat(int)
*/
float getFloat(int resId);
}