From 6e379fc78472b0ada5d35afe7188dfa1eaa5a836 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 19 Mar 2020 16:08:14 -0700 Subject: [PATCH] Removing animation when stripping empty pages, as the animation is run by LayoutAnimation already Bug: 151978739 Change-Id: I75b9055c3e862a6813164cce6c1ba7b2fe1f870a --- src/com/android/launcher3/Launcher.java | 32 ++++---- src/com/android/launcher3/Workspace.java | 98 ++++++------------------ 2 files changed, 37 insertions(+), 93 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index a83a694c9c..455eebc125 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -760,8 +760,8 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1) : -1; if (resultCode == RESULT_CANCELED) { completeTwoStageWidgetDrop(RESULT_CANCELED, appWidgetId, requestArgs); - mWorkspace.removeExtraEmptyScreenDelayed(true, exitSpringLoaded, - ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); + mWorkspace.removeExtraEmptyScreenDelayed( + ON_ACTIVITY_RESULT_ANIMATION_DELAY, false, exitSpringLoaded); } else if (resultCode == RESULT_OK) { addAppWidgetImpl( appWidgetId, requestArgs, null, @@ -791,15 +791,9 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, "returned from the widget configuration activity."); result = RESULT_CANCELED; completeTwoStageWidgetDrop(result, appWidgetId, requestArgs); - final Runnable onComplete = new Runnable() { - @Override - public void run() { - getStateManager().goToState(NORMAL); - } - }; - - mWorkspace.removeExtraEmptyScreenDelayed(true, onComplete, - ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); + mWorkspace.removeExtraEmptyScreenDelayed( + ON_ACTIVITY_RESULT_ANIMATION_DELAY, false, + () -> getStateManager().goToState(NORMAL)); } else { if (requestArgs.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { // When the screen id represents an actual screen (as opposed to a rank) @@ -818,8 +812,8 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, dropLayout.setDropPending(false); } }; - mWorkspace.removeExtraEmptyScreenDelayed(true, onComplete, - ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); + mWorkspace.removeExtraEmptyScreenDelayed( + ON_ACTIVITY_RESULT_ANIMATION_DELAY, false, onComplete); } return; } @@ -838,12 +832,12 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, // Handle custom shortcuts created using ACTION_CREATE_SHORTCUT. if (resultCode == RESULT_OK && requestArgs.container != ItemInfo.NO_ID) { completeAdd(requestCode, data, -1, requestArgs); - mWorkspace.removeExtraEmptyScreenDelayed(true, exitSpringLoaded, - ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); + mWorkspace.removeExtraEmptyScreenDelayed( + ON_ACTIVITY_RESULT_ANIMATION_DELAY, false, exitSpringLoaded); } else if (resultCode == RESULT_CANCELED) { - mWorkspace.removeExtraEmptyScreenDelayed(true, exitSpringLoaded, - ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); + mWorkspace.removeExtraEmptyScreenDelayed( + ON_ACTIVITY_RESULT_ANIMATION_DELAY, false, exitSpringLoaded); } } @@ -1682,7 +1676,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, }; completeAddAppWidget(appWidgetId, info, boundWidget, addFlowHandler.getProviderInfo(this)); - mWorkspace.removeExtraEmptyScreenDelayed(true, onComplete, delay, false); + mWorkspace.removeExtraEmptyScreenDelayed(delay, false, onComplete); } } @@ -2112,7 +2106,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } // Remove the extra empty screen - mWorkspace.removeExtraEmptyScreen(false, false); + mWorkspace.removeExtraEmptyScreen(false); } /** diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index c42e480475..2cc5a22c13 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -29,7 +29,6 @@ import static com.android.launcher3.logging.LoggerUtils.newContainerTarget; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.LayoutTransition; -import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.SuppressLint; @@ -125,9 +124,6 @@ public class Workspace extends PagedView private static final boolean ENFORCE_DRAG_EVENT_ORDER = false; - private static final int SNAP_OFF_EMPTY_SCREEN_DURATION = 400; - private static final int FADE_EMPTY_SCREEN_DURATION = 150; - private static final int ADJACENT_SCREEN_DROP_DURATION = 300; private static final int DEFAULT_PAGE = 0; @@ -140,7 +136,6 @@ public class Workspace extends PagedView @Thunk final IntSparseArrayMap mWorkspaceScreens = new IntSparseArrayMap<>(); @Thunk final IntArray mScreenOrder = new IntArray(); - @Thunk Runnable mRemoveEmptyScreenRunnable; @Thunk boolean mDeferRemoveExtraEmptyScreen = false; /** @@ -428,7 +423,7 @@ public class Workspace extends PagedView } if (!mDeferRemoveExtraEmptyScreen) { - removeExtraEmptyScreen(true, mDragSourceInternal != null); + removeExtraEmptyScreen(mDragSourceInternal != null); } updateChildrenLayersEnabled(); @@ -453,8 +448,16 @@ public class Workspace extends PagedView private void setupLayoutTransition() { // We want to show layout transitions when pages are deleted, to close the gap. mLayoutTransition = new LayoutTransition(); + mLayoutTransition.enableTransitionType(LayoutTransition.DISAPPEARING); mLayoutTransition.enableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + // Change the interpolators such that the fade animation plays before the move animation. + // This prevents empty adjacent pages to overlay during animation + mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING, + Interpolators.clampToProgress(Interpolators.ACCEL_DEACCEL, 0, 0.5f)); + mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING, + Interpolators.clampToProgress(Interpolators.ACCEL_DEACCEL, 0.5f, 1)); + mLayoutTransition.disableTransitionType(LayoutTransition.APPEARING); mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_APPEARING); setLayoutTransition(mLayoutTransition); @@ -571,9 +574,6 @@ public class Workspace extends PagedView boolean lastChildOnScreen = false; boolean childOnFinalScreen = false; - // Cancel any pending removal of empty screen - mRemoveEmptyScreenRunnable = null; - if (mDragSourceInternal != null) { if (mDragSourceInternal.getChildCount() == 1) { lastChildOnScreen = true; @@ -624,43 +624,34 @@ public class Workspace extends PagedView } } - public void removeExtraEmptyScreen(final boolean animate, boolean stripEmptyScreens) { - removeExtraEmptyScreenDelayed(animate, null, 0, stripEmptyScreens); + public void removeExtraEmptyScreen(boolean stripEmptyScreens) { + removeExtraEmptyScreenDelayed(0, stripEmptyScreens, null); } - public void removeExtraEmptyScreenDelayed(final boolean animate, final Runnable onComplete, - final int delay, final boolean stripEmptyScreens) { + public void removeExtraEmptyScreenDelayed( + int delay, boolean stripEmptyScreens, Runnable onComplete) { if (mLauncher.isWorkspaceLoading()) { // Don't strip empty screens if the workspace is still loading return; } if (delay > 0) { - postDelayed(new Runnable() { - @Override - public void run() { - removeExtraEmptyScreenDelayed(animate, onComplete, 0, stripEmptyScreens); - } - }, delay); + postDelayed( + () -> removeExtraEmptyScreenDelayed(0, stripEmptyScreens, onComplete), delay); return; } convertFinalScreenToEmptyScreenIfNecessary(); if (hasExtraEmptyScreen()) { - int emptyIndex = mScreenOrder.indexOf(EXTRA_EMPTY_SCREEN_ID); - if (getNextPage() == emptyIndex) { - snapToPage(getNextPage() - 1, SNAP_OFF_EMPTY_SCREEN_DURATION); - fadeAndRemoveEmptyScreen(SNAP_OFF_EMPTY_SCREEN_DURATION, FADE_EMPTY_SCREEN_DURATION, - onComplete, stripEmptyScreens); - } else { - snapToPage(getNextPage(), 0); - fadeAndRemoveEmptyScreen(0, FADE_EMPTY_SCREEN_DURATION, - onComplete, stripEmptyScreens); - } - return; - } else if (stripEmptyScreens) { - // If we're not going to strip the empty screens after removing - // the extra empty screen, do it right away. + removeView(mWorkspaceScreens.get(EXTRA_EMPTY_SCREEN_ID)); + mWorkspaceScreens.remove(EXTRA_EMPTY_SCREEN_ID); + mScreenOrder.removeValue(EXTRA_EMPTY_SCREEN_ID); + + // Update the page indicator to reflect the removed page. + showPageIndicatorAtCurrentScroll(); + } + + if (stripEmptyScreens) { stripEmptyScreens(); } @@ -669,44 +660,6 @@ public class Workspace extends PagedView } } - private void fadeAndRemoveEmptyScreen(int delay, int duration, final Runnable onComplete, - final boolean stripEmptyScreens) { - // XXX: Do we need to update LM workspace screens below? - final CellLayout cl = mWorkspaceScreens.get(EXTRA_EMPTY_SCREEN_ID); - - mRemoveEmptyScreenRunnable = new Runnable() { - @Override - public void run() { - if (hasExtraEmptyScreen()) { - mWorkspaceScreens.remove(EXTRA_EMPTY_SCREEN_ID); - mScreenOrder.removeValue(EXTRA_EMPTY_SCREEN_ID); - removeView(cl); - if (stripEmptyScreens) { - stripEmptyScreens(); - } - // Update the page indicator to reflect the removed page. - showPageIndicatorAtCurrentScroll(); - } - } - }; - - ObjectAnimator oa = ObjectAnimator.ofFloat(cl, ALPHA, 0f); - oa.setDuration(duration); - oa.setStartDelay(delay); - oa.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (mRemoveEmptyScreenRunnable != null) { - mRemoveEmptyScreenRunnable.run(); - } - if (onComplete != null) { - onComplete.run(); - } - } - }); - oa.start(); - } - public boolean hasExtraEmptyScreen() { return mWorkspaceScreens.containsKey(EXTRA_EMPTY_SCREEN_ID) && getChildCount() > 1; } @@ -793,8 +746,6 @@ public class Workspace extends PagedView } } - boolean isInAccessibleDrag = mLauncher.getAccessibilityDelegate().isInAccessibleDrag(); - // We enforce at least one page to add new items to. In the case that we remove the last // such screen, we convert the last screen to the empty screen int minScreens = 1; @@ -813,7 +764,6 @@ public class Workspace extends PagedView removeView(cl); } else { // if this is the last screen, convert it to the empty screen - mRemoveEmptyScreenRunnable = null; mWorkspaceScreens.put(EXTRA_EMPTY_SCREEN_ID, cl); mScreenOrder.add(EXTRA_EMPTY_SCREEN_ID); }