Add spring to QSB when opening all apps.

Bug: 64355491
Change-Id: I760856a32779b314c8b01ef2c051985e18b68ecb
This commit is contained in:
Jon Miranda
2017-08-23 13:19:24 -07:00
parent 86ba394ad0
commit c90a89d997
5 changed files with 63 additions and 6 deletions
@@ -448,9 +448,20 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
row = Math.abs(numTotalRows - row);
}
// We manipulate the stiffness, min, and max values based on the items distance to the
// first row and the items distance to the center column to create the ^-shaped motion
// effect.
calculateSpringValues(spring, row, col);
}
@Override
public void setDefaultValues(SpringAnimation spring) {
calculateSpringValues(spring, 0, mAppsPerRow / 2);
}
/**
* We manipulate the stiffness, min, and max values based on the items distance to the
* first row and the items distance to the center column to create the ^-shaped motion
* effect.
*/
private void calculateSpringValues(SpringAnimation spring, int row, int col) {
float rowFactor = (1 + row) * 0.5f;
float colFactor = getColumnFactor(col, mAppsPerRow);
@@ -7,6 +7,7 @@ import android.animation.AnimatorSet;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.graphics.Color;
import android.support.animation.SpringAnimation;
import android.support.v4.graphics.ColorUtils;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.view.MotionEvent;
@@ -101,6 +102,7 @@ public class AllAppsTransitionController implements TouchController, SwipeDetect
private AnimatorSet mDiscoBounceAnimation;
private GradientView mGradientView;
private SpringAnimation mSearchSpring;
private SpringAnimationHandler mSpringAnimationHandler;
public AllAppsTransitionController(Launcher l) {
@@ -226,6 +228,7 @@ public class AllAppsTransitionController implements TouchController, SwipeDetect
}
mLauncher.showAppsView(true /* animated */, false /* updatePredictedApps */);
if (hasSpringAnimationHandler()) {
mSpringAnimationHandler.add(mSearchSpring, true /* setDefaultValues */);
// The icons are moving upwards, so we go to 0 from 1. (y-axis 1 is below 0.)
mSpringAnimationHandler.animateToFinalPosition(0 /* pos */, 1 /* startValue */);
}
@@ -499,6 +502,7 @@ public class AllAppsTransitionController implements TouchController, SwipeDetect
public void finishPullUp() {
mHotseat.setVisibility(View.INVISIBLE);
if (hasSpringAnimationHandler()) {
mSpringAnimationHandler.remove(mSearchSpring);
mSpringAnimationHandler.reset();
}
setProgress(0f);
@@ -544,6 +548,7 @@ public class AllAppsTransitionController implements TouchController, SwipeDetect
mWorkspace.getPageIndicator().getCaretDrawable(), mLauncher);
mAppsView.getSearchUiManager().addOnScrollRangeChangeListener(this);
mSpringAnimationHandler = mAppsView.getSpringAnimationHandler();
mSearchSpring = mAppsView.getSearchUiManager().getSpringForFling();
}
private boolean hasSpringAnimationHandler() {
@@ -15,6 +15,8 @@
*/
package com.android.launcher3.allapps;
import android.support.animation.SpringAnimation;
import android.support.annotation.NonNull;
import android.view.KeyEvent;
/**
@@ -27,6 +29,11 @@ public interface SearchUiManager {
*/
void initialize(AlphabeticalAppsList appsList, AllAppsRecyclerView recyclerView);
/**
* A {@link SpringAnimation} that will be used when the user flings.
*/
@NonNull SpringAnimation getSpringForFling();
/**
* Notifies the search manager that the apps-list has changed and the search UI should be
* updated accordingly.
@@ -17,6 +17,9 @@ package com.android.launcher3.allapps.search;
import android.content.Context;
import android.graphics.Rect;
import android.support.animation.FloatValueHolder;
import android.support.animation.SpringAnimation;
import android.support.animation.SpringForce;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.Selection;
@@ -62,6 +65,8 @@ public class AppsSearchContainerLayout extends FrameLayout
private View mDivider;
private HeaderElevationController mElevationController;
private SpringAnimation mSpring;
public AppsSearchContainerLayout(Context context) {
this(context, null);
}
@@ -81,6 +86,9 @@ public class AppsSearchContainerLayout extends FrameLayout
mSearchQueryBuilder = new SpannableStringBuilder();
Selection.setSelection(mSearchQueryBuilder, 0);
// Note: This spring does nothing.
mSpring = new SpringAnimation(new FloatValueHolder()).setSpring(new SpringForce(0));
}
@Override
@@ -126,6 +134,11 @@ public class AppsSearchContainerLayout extends FrameLayout
new DefaultAppSearchAlgorithm(appsList.getApps()), mSearchInput, mLauncher, this);
}
@Override
public @NonNull SpringAnimation getSpringForFling() {
return mSpring;
}
@Override
public void refreshSearchResult() {
mSearchBarController.refreshSearchResult();
@@ -69,6 +69,20 @@ public class SpringAnimationHandler<T> {
mAnimationFactory = factory;
}
/**
* Adds a spring to the list of springs handled by this class.
* @param spring The new spring to be added.
* @param setDefaultValues If True, sets the spring to the default
* {@link AnimationFactory} values.
*/
public void add(SpringAnimation spring, boolean setDefaultValues) {
if (setDefaultValues) {
mAnimationFactory.setDefaultValues(spring);
}
spring.setStartVelocity(mCurrentVelocity);
mAnimations.add(spring);
}
/**
* Adds a new or recycled animation to the list of springs handled by this class.
*
@@ -82,15 +96,17 @@ public class SpringAnimationHandler<T> {
view.setTag(R.id.spring_animation_tag, spring);
}
mAnimationFactory.update(spring, object);
spring.setStartVelocity(mCurrentVelocity);
mAnimations.add(spring);
add(spring, false /* setDefaultValues */);
}
/**
* Stops and removes the spring attached to {@param view}.
*/
public void remove(View view) {
SpringAnimation animation = (SpringAnimation) view.getTag(R.id.spring_animation_tag);
remove((SpringAnimation) view.getTag(R.id.spring_animation_tag));
}
public void remove(SpringAnimation animation) {
if (animation.canSkipToEnd()) {
animation.skipToEnd();
}
@@ -226,6 +242,11 @@ public class SpringAnimationHandler<T> {
* Updates the value of {@param spring} based on {@param object}.
*/
void update(SpringAnimation spring, T object);
/**
* Sets the factory default values for the given {@param spring}.
*/
void setDefaultValues(SpringAnimation spring);
}
/**