diff options
6 files changed, 30 insertions, 73 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsAlgorithm.java index a9f687fc9b2d..6ffeb97f50fa 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsAlgorithm.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsAlgorithm.java @@ -125,11 +125,15 @@ public class PipBoundsAlgorithm { public Rect getEntryDestinationBoundsIgnoringKeepClearAreas() { final PipBoundsState.PipReentryState reentryState = mPipBoundsState.getReentryState(); - final Rect destinationBounds = reentryState != null - ? getDefaultBounds(reentryState.getSnapFraction(), reentryState.getSize()) - : getDefaultBounds(); + final Rect destinationBounds = getDefaultBounds(); + if (reentryState != null) { + final Size scaledBounds = new Size( + Math.round(mPipBoundsState.getMaxSize().x * reentryState.getBoundsScale()), + Math.round(mPipBoundsState.getMaxSize().y * reentryState.getBoundsScale())); + destinationBounds.set(getDefaultBounds(reentryState.getSnapFraction(), scaledBounds)); + } - final boolean useCurrentSize = reentryState != null && reentryState.getSize() != null; + final boolean useCurrentSize = reentryState != null; Rect aspectRatioBounds = transformBoundsToAspectRatioIfValid(destinationBounds, mPipBoundsState.getAspectRatio(), false /* useCurrentMinEdgeSize */, useCurrentSize); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java index df589df8b227..b57e2d2c6ac2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsState.java @@ -298,8 +298,8 @@ public class PipBoundsState { } /** Save the reentry state to restore to when re-entering PIP mode. */ - public void saveReentryState(Size size, float fraction) { - mPipReentryState = new PipReentryState(size, fraction); + public void saveReentryState(float fraction) { + mPipReentryState = new PipReentryState(mBoundsScale, fraction); } /** Returns the saved reentry state. */ @@ -601,17 +601,16 @@ public class PipBoundsState { public static final class PipReentryState { private static final String TAG = PipReentryState.class.getSimpleName(); - private final @Nullable Size mSize; private final float mSnapFraction; + private final float mBoundsScale; - PipReentryState(@Nullable Size size, float snapFraction) { - mSize = size; + PipReentryState(float boundsScale, float snapFraction) { + mBoundsScale = boundsScale; mSnapFraction = snapFraction; } - @Nullable - public Size getSize() { - return mSize; + public float getBoundsScale() { + return mBoundsScale; } public float getSnapFraction() { @@ -621,7 +620,7 @@ public class PipBoundsState { void dump(PrintWriter pw, String prefix) { final String innerPrefix = prefix + " "; pw.println(prefix + TAG); - pw.println(innerPrefix + "mSize=" + mSize); + pw.println(innerPrefix + "mBoundsScale=" + mBoundsScale); pw.println(innerPrefix + "mSnapFraction=" + mSnapFraction); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index 4b12134cb377..46840773cfc6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -48,7 +48,6 @@ import android.graphics.Rect; import android.os.RemoteException; import android.os.SystemProperties; import android.util.Pair; -import android.util.Size; import android.view.DisplayInfo; import android.view.InsetsState; import android.view.SurfaceControl; @@ -1042,22 +1041,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb /** Save the state to restore to on re-entry. */ public void saveReentryState(Rect pipBounds) { float snapFraction = mPipBoundsAlgorithm.getSnapFraction(pipBounds); - - if (!mPipBoundsState.hasUserResizedPip()) { - mPipBoundsState.saveReentryState(null /* bounds */, snapFraction); - return; - } - - Size reentrySize = new Size(pipBounds.width(), pipBounds.height()); - - // TODO: b/279937014 Investigate why userResizeBounds are empty with shell transitions on - // fallback to using the userResizeBounds if userResizeBounds are not empty - if (!mTouchHandler.getUserResizeBounds().isEmpty()) { - Rect userResizeBounds = mTouchHandler.getUserResizeBounds(); - reentrySize = new Size(userResizeBounds.width(), userResizeBounds.height()); - } - - mPipBoundsState.saveReentryState(reentrySize, snapFraction); + mPipBoundsState.saveReentryState(snapFraction); } @Override diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java index 46259a8b177f..080b0ae006ea 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java @@ -354,14 +354,17 @@ public class PipBoundsAlgorithmTest extends ShellTestCase { } @Test - public void getEntryDestinationBounds_reentryStateExists_restoreLastSize() { + public void getEntryDestinationBounds_reentryStateExists_restoreProportionalSize() { mPipBoundsState.setAspectRatio(DEFAULT_ASPECT_RATIO); + final Size maxSize = mSizeSpecSource.getMaxSize(DEFAULT_ASPECT_RATIO); + mPipBoundsState.setMaxSize(maxSize.getWidth(), maxSize.getHeight()); final Rect reentryBounds = mPipBoundsAlgorithm.getEntryDestinationBounds(); reentryBounds.scale(1.25f); + mPipBoundsState.setBounds(reentryBounds); // this updates the bounds scale used in reentry + final float reentrySnapFraction = mPipBoundsAlgorithm.getSnapFraction(reentryBounds); - mPipBoundsState.saveReentryState( - new Size(reentryBounds.width(), reentryBounds.height()), reentrySnapFraction); + mPipBoundsState.saveReentryState(reentrySnapFraction); final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds(); assertEquals(reentryBounds.width(), destinationBounds.width()); @@ -375,8 +378,7 @@ public class PipBoundsAlgorithmTest extends ShellTestCase { reentryBounds.offset(0, -100); final float reentrySnapFraction = mPipBoundsAlgorithm.getSnapFraction(reentryBounds); - mPipBoundsState.saveReentryState( - new Size(reentryBounds.width(), reentryBounds.height()), reentrySnapFraction); + mPipBoundsState.saveReentryState(reentrySnapFraction); final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsStateTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsStateTest.java index db98abbbcbf1..304da75f870c 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsStateTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsStateTest.java @@ -114,22 +114,19 @@ public class PipBoundsStateTest extends ShellTestCase { @Test public void testSetReentryState() { - final Size size = new Size(100, 100); final float snapFraction = 0.5f; - mPipBoundsState.saveReentryState(size, snapFraction); + mPipBoundsState.saveReentryState(snapFraction); final PipBoundsState.PipReentryState state = mPipBoundsState.getReentryState(); - assertEquals(size, state.getSize()); assertEquals(snapFraction, state.getSnapFraction(), 0.01); } @Test public void testClearReentryState() { - final Size size = new Size(100, 100); final float snapFraction = 0.5f; - mPipBoundsState.saveReentryState(size, snapFraction); + mPipBoundsState.saveReentryState(snapFraction); mPipBoundsState.clearReentryState(); assertNull(mPipBoundsState.getReentryState()); @@ -138,20 +135,19 @@ public class PipBoundsStateTest extends ShellTestCase { @Test public void testSetLastPipComponentName_notChanged_doesNotClearReentryState() { mPipBoundsState.setLastPipComponentName(mTestComponentName1); - mPipBoundsState.saveReentryState(DEFAULT_SIZE, DEFAULT_SNAP_FRACTION); + mPipBoundsState.saveReentryState(DEFAULT_SNAP_FRACTION); mPipBoundsState.setLastPipComponentName(mTestComponentName1); final PipBoundsState.PipReentryState state = mPipBoundsState.getReentryState(); assertNotNull(state); - assertEquals(DEFAULT_SIZE, state.getSize()); assertEquals(DEFAULT_SNAP_FRACTION, state.getSnapFraction(), 0.01); } @Test public void testSetLastPipComponentName_changed_clearReentryState() { mPipBoundsState.setLastPipComponentName(mTestComponentName1); - mPipBoundsState.saveReentryState(DEFAULT_SIZE, DEFAULT_SNAP_FRACTION); + mPipBoundsState.saveReentryState(DEFAULT_SNAP_FRACTION); mPipBoundsState.setLastPipComponentName(mTestComponentName2); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java index 4eb519334e12..5d968d3360ab 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java @@ -45,7 +45,6 @@ import android.os.RemoteException; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.util.Size; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.WindowManagerShellWrapper; @@ -256,40 +255,13 @@ public class PipControllerTest extends ShellTestCase { } @Test - public void saveReentryState_noUserResize_doesNotSaveSize() { + public void saveReentryState_savesPipBoundsState() { final Rect bounds = new Rect(0, 0, 10, 10); when(mMockPipBoundsAlgorithm.getSnapFraction(bounds)).thenReturn(1.0f); - when(mMockPipBoundsState.hasUserResizedPip()).thenReturn(false); mPipController.saveReentryState(bounds); - verify(mMockPipBoundsState).saveReentryState(null, 1.0f); - } - - @Test - public void saveReentryState_nonEmptyUserResizeBounds_savesSize() { - final Rect bounds = new Rect(0, 0, 10, 10); - final Rect resizedBounds = new Rect(0, 0, 30, 30); - when(mMockPipBoundsAlgorithm.getSnapFraction(bounds)).thenReturn(1.0f); - when(mMockPipTouchHandler.getUserResizeBounds()).thenReturn(resizedBounds); - when(mMockPipBoundsState.hasUserResizedPip()).thenReturn(true); - - mPipController.saveReentryState(bounds); - - verify(mMockPipBoundsState).saveReentryState(new Size(30, 30), 1.0f); - } - - @Test - public void saveReentryState_emptyUserResizeBounds_savesSize() { - final Rect bounds = new Rect(0, 0, 10, 10); - final Rect resizedBounds = new Rect(0, 0, 0, 0); - when(mMockPipBoundsAlgorithm.getSnapFraction(bounds)).thenReturn(1.0f); - when(mMockPipTouchHandler.getUserResizeBounds()).thenReturn(resizedBounds); - when(mMockPipBoundsState.hasUserResizedPip()).thenReturn(true); - - mPipController.saveReentryState(bounds); - - verify(mMockPipBoundsState).saveReentryState(new Size(10, 10), 1.0f); + verify(mMockPipBoundsState).saveReentryState(1.0f); } @Test |