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

Commit 804c0327 authored by Hongwei Wang's avatar Hongwei Wang
Browse files

Fix NPE in PipTaskListener

There is a regression from ag/31449935 that we failed to do null-check
on the incoming PictureInPictureParams via onTaskInfoChanged.

Flag: com.android.wm.shell.enable_pip2
Bug: 393250416
Test: atest --iteration 5 \
      UsageStatsTest#testPipActivity \
      ActivityLifecycleKeyguardTests#testKeyguardShowHideOverPip \
      PinnedStackTests#testPipUnPipOverHome
Test: atest WMShellUnitTests:PipTaskListenerTest
Change-Id: I246b0615dfd9e9f5d2a583ca744f644351940d5e
parent 0c5555eb
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -132,8 +132,9 @@ public class PipTaskListener implements ShellTaskOrganizer.TaskListener,
                "onTaskInfoChanged: %s, state=%s oldParams=%s newParams=%s",
                taskInfo.topActivity, mPipTransitionState, mPictureInPictureParams, params);
        setPictureInPictureParams(params);
        // Note: params is nullable while mPictureInPictureParams is never null
        float newAspectRatio = mPictureInPictureParams.getAspectRatioFloat();
        if (params.hasSetAspectRatio()
        if (mPictureInPictureParams.hasSetAspectRatio()
                && mPipBoundsAlgorithm.isValidPictureInPictureAspectRatio(newAspectRatio)
                && PipUtils.aspectRatioChanged(newAspectRatio, mPipBoundsState.getAspectRatio())) {
            mPipTransitionState.setOnIdlePipTransitionStateRunnable(() -> {
+19 −0
Original line number Diff line number Diff line
@@ -164,6 +164,25 @@ public class PipTaskListenerTest {
        verifyZeroInteractions(mMockPipParamsChangedCallback);
    }

    @Test
    public void onTaskInfoChanged_withNullPipParams_doNothing() {
        mPipTaskListener = new PipTaskListener(mMockContext, mMockShellTaskOrganizer,
                mMockPipTransitionState, mMockPipScheduler, mMockPipBoundsState,
                mMockPipBoundsAlgorithm, mMockShellExecutor);
        mPipTaskListener.addParamsChangedListener(mMockPipParamsChangedCallback);
        Rational aspectRatio = new Rational(4, 3);
        when(mMockPipBoundsState.getAspectRatio()).thenReturn(aspectRatio.toFloat());
        String action1 = "action1";
        mPipTaskListener.onTaskInfoChanged(getTaskInfo(aspectRatio, action1));

        clearInvocations(mMockPipParamsChangedCallback);
        mPipTaskListener.onTaskInfoChanged(new ActivityManager.RunningTaskInfo());

        verifyZeroInteractions(mMockPipParamsChangedCallback);
        verify(mMockPipTransitionState, times(0))
                .setOnIdlePipTransitionStateRunnable(any(Runnable.class));
    }

    @Test
    public void onTaskInfoChanged_withActionsChanged_callbackActionsChanged() {
        mPipTaskListener = new PipTaskListener(mMockContext, mMockShellTaskOrganizer,