Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aea0cbf9 authored by Tony Wickham's avatar Tony Wickham
Browse files

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
parent 3629b935
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -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.