diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index f166833aa1..4e7a8843a3 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2325,6 +2325,7 @@ public class Launcher extends StatefulActivity @Override public void bindScreens(IntArray orderedScreenIds) { + mWorkspace.mPageIndicator.setAreScreensBinding(true); int firstScreenPosition = 0; if (FeatureFlags.QSB_ON_FIRST_SCREEN && orderedScreenIds.indexOf(Workspace.FIRST_SCREEN_ID) != firstScreenPosition) { @@ -2822,8 +2823,8 @@ public class Launcher extends StatefulActivity getViewCache().setCacheSize(R.layout.folder_page, 2); TraceHelper.INSTANCE.endSection(); - - mWorkspace.removeExtraEmptyScreen(true); + mWorkspace.removeExtraEmptyScreen(/* stripEmptyScreens= */ true); + mWorkspace.mPageIndicator.setAreScreensBinding(false); } private boolean canAnimatePageChange() { diff --git a/src/com/android/launcher3/pageindicators/PageIndicator.java b/src/com/android/launcher3/pageindicators/PageIndicator.java index 570d6ff267..4ab20373b4 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicator.java +++ b/src/com/android/launcher3/pageindicators/PageIndicator.java @@ -26,6 +26,14 @@ public interface PageIndicator { void setMarkersCount(int numMarkers); + /** + * Sets flag to indicate when the screens are in the process of binding so that we don't animate + * during that period. + */ + default void setAreScreensBinding(boolean areScreensBinding) { + // No-op by default + } + /** * Sets the flag if the Page Indicator should autohide. */ diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java index 073e5234f9..ce71275001 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java @@ -130,6 +130,7 @@ public class PageIndicatorDots extends View implements Insettable, PageIndicator */ private float mCurrentPosition; private float mFinalPosition; + private boolean mAreScreensBinding; private ObjectAnimator mAnimator; private @Nullable ObjectAnimator mAlphaAnimator; @@ -163,7 +164,7 @@ public class PageIndicatorDots extends View implements Insettable, PageIndicator @Override public void setScroll(int currentScroll, int totalScroll) { - if (SHOW_DOT_PAGINATION.get() && mActivePage != 0 && currentScroll == 0) { + if (SHOW_DOT_PAGINATION.get() && currentScroll == 0 && totalScroll == 0) { CURRENT_POSITION.set(this, (float) mActivePage); return; } @@ -172,6 +173,11 @@ public class PageIndicatorDots extends View implements Insettable, PageIndicator return; } + // Skip scroll update during binding. We will update it when binding completes. + if (mAreScreensBinding) { + return; + } + if (mShouldAutoHide) { animatePaginationToAlpha(VISIBLE_ALPHA); } @@ -358,6 +364,16 @@ public class PageIndicatorDots extends View implements Insettable, PageIndicator requestLayout(); } + @Override + public void setAreScreensBinding(boolean areScreensBinding) { + // Reapply correct current position which was skipped during setScroll. + if (mAreScreensBinding && !areScreensBinding) { + CURRENT_POSITION.set(this, (float) mActivePage); + } + + mAreScreensBinding = areScreensBinding; + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Add extra spacing of mDotRadius on all sides so than entry animation could be run.