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

Commit a73daf63 authored by Perry Wu's avatar Perry Wu
Browse files

[PIP] Remove PIP when recovering from systemui crash

PIP can end up in a broken state if systemui crashes. To fix this we
implement a callback in onTaskAppeared, which gets triggered on crash
recovery, and clean up pip if so.

Bug: 376048041
Test: manual, crash systemui and verify no pip
Flag: EXEMPT bugfix
Change-Id: I6311c7d20a784b822122fd5373609b25436d0b61
parent c1f77cb8
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -137,6 +137,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            SystemProperties.getInt(
                    "persist.wm.debug.extra_content_overlay_fade_out_delay_ms", 400);

    private static final int CRASH_RECOVERY_CHECK_DELAY_MS = 3000;

    private final Context mContext;
    private final SyncTransactionQueue mSyncTransactionQueue;
    private final PipBoundsState mPipBoundsState;
@@ -386,6 +388,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
    @Nullable
    private Rect mSwipeSourceRectHint;

    /**
     * Tracks whether we've actually started an enter transition after receiving an onTaskAppeared.
     *
     * Used for cleaning up state from crash recovery.
     */
    private boolean mHasTriggeredEnterPipTransition;

    public PipTaskOrganizer(Context context,
            @NonNull SyncTransactionQueue syncTransactionQueue,
            @NonNull PipTransitionState pipTransitionState,
@@ -443,6 +452,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            pipTransitionController.registerPipTransitionCallback(
                    mPipTransitionCallback, mMainExecutor);
        }

        mPipTransitionState.addOnPipTransitionStateChangedListener(
                (oldState, newState) -> {
                    if (mPipTransitionState.isEnteringPip()) {
                        mHasTriggeredEnterPipTransition = true;
                    }
                });
    }

    public PipTransitionController getTransitionController() {
@@ -881,6 +897,15 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            logRemoteActions(mPictureInPictureParams);
        }

        // set delayed check that we are entering pip, otherwise this indicates
        // a systemui crash and we should clean up pip state
        mHasTriggeredEnterPipTransition = false;
        mMainExecutor.executeDelayed(() -> {
            if (!mHasTriggeredEnterPipTransition) {
                removePipImmediately();
            }
        }, CRASH_RECOVERY_CHECK_DELAY_MS);

        mPipUiEventLoggerLogger.setTaskInfo(mTaskInfo);

        // If the displayId of the task is different than what PipBoundsHandler has, then update