diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 9f35401df0..06dad8ab76 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -483,6 +483,9 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener ? new float[]{1, mContentScale} : new float[]{mContentScale, 1}; + // Pause expensive view updates as they can lead to layer thrashing and skipped frames. + mLauncher.pauseExpensiveViewUpdates(); + if (mLauncher.isInState(ALL_APPS)) { // All Apps in portrait mode is full screen, so we only animate AllAppsContainerView. final View appsView = mLauncher.getAppsView(); @@ -581,9 +584,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener } } - // Pause expensive view updates as they can lead to layer thrashing and skipped frames. - mLauncher.pauseExpensiveViewUpdates(); - endListener = () -> { viewsToAnimate.forEach(view -> { SCALE_PROPERTY.set(view, 1f); diff --git a/quickstep/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java b/quickstep/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java index b1e2eacadd..32e08ffa8d 100644 --- a/quickstep/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java +++ b/quickstep/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java @@ -18,6 +18,7 @@ package com.android.quickstep.util; import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y; import static com.android.launcher3.LauncherState.BACKGROUND_APP; import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.anim.AnimatorListeners.forEndCallback; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.anim.PropertySetter.NO_ANIM_PROPERTY_SETTER; import static com.android.launcher3.states.StateAnimationConfig.SKIP_DEPTH_CONTROLLER; @@ -148,6 +149,9 @@ public class StaggeredWorkspaceAnim { }); } + launcher.pauseExpensiveViewUpdates(); + mAnimators.addListener(forEndCallback(launcher::resumeExpensiveViewUpdates)); + if (animateOverviewScrim) { PendingAnimation pendingAnimation = new PendingAnimation(DURATION_MS); launcher.getWorkspace().getStateTransitionAnimation() diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 18463839b2..fc7432a0ef 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -3229,11 +3229,24 @@ public class Launcher extends StatefulActivity public void pauseExpensiveViewUpdates() { // Pause page indicator animations as they lead to layer trashing. getWorkspace().getPageIndicator().pauseAnimations(); + + getWorkspace().mapOverItems((info, view) -> { + if (view instanceof LauncherAppWidgetHostView) { + ((LauncherAppWidgetHostView) view).beginDeferringUpdates(); + } + return false; // Return false to continue iterating through all the items. + }); } /** Resumes view updates at the end of the app launch animation. */ public void resumeExpensiveViewUpdates() { getWorkspace().getPageIndicator().skipAnimationsToEnd(); - } + getWorkspace().mapOverItems((info, view) -> { + if (view instanceof LauncherAppWidgetHostView) { + ((LauncherAppWidgetHostView) view).endDeferringUpdates(); + } + return false; // Return false to continue iterating through all the items. + }); + } } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 93f3d9f061..4903d7758a 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -3265,7 +3265,11 @@ public class Workspace extends PagedView } } - private View mapOverCellLayout(CellLayout layout, ItemOperator op) { + /** + * Perform {param operator} over all the items in a given {param layout}. + * @return The first item that satisfies the operator or null. + */ + public View mapOverCellLayout(CellLayout layout, ItemOperator operator) { // TODO(b/128460496) Potential race condition where layout is not yet loaded if (layout == null) { return null; @@ -3275,7 +3279,7 @@ public class Workspace extends PagedView final int itemCount = container.getChildCount(); for (int itemIdx = 0; itemIdx < itemCount; itemIdx++) { View item = container.getChildAt(itemIdx); - if (op.evaluate((ItemInfo) item.getTag(), item)) { + if (operator.evaluate((ItemInfo) item.getTag(), item)) { return item; } }