From 2d5e0e067c33d123bec25d7353d2fd5cdd8f5d5a Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 25 Jul 2017 14:13:32 -0700 Subject: [PATCH] All Apps physics polish. With this change, the springs will now animate if your finger is on the RecyclerView while you hit the top/bottom. This covers the case when the user has few apps (ie. the RecyclerView does not scroll very much). Bug: 64041310 Change-Id: Ia72aea05d62a6fb896fdb7df379d6c7abd188d6d --- .../allapps/AllAppsContainerView.java | 31 ------------------- .../allapps/AllAppsRecyclerView.java | 24 +++++++++++++- 2 files changed, 23 insertions(+), 32 deletions(-) diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 20951921c7..0083d47f2a 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -21,7 +21,6 @@ import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.InsetDrawable; import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; import android.text.Selection; import android.text.SpannableStringBuilder; import android.util.AttributeSet; @@ -227,7 +226,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc mAppsRecyclerView.setHasFixedSize(true); if (FeatureFlags.LAUNCHER3_PHYSICS) { mAppsRecyclerView.setSpringAnimationHandler(mSpringAnimationHandler); - mAppsRecyclerView.addOnScrollListener(new SpringMotionOnScrollListener()); } mSearchContainer = findViewById(R.id.search_container_all_apps); @@ -403,33 +401,4 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc public SpringAnimationHandler getSpringAnimationHandler() { return mSpringAnimationHandler; } - - public class SpringMotionOnScrollListener extends RecyclerView.OnScrollListener { - - private int mScrollState = RecyclerView.SCROLL_STATE_IDLE; - - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - if (mScrollState == RecyclerView.SCROLL_STATE_DRAGGING || (dx == 0 && dy == 0)) { - if (mSpringAnimationHandler.isRunning()){ - mSpringAnimationHandler.skipToEnd(); - } - return; - } - - // We only start the spring animation when we fling and hit the top/bottom, to ensure - // that all of the animations start at the same time. - if (dy < 0 && !mAppsRecyclerView.canScrollVertically(-1)) { - mSpringAnimationHandler.animateToFinalPosition(0, 1); - } else if (dy > 0 && !mAppsRecyclerView.canScrollVertically(1)) { - mSpringAnimationHandler.animateToFinalPosition(0, -1); - } - } - - @Override - public void onScrollStateChanged(RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - mScrollState = newState; - } - } } diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index 25144584e1..701402b028 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -103,7 +103,10 @@ public class AllAppsRecyclerView extends BaseRecyclerView implements LogContaine } public void setSpringAnimationHandler(SpringAnimationHandler springAnimationHandler) { - mSpringAnimationHandler = springAnimationHandler; + if (FeatureFlags.LAUNCHER3_PHYSICS) { + mSpringAnimationHandler = springAnimationHandler; + addOnScrollListener(new SpringMotionOnScrollListener()); + } } @Override @@ -485,6 +488,25 @@ public class AllAppsRecyclerView extends BaseRecyclerView implements LogContaine y + mEmptySearchBackground.getIntrinsicHeight()); } + private class SpringMotionOnScrollListener extends RecyclerView.OnScrollListener { + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + if (mOverScrollHelper.isInOverScroll()) { + // OverScroll will handle animating the springs. + return; + } + + // We only start the spring animation when we hit the top/bottom, to ensure + // that all of the animations start at the same time. + if (dy < 0 && !canScrollVertically(-1)) { + mSpringAnimationHandler.animateToFinalPosition(0, 1); + } else if (dy > 0 && !canScrollVertically(1)) { + mSpringAnimationHandler.animateToFinalPosition(0, -1); + } + } + } + private class OverScrollHelper implements VerticalPullDetector.Listener { private static final float MAX_RELEASE_VELOCITY = 5000; // px / s