From aea0cbf9d360ffb4a915c0870cb969f1c77fd2c5 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Tue, 23 Mar 2021 15:35:46 -0700 Subject: [PATCH] Fix taskbar crash after cleanup - Set LayoutTransition after adding initial views - End running transitions in cleanup - Only run update listener if LayoutTransition is active Test: No crash after taskbar cleanup() Bug: 182512211 Change-Id: I1049857935d09235388c1ef1fe4d89ef53b79aa5 --- .../launcher3/taskbar/TaskbarView.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index 3567c17afa..21a2d512ab 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -120,11 +120,6 @@ public class TaskbarView extends LinearLayout implements FolderIcon.FolderIconPa } protected void init(int numHotseatIcons, int numRecentIcons) { - mLayoutTransition = new LayoutTransition(); - addUpdateListenerForAllLayoutTransitions( - () -> mControllerCallbacks.onItemPositionsChanged(this)); - setLayoutTransition(mLayoutTransition); - mHotseatStartIndex = 0; mHotseatEndIndex = mHotseatStartIndex + numHotseatIcons - 1; updateHotseatItems(new ItemInfo[numHotseatIcons]); @@ -135,6 +130,14 @@ public class TaskbarView extends LinearLayout implements FolderIcon.FolderIconPa mRecentsStartIndex = dividerIndex + 1; mRecentsEndIndex = mRecentsStartIndex + numRecentIcons - 1; updateRecentTasks(new Task[numRecentIcons]); + + mLayoutTransition = new LayoutTransition(); + addUpdateListenerForAllLayoutTransitions(() -> { + if (getLayoutTransition() == mLayoutTransition) { + mControllerCallbacks.onItemPositionsChanged(this); + } + }); + setLayoutTransition(mLayoutTransition); } private void addUpdateListenerForAllLayoutTransitions(Runnable onUpdate) { @@ -159,10 +162,20 @@ public class TaskbarView extends LinearLayout implements FolderIcon.FolderIconPa } protected void cleanup() { + endAllLayoutTransitionAnimators(); + setLayoutTransition(null); removeAllViews(); mHotseatRecentsDivider = null; } + private void endAllLayoutTransitionAnimators() { + mLayoutTransition.getAnimator(LayoutTransition.CHANGE_APPEARING).end(); + mLayoutTransition.getAnimator(LayoutTransition.CHANGE_DISAPPEARING).end(); + mLayoutTransition.getAnimator(LayoutTransition.CHANGING).end(); + mLayoutTransition.getAnimator(LayoutTransition.APPEARING).end(); + mLayoutTransition.getAnimator(LayoutTransition.DISAPPEARING).end(); + } + /** * Sets the alpha of the background color behind all the Taskbar contents. * @param alpha 0 is fully transparent, 1 is fully opaque.