diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index a05aac9dfe3e3..d223934fcf347 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -60,6 +60,7 @@ import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; import android.window.WindowContainerTransactionCallback; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.os.SomeArgs; import com.android.wm.shell.R; @@ -550,7 +551,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, return null; } - private void enterPipWithAlphaAnimation(Rect destinationBounds, long durationMs) { + @VisibleForTesting + void enterPipWithAlphaAnimation(Rect destinationBounds, long durationMs) { // If we are fading the PIP in, then we should move the pip to the final location as // soon as possible, but set the alpha immediately since the transaction can take a // while to process diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java index 54543d25b401f..abd870779e574 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java @@ -16,14 +16,29 @@ package com.android.wm.shell.pip; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.verify; +import static junit.framework.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.ActivityManager; +import android.app.PictureInPictureParams; +import android.content.ComponentName; +import android.graphics.Rect; import android.os.RemoteException; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.util.Rational; +import android.view.DisplayInfo; +import android.window.WindowContainerToken; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; @@ -52,14 +67,19 @@ public class PipTaskOrganizerTest extends PipTestCase { @Mock private PipUiEventLogger mMockPipUiEventLogger; @Mock private Optional mMockOptionalSplitScreen; @Mock private ShellTaskOrganizer mMockShellTaskOrganizer; - @Mock private PipBoundsState mMockPipBoundsState; + private PipBoundsState mPipBoundsState; + + private ComponentName mComponent1; @Before public void setUp() throws RemoteException { MockitoAnnotations.initMocks(this); - mSpiedPipTaskOrganizer = new PipTaskOrganizer(mContext, mMockPipBoundsState, + mComponent1 = new ComponentName(mContext, "component1"); + mPipBoundsState = new PipBoundsState(); + mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext, mPipBoundsState, mMockPipBoundsHandler, mMockPipSurfaceTransactionHelper, mMockOptionalSplitScreen, - mMockdDisplayController, mMockPipUiEventLogger, mMockShellTaskOrganizer); + mMockdDisplayController, mMockPipUiEventLogger, mMockShellTaskOrganizer)); + preparePipTaskOrg(); } @Test @@ -71,4 +91,59 @@ public class PipTaskOrganizerTest extends PipTestCase { public void instantiatePipTaskOrganizer_addsDisplayWindowListener() { verify(mMockdDisplayController).addDisplayWindowListener(any()); } + + @Test + public void startSwipePipToHome_updatesAspectRatio() { + final Rational aspectRatio = new Rational(2, 1); + + mSpiedPipTaskOrganizer.startSwipePipToHome(mComponent1, null, createPipParams(aspectRatio)); + + assertEquals(aspectRatio.floatValue(), mPipBoundsState.getAspectRatio(), 0.01f); + } + + @Test + public void onTaskAppeared_updatesAspectRatio() { + final Rational aspectRatio = new Rational(2, 1); + + mSpiedPipTaskOrganizer.onTaskAppeared(createTaskInfo( + createPipParams(aspectRatio)), null /* leash */); + + assertEquals(aspectRatio.floatValue(), mPipBoundsState.getAspectRatio(), 0.01f); + } + + @Test + public void onTaskInfoChanged_updatesAspectRatioIfChanged() { + final Rational startAspectRatio = new Rational(2, 1); + final Rational newAspectRatio = new Rational(1, 2); + mSpiedPipTaskOrganizer.onTaskAppeared(createTaskInfo( + createPipParams(startAspectRatio)), null /* leash */); + + mSpiedPipTaskOrganizer.onTaskInfoChanged(createTaskInfo(createPipParams(newAspectRatio))); + + assertEquals(newAspectRatio.floatValue(), mPipBoundsState.getAspectRatio(), 0.01f); + } + + private void preparePipTaskOrg() { + final DisplayInfo info = new DisplayInfo(); + when(mMockPipBoundsHandler.getDestinationBounds(any(), any())).thenReturn(new Rect()); + when(mMockPipBoundsHandler.getDestinationBounds(any(), any(), anyBoolean())) + .thenReturn(new Rect()); + when(mMockPipBoundsHandler.getDisplayInfo()).thenReturn(info); + mSpiedPipTaskOrganizer.setOneShotAnimationType(PipAnimationController.ANIM_TYPE_ALPHA); + doNothing().when(mSpiedPipTaskOrganizer).enterPipWithAlphaAnimation(any(), anyLong()); + doNothing().when(mSpiedPipTaskOrganizer).scheduleAnimateResizePip(any(), anyInt(), any()); + } + + private static ActivityManager.RunningTaskInfo createTaskInfo(PictureInPictureParams params) { + final ActivityManager.RunningTaskInfo info = new ActivityManager.RunningTaskInfo(); + info.token = mock(WindowContainerToken.class); + info.pictureInPictureParams = params; + return info; + } + + private static PictureInPictureParams createPipParams(Rational aspectRatio) { + return new PictureInPictureParams.Builder() + .setAspectRatio(aspectRatio) + .build(); + } }