diff --git a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java index 5dcf84c249..67ed5fb5e5 100644 --- a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java +++ b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionController.java @@ -17,7 +17,6 @@ package com.android.launcher3.hybridhotseat; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.LauncherState.NORMAL; -import static com.android.launcher3.anim.AnimatorListeners.forSuccessCallback; import static com.android.launcher3.hybridhotseat.HotseatEduController.getSettingsIntent; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_HOTSEAT_PREDICTION_PINNED; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_HOTSEAT_RANKED; @@ -151,7 +150,7 @@ public class HotseatPredictionController implements DragController.DragListener, * Shows appropriate hotseat education based on prediction enabled and migration states. */ public void showEdu() { - mLauncher.getStateManager().goToState(NORMAL, true, forSuccessCallback(() -> { + mLauncher.getStateManager().goToState(NORMAL, true, () -> { if (mPredictedItems.isEmpty()) { // launcher has empty predictions set Snackbar.show(mLauncher, R.string.hotsaet_tip_prediction_disabled, @@ -166,7 +165,7 @@ public class HotseatPredictionController implements DragController.DragListener, .collect(Collectors.toList())); eduController.showEdu(); } - })); + }); } /** @@ -256,8 +255,8 @@ public class HotseatPredictionController implements DragController.DragListener, } } if (animate) { - animationSet.addListener( - forSuccessCallback(this::removeOutlineDrawings)); + animationSet.addListener(AnimationSuccessListener + .forRunnable(this::removeOutlineDrawings)); animationSet.start(); } else { removeOutlineDrawings(); diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java index 996d36aadc..0652d48c11 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java @@ -35,7 +35,7 @@ import androidx.annotation.NonNull; import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.LauncherState; -import com.android.launcher3.anim.AnimatorListeners; +import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.states.StateAnimationConfig; @@ -78,7 +78,7 @@ public final class RecentsViewStateController extends mRecentsView.updateEmptyMessage(); } else { builder.addListener( - AnimatorListeners.forSuccessCallback(mRecentsView::resetTaskVisuals)); + AnimationSuccessListener.forRunnable(mRecentsView::resetTaskVisuals)); } // Create or dismiss split screen select animations diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java index 19d1b32a1b..b8caf81f14 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java @@ -22,7 +22,6 @@ import static com.android.launcher3.LauncherAnimUtils.newCancelListener; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; -import static com.android.launcher3.anim.AnimatorListeners.forEndCallback; import static com.android.launcher3.anim.Interpolators.DEACCEL_3; import static com.android.launcher3.config.FeatureFlags.ENABLE_ALL_APPS_EDU; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_HOME_GESTURE; @@ -39,7 +38,7 @@ import com.android.launcher3.LauncherState; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.allapps.AllAppsTransitionController; -import com.android.launcher3.anim.AnimatorListeners; +import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.anim.PendingAnimation; @@ -200,7 +199,7 @@ public class NavBarToHomeTouchController implements TouchController, .animateWithVelocity(velocity); } else { mLauncher.getStateManager().goToState(mEndState, true, - forEndCallback(() -> onSwipeInteractionCompleted(mEndState))); + () -> onSwipeInteractionCompleted(mEndState)); } if (mStartState != mEndState) { logHomeGesture(); @@ -215,7 +214,7 @@ public class NavBarToHomeTouchController implements TouchController, // Quickly return to the state we came from (we didn't move far). ValueAnimator anim = mCurrentAnimation.getAnimationPlayer(); anim.setFloatValues(progress, 0); - anim.addListener(AnimatorListeners.forSuccessCallback( + anim.addListener(AnimationSuccessListener.forRunnable( () -> onSwipeInteractionCompleted(mStartState))); anim.setDuration(80).start(); } diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java index eb62110065..729e2cb5c6 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java @@ -22,7 +22,6 @@ import static com.android.launcher3.LauncherState.HINT_STATE; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.Utilities.EDGE_NAV_BAR; -import static com.android.launcher3.anim.AnimatorListeners.forSuccessCallback; import static com.android.launcher3.anim.Interpolators.ACCEL_DEACCEL; import static com.android.launcher3.util.VibratorWrapper.OVERVIEW_HAPTIC; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; @@ -173,13 +172,13 @@ public class NoButtonNavbarToOverviewTouchController extends PortraitStatesTouch } mNormalToHintOverviewScrimAnimator = null; mCurrentAnimation.getTarget().addListener(newCancelListener(() -> - mLauncher.getStateManager().goToState(OVERVIEW, true, forSuccessCallback(() -> { + mLauncher.getStateManager().goToState(OVERVIEW, true, () -> { mOverviewResistYAnim = AnimatorControllerWithResistance .createRecentsResistanceFromOverviewAnim(mLauncher, null) .createPlaybackController(); mReachedOverview = true; maybeSwipeInteractionToOverviewComplete(); - })))); + }))); mCurrentAnimation.getTarget().removeListener(mClearStateOnCancelListener); mCurrentAnimation.dispatchOnCancel(); diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java index 62687c5f35..0f64abca61 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java @@ -21,7 +21,6 @@ import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.LauncherState.OVERVIEW_ACTIONS; import static com.android.launcher3.LauncherState.QUICK_SWITCH; import static com.android.launcher3.anim.AlphaUpdateListener.ALPHA_CUTOFF_THRESHOLD; -import static com.android.launcher3.anim.AnimatorListeners.forEndCallback; import static com.android.launcher3.anim.Interpolators.ACCEL_0_75; import static com.android.launcher3.anim.Interpolators.DEACCEL_3; import static com.android.launcher3.anim.Interpolators.LINEAR; @@ -419,7 +418,7 @@ public class NoButtonQuickSwitchTouchController implements TouchController, targetState.ordinal > mStartState.ordinal ? LAUNCHER_UNKNOWN_SWIPEUP : LAUNCHER_UNKNOWN_SWIPEDOWN)); - mLauncher.getStateManager().goToState(targetState, false, forEndCallback(this::clearState)); + mLauncher.getStateManager().goToState(targetState, false, this::clearState); } private void cancelAnimations() { diff --git a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java index 5217c3b169..1ca4fd7fd1 100644 --- a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java +++ b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java @@ -19,7 +19,6 @@ import static com.android.launcher3.LauncherState.BACKGROUND_APP; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.LauncherState.QUICK_SWITCH; -import static com.android.launcher3.anim.AnimatorListeners.forEndCallback; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING; @@ -198,8 +197,7 @@ public final class LauncherActivityInterface extends closeOverlay(); launcher.getStateManager().goToState(OVERVIEW, - launcher.getStateManager().shouldAnimateStateChange(), - onCompleteCallback == null ? null : forEndCallback(onCompleteCallback)); + launcher.getStateManager().shouldAnimateStateChange(), onCompleteCallback); return true; } diff --git a/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java index 66e04008f6..1aa64fae1c 100644 --- a/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java @@ -43,7 +43,7 @@ import androidx.annotation.Nullable; import com.android.launcher3.DeviceProfile; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.Utilities; -import com.android.launcher3.anim.AnimatorListeners; +import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.PendingAnimation; import com.android.quickstep.AnimatedFloat; @@ -156,7 +156,7 @@ abstract class SwipeUpGestureTutorialController extends TutorialController { fadeAnim.setViewAlpha(mFakePreviousTaskView, 0, ACCEL); } if (onEndRunnable != null) { - fadeAnim.addListener(AnimatorListeners.forSuccessCallback(onEndRunnable)); + fadeAnim.addListener(AnimationSuccessListener.forRunnable(onEndRunnable)); } AnimatorSet animset = fadeAnim.buildAnim(); animset.setStartDelay(100); @@ -174,7 +174,7 @@ abstract class SwipeUpGestureTutorialController extends TutorialController { anim.setViewAlpha(mFakePreviousTaskView, 0, ACCEL); } if (onEndRunnable != null) { - anim.addListener(AnimatorListeners.forSuccessCallback(onEndRunnable)); + anim.addListener(AnimationSuccessListener.forRunnable(onEndRunnable)); } } AnimatorSet animset = anim.buildAnim(); @@ -205,10 +205,10 @@ abstract class SwipeUpGestureTutorialController extends TutorialController { PendingAnimation fadeAnim = new PendingAnimation(300); fadeAnim.setViewAlpha(mFakeIconView, 0, ACCEL); if (onEndRunnable != null) { - fadeAnim.addListener(AnimatorListeners.forSuccessCallback(onEndRunnable)); + fadeAnim.addListener(AnimationSuccessListener.forRunnable(onEndRunnable)); } AnimatorSet animset = fadeAnim.buildAnim(); - rectAnim.addAnimatorListener(AnimatorListeners.forSuccessCallback(animset::start)); + rectAnim.addAnimatorListener(AnimationSuccessListener.forRunnable(animset::start)); mRunningWindowAnim = RunningWindowAnim.wrap(rectAnim); } diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialController.java b/quickstep/src/com/android/quickstep/interaction/TutorialController.java index f9d5c94375..e86062c643 100644 --- a/quickstep/src/com/android/quickstep/interaction/TutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/TutorialController.java @@ -38,7 +38,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.content.res.AppCompatResources; import com.android.launcher3.R; -import com.android.launcher3.anim.AnimatorListeners; +import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.views.ClipIconView; import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureAttemptCallback; import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureAttemptCallback; @@ -141,7 +141,7 @@ abstract class TutorialController implements BackGestureAttemptCallback, } void fadeTaskViewAndRun(Runnable r) { - mFakeTaskView.animate().alpha(0).setListener(AnimatorListeners.forSuccessCallback(r)); + mFakeTaskView.animate().alpha(0).setListener(AnimationSuccessListener.forRunnable(r)); } @StringRes @@ -359,8 +359,8 @@ abstract class TutorialController implements BackGestureAttemptCallback, mContext, getMockLauncherResId())); mFakeTaskView.setBackground(AppCompatResources.getDrawable( mContext, getMockAppTaskThumbnailResId())); - mFakeTaskView.animate().alpha(1).setListener( - AnimatorListeners.forSuccessCallback(() -> mFakeTaskView.animate().cancel())); + mFakeTaskView.animate().alpha(1).setListener(AnimationSuccessListener.forRunnable( + () -> mFakeTaskView.animate().cancel())); mFakePreviousTaskView.setBackground(AppCompatResources.getDrawable( mContext, getMockPreviousAppTaskThumbnailResId())); mFakeIconView.setBackground(AppCompatResources.getDrawable( diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 21100c4499..aea03e0c46 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -111,7 +111,6 @@ import com.android.launcher3.PagedView; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; -import com.android.launcher3.anim.AnimatorListeners; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.SpringProperty; @@ -121,6 +120,7 @@ import com.android.launcher3.icons.cache.HandlerRunnable; import com.android.launcher3.statehandlers.DepthController; import com.android.launcher3.statemanager.BaseState; import com.android.launcher3.statemanager.StatefulActivity; +import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.touch.OverScroll; import com.android.launcher3.touch.PagedOrientationHandler; import com.android.launcher3.util.DynamicResource; @@ -1677,7 +1677,7 @@ public abstract class RecentsView { + pa.addListener(AnimationSuccessListener.forRunnable(() -> { setLayoutRotation(newRotation, mOrientationState.getDisplayRotation()); mActivity.getDragLayer().recreateControllers(); updateChildTaskOrientations(); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 5ba7623ece..47c67b9796 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -25,7 +25,6 @@ import static com.android.launcher3.LauncherState.FLAG_WORKSPACE_INACCESSIBLE; import static com.android.launcher3.LauncherState.HINT_STATE; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.SPRING_LOADED; -import static com.android.launcher3.anim.AnimatorListeners.forSuccessCallback; import static com.android.launcher3.config.FeatureFlags.ADAPTIVE_ICON_WINDOW_ANIM; import static com.android.launcher3.dragndrop.DragLayer.ALPHA_INDEX_OVERLAY; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME; @@ -1947,8 +1946,8 @@ public class Workspace extends PagedView } parent.onDropChild(cell); - mLauncher.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY, - onCompleteRunnable == null ? null : forSuccessCallback(onCompleteRunnable)); + mLauncher.getStateManager().goToState( + NORMAL, SPRING_LOADED_EXIT_DELAY, onCompleteRunnable); mStatsLogManager.logger().withItemInfo(d.dragInfo).withInstanceId(d.logInstanceId) .log(LauncherEvent.LAUNCHER_ITEM_DROP_COMPLETED); } diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java index 2b36f19226..c580d47994 100644 --- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java @@ -3,7 +3,6 @@ package com.android.launcher3.accessibility; import static android.view.accessibility.AccessibilityNodeInfo.ACTION_LONG_CLICK; import static com.android.launcher3.LauncherState.NORMAL; -import static com.android.launcher3.anim.AnimatorListeners.forSuccessCallback; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.IGNORE; import android.appwidget.AppWidgetProviderInfo; @@ -221,26 +220,30 @@ public class LauncherAccessibilityDelegate extends AccessibilityDelegate impleme } else if (action == ADD_TO_WORKSPACE) { final int[] coordinates = new int[2]; final int screenId = findSpaceOnWorkspace(item, coordinates); - mLauncher.getStateManager().goToState(NORMAL, true, forSuccessCallback(() -> { - if (item instanceof AppInfo) { - WorkspaceItemInfo info = ((AppInfo) item).makeWorkspaceItem(); - mLauncher.getModelWriter().addItemToDatabase(info, - Favorites.CONTAINER_DESKTOP, - screenId, coordinates[0], coordinates[1]); + mLauncher.getStateManager().goToState(NORMAL, true, new Runnable() { - mLauncher.bindItems( - Collections.singletonList(info), - /* forceAnimateIcons= */ true, - /* focusFirstItemForAccessibility= */ true); - announceConfirmation(R.string.item_added_to_workspace); - } else if (item instanceof PendingAddItemInfo) { - PendingAddItemInfo info = (PendingAddItemInfo) item; - Workspace workspace = mLauncher.getWorkspace(); - workspace.snapToPage(workspace.getPageIndexForScreenId(screenId)); - mLauncher.addPendingItem(info, Favorites.CONTAINER_DESKTOP, - screenId, coordinates, info.spanX, info.spanY); + @Override + public void run() { + if (item instanceof AppInfo) { + WorkspaceItemInfo info = ((AppInfo) item).makeWorkspaceItem(); + mLauncher.getModelWriter().addItemToDatabase(info, + Favorites.CONTAINER_DESKTOP, + screenId, coordinates[0], coordinates[1]); + + mLauncher.bindItems( + Collections.singletonList(info), + /* forceAnimateIcons= */ true, + /* focusFirstItemForAccessibility= */ true); + announceConfirmation(R.string.item_added_to_workspace); + } else if (item instanceof PendingAddItemInfo) { + PendingAddItemInfo info = (PendingAddItemInfo) item; + Workspace workspace = mLauncher.getWorkspace(); + workspace.snapToPage(workspace.getPageIndexForScreenId(screenId)); + mLauncher.addPendingItem(info, Favorites.CONTAINER_DESKTOP, + screenId, coordinates, info.spanX, info.spanY); + } } - })); + }); return true; } else if (action == MOVE_TO_WORKSPACE) { Folder folder = Folder.getOpen(mLauncher); diff --git a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java index f96afa856b..1733e5dd41 100644 --- a/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java +++ b/src/com/android/launcher3/accessibility/ShortcutMenuAccessibilityDelegate.java @@ -17,7 +17,6 @@ package com.android.launcher3.accessibility; import static com.android.launcher3.LauncherState.NORMAL; -import static com.android.launcher3.anim.AnimatorListeners.forSuccessCallback; import android.view.KeyEvent; import android.view.View; @@ -68,14 +67,19 @@ public class ShortcutMenuAccessibilityDelegate extends LauncherAccessibilityDele final WorkspaceItemInfo info = ((DeepShortcutView) host.getParent()).getFinalInfo(); final int[] coordinates = new int[2]; final int screenId = findSpaceOnWorkspace(item, coordinates); - mLauncher.getStateManager().goToState(NORMAL, true, forSuccessCallback(() -> { - mLauncher.getModelWriter().addItemToDatabase(info, - LauncherSettings.Favorites.CONTAINER_DESKTOP, - screenId, coordinates[0], coordinates[1]); - mLauncher.bindItems(Collections.singletonList(info), true); - AbstractFloatingView.closeAllOpenViews(mLauncher); - announceConfirmation(R.string.item_added_to_workspace); - })); + Runnable onComplete = new Runnable() { + @Override + public void run() { + mLauncher.getModelWriter().addItemToDatabase(info, + LauncherSettings.Favorites.CONTAINER_DESKTOP, + screenId, coordinates[0], coordinates[1]); + mLauncher.bindItems(Collections.singletonList(info), true); + AbstractFloatingView.closeAllOpenViews(mLauncher); + announceConfirmation(R.string.item_added_to_workspace); + } + }; + + mLauncher.getStateManager().goToState(NORMAL, true, onComplete); return true; } else if (action == DISMISS_NOTIFICATION) { if (!(host instanceof NotificationMainView)) { diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 3a616093db..75f3149736 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -25,7 +25,7 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_VERTICAL_PR import static com.android.launcher3.util.SystemUiController.UI_STATE_ALLAPPS; import android.animation.Animator; -import android.animation.Animator.AnimatorListener; +import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.util.FloatProperty; import android.view.View; @@ -36,7 +36,7 @@ import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.Utilities; -import com.android.launcher3.anim.AnimatorListeners; +import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.config.FeatureFlags; @@ -185,8 +185,8 @@ public class AllAppsTransitionController mScrimView.setDrawingController(shouldProtectHeader ? mAppsView : null); } - public AnimatorListener getProgressAnimatorListener() { - return AnimatorListeners.forSuccessCallback(this::onProgressAnimationEnd); + public AnimatorListenerAdapter getProgressAnimatorListener() { + return AnimationSuccessListener.forRunnable(this::onProgressAnimationEnd); } /** diff --git a/src/com/android/launcher3/anim/AnimationSuccessListener.java b/src/com/android/launcher3/anim/AnimationSuccessListener.java index a312070e58..9905e81638 100644 --- a/src/com/android/launcher3/anim/AnimationSuccessListener.java +++ b/src/com/android/launcher3/anim/AnimationSuccessListener.java @@ -40,4 +40,24 @@ public abstract class AnimationSuccessListener extends AnimatorListenerAdapter { public abstract void onAnimationSuccess(Animator animator); + /** + * Returns an AnimationSuccessListener which runs the provided action on success + */ + public static AnimationSuccessListener forRunnable(Runnable r) { + return new RunnableSuccessListener(r); + } + + private static class RunnableSuccessListener extends AnimationSuccessListener { + + private final Runnable mRunnable; + + private RunnableSuccessListener(Runnable r) { + mRunnable = r; + } + + @Override + public void onAnimationSuccess(Animator animator) { + mRunnable.run(); + } + } } diff --git a/src/com/android/launcher3/anim/AnimatorListeners.java b/src/com/android/launcher3/anim/AnimatorListeners.java deleted file mode 100644 index 379970049a..0000000000 --- a/src/com/android/launcher3/anim/AnimatorListeners.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.launcher3.anim; - -import static com.android.launcher3.LauncherAnimUtils.SUCCESS_TRANSITION_PROGRESS; - -import android.animation.Animator; -import android.animation.Animator.AnimatorListener; -import android.animation.AnimatorListenerAdapter; -import android.animation.ValueAnimator; - -import java.util.function.Consumer; - -/** - * Utility class for creating common {@link AnimatorListener} - */ -public class AnimatorListeners { - - /** - * Returns an AnimatorListener which executes the callback on successful animation completion - */ - public static AnimatorListener forSuccessCallback(Runnable callback) { - return new RunnableSuccessListener(callback); - } - - /** - * Returns an AnimatorListener which executes the callback on animation completion, - * with the boolean representing success - */ - public static AnimatorListener forEndCallback(Consumer callback) { - return new EndStateCallbackWrapper(callback); - } - - /** - * Returns an AnimatorListener which executes the callback on animation completion - */ - public static AnimatorListener forEndCallback(Runnable callback) { - return new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation, boolean isReverse) { - callback.run(); - } - }; - } - - private static class EndStateCallbackWrapper extends AnimatorListenerAdapter { - - private final Consumer mListener; - private boolean mListenerCalled = false; - - EndStateCallbackWrapper(Consumer listener) { - mListener = listener; - } - - @Override - public void onAnimationCancel(Animator animation) { - if (!mListenerCalled) { - mListenerCalled = true; - mListener.accept(false); - } - } - - @Override - public void onAnimationEnd(Animator animation) { - if (!mListenerCalled) { - ValueAnimator anim = (ValueAnimator) animation; - mListener.accept(anim.getAnimatedFraction() > SUCCESS_TRANSITION_PROGRESS); - } - } - } - - private static class RunnableSuccessListener extends AnimationSuccessListener { - - private final Runnable mRunnable; - - private RunnableSuccessListener(Runnable r) { - mRunnable = r; - } - - @Override - public void onAnimationSuccess(Animator animator) { - mRunnable.run(); - } - } -} diff --git a/src/com/android/launcher3/anim/PendingAnimation.java b/src/com/android/launcher3/anim/PendingAnimation.java index 01f7de66ce..8057475fb4 100644 --- a/src/com/android/launcher3/anim/PendingAnimation.java +++ b/src/com/android/launcher3/anim/PendingAnimation.java @@ -15,11 +15,13 @@ */ package com.android.launcher3.anim; +import static com.android.launcher3.LauncherAnimUtils.SUCCESS_TRANSITION_PROGRESS; import static com.android.launcher3.LauncherAnimUtils.VIEW_BACKGROUND_COLOR; import static com.android.launcher3.anim.AnimatorPlaybackController.addAnimationHoldersRecur; import android.animation.Animator; import android.animation.Animator.AnimatorListener; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; @@ -180,6 +182,32 @@ public class PendingAnimation implements PropertySetter { if (mProgressAnimator == null) { mProgressAnimator = ValueAnimator.ofFloat(0, 1); } - mProgressAnimator.addListener(AnimatorListeners.forEndCallback(listener)); + mProgressAnimator.addListener(new EndStateCallbackWrapper(listener)); + } + + private static class EndStateCallbackWrapper extends AnimatorListenerAdapter { + + private final Consumer mListener; + private boolean mCalled = false; + + EndStateCallbackWrapper(Consumer listener) { + mListener = listener; + } + + @Override + public void onAnimationCancel(Animator animation) { + if (!mCalled) { + mCalled = true; + mListener.accept(false); + } + } + + @Override + public void onAnimationEnd(Animator animation) { + if (!mCalled) { + ValueAnimator anim = (ValueAnimator) animation; + mListener.accept(anim.getAnimatedFraction() > SUCCESS_TRANSITION_PROGRESS); + } + } } } diff --git a/src/com/android/launcher3/statemanager/StateManager.java b/src/com/android/launcher3/statemanager/StateManager.java index 03b68535bc..14ef2dc652 100644 --- a/src/com/android/launcher3/statemanager/StateManager.java +++ b/src/com/android/launcher3/statemanager/StateManager.java @@ -129,14 +129,14 @@ public class StateManager> { } /** - * @see #goToState(STATE_TYPE, boolean, AnimatorListener) + * @see #goToState(STATE_TYPE, boolean, Runnable) */ public void goToState(STATE_TYPE state) { goToState(state, shouldAnimateStateChange()); } /** - * @see #goToState(STATE_TYPE, boolean, AnimatorListener) + * @see #goToState(STATE_TYPE, boolean, Runnable) */ public void goToState(STATE_TYPE state, boolean animated) { goToState(state, animated, 0, null); @@ -149,15 +149,15 @@ public class StateManager> { * true otherwise * @paras onCompleteRunnable any action to perform at the end of the transition, of null. */ - public void goToState(STATE_TYPE state, boolean animated, AnimatorListener listener) { - goToState(state, animated, 0, listener); + public void goToState(STATE_TYPE state, boolean animated, Runnable onCompleteRunnable) { + goToState(state, animated, 0, onCompleteRunnable); } /** * Changes the Launcher state to the provided state after the given delay. */ - public void goToState(STATE_TYPE state, long delay, AnimatorListener listener) { - goToState(state, true, delay, listener); + public void goToState(STATE_TYPE state, long delay, Runnable onCompleteRunnable) { + goToState(state, true, delay, onCompleteRunnable); } /** @@ -187,20 +187,21 @@ public class StateManager> { } } - private void goToState( - STATE_TYPE state, boolean animated, long delay, AnimatorListener listener) { + private void goToState(STATE_TYPE state, boolean animated, long delay, + final Runnable onCompleteRunnable) { animated &= areAnimatorsEnabled(); if (mActivity.isInState(state)) { if (mConfig.currentAnimation == null) { // Run any queued runnable - if (listener != null) { - listener.onAnimationEnd(null); + if (onCompleteRunnable != null) { + onCompleteRunnable.run(); } return; } else if (!mConfig.userControlled && animated && mConfig.targetState == state) { // We are running the same animation as requested - if (listener != null) { - mConfig.currentAnimation.addListener(listener); + if (onCompleteRunnable != null) { + mConfig.currentAnimation.addListener( + AnimationSuccessListener.forRunnable(onCompleteRunnable)); } return; } @@ -220,8 +221,8 @@ public class StateManager> { onStateTransitionEnd(state); // Run any queued runnable - if (listener != null) { - listener.onAnimationEnd(null); + if (onCompleteRunnable != null) { + onCompleteRunnable.run(); } return; } @@ -232,16 +233,16 @@ public class StateManager> { int startChangeId = mConfig.changeId; mUiHandler.postDelayed(() -> { if (mConfig.changeId == startChangeId) { - goToStateAnimated(state, fromState, listener); + goToStateAnimated(state, fromState, onCompleteRunnable); } }, delay); } else { - goToStateAnimated(state, fromState, listener); + goToStateAnimated(state, fromState, onCompleteRunnable); } } private void goToStateAnimated(STATE_TYPE state, STATE_TYPE fromState, - AnimatorListener listener) { + Runnable onCompleteRunnable) { // Since state mBaseState can be reached from multiple states, just assume that the // transition plays in reverse and use the same duration as previous state. mConfig.duration = state == mBaseState @@ -249,8 +250,8 @@ public class StateManager> { : state.getTransitionDuration(mActivity); prepareForAtomicAnimation(fromState, state, mConfig); AnimatorSet animation = createAnimationToNewWorkspaceInternal(state).buildAnim(); - if (listener != null) { - animation.addListener(listener); + if (onCompleteRunnable != null) { + animation.addListener(AnimationSuccessListener.forRunnable(onCompleteRunnable)); } mUiHandler.post(new StartAnimRunnable(animation)); }