Rename PipBoundsHandler to PipBoundsAlgorithm
Now that all state handling has been moved out of PipBoundsHandler, this CL renames it to PipBoundsAlgorithm and cleans up its public API so that it functions more like an utility to calculate several types of "bounds" related to PIP such as: - Default bounds - Normal bounds - Movemement bounds - Entry bounds - Bounds adjusted to aspect ratio - Inset bounds PipBoundsAlgorithm's is then only responsible for calculating such bounds based on the current state of PIP (owned by PipBoundsState) but it no longer owns or manages the state, as that would be the responsability of its users (e.g PipController). Bug: 169373982 Test: atest com.android.wm.shell.pip Change-Id: I67c3004b60069160f82d7c3d00d8c3995c0c5f80
This commit is contained in:
@@ -36,7 +36,7 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
/**
|
||||
* Unit tests against {@link PipBoundsHandler}, including but not limited to:
|
||||
* Unit tests against {@link PipBoundsAlgorithm}, including but not limited to:
|
||||
* - default/movement bounds
|
||||
* - save/restore PiP position on application lifecycle
|
||||
* - save/restore PiP position on screen rotation
|
||||
@@ -44,14 +44,14 @@ import org.junit.runner.RunWith;
|
||||
@RunWith(AndroidTestingRunner.class)
|
||||
@SmallTest
|
||||
@TestableLooper.RunWithLooper(setAsMainLooper = true)
|
||||
public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
public class PipBoundsAlgorithmTest extends ShellTestCase {
|
||||
private static final int ROUNDING_ERROR_MARGIN = 16;
|
||||
private static final float ASPECT_RATIO_ERROR_MARGIN = 0.01f;
|
||||
private static final float DEFAULT_ASPECT_RATIO = 1f;
|
||||
private static final float MIN_ASPECT_RATIO = 0.5f;
|
||||
private static final float MAX_ASPECT_RATIO = 2f;
|
||||
|
||||
private PipBoundsHandler mPipBoundsHandler;
|
||||
private PipBoundsAlgorithm mPipBoundsAlgorithm;
|
||||
private DisplayInfo mDefaultDisplayInfo;
|
||||
private PipBoundsState mPipBoundsState;
|
||||
|
||||
@@ -59,7 +59,7 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
public void setUp() throws Exception {
|
||||
initializeMockResources();
|
||||
mPipBoundsState = new PipBoundsState(mContext);
|
||||
mPipBoundsHandler = new PipBoundsHandler(mContext, mPipBoundsState);
|
||||
mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState);
|
||||
|
||||
mPipBoundsState.setDisplayInfo(mDefaultDisplayInfo);
|
||||
}
|
||||
@@ -93,7 +93,7 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
@Test
|
||||
public void getDefaultAspectRatio() {
|
||||
assertEquals("Default aspect ratio matches resources",
|
||||
DEFAULT_ASPECT_RATIO, mPipBoundsHandler.getDefaultAspectRatio(),
|
||||
DEFAULT_ASPECT_RATIO, mPipBoundsAlgorithm.getDefaultAspectRatio(),
|
||||
ASPECT_RATIO_ERROR_MARGIN);
|
||||
}
|
||||
|
||||
@@ -104,10 +104,10 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
res.addOverride(com.android.internal.R.dimen.config_pictureInPictureDefaultAspectRatio,
|
||||
newDefaultAspectRatio);
|
||||
|
||||
mPipBoundsHandler.onConfigurationChanged(mContext);
|
||||
mPipBoundsAlgorithm.onConfigurationChanged(mContext);
|
||||
|
||||
assertEquals("Default aspect ratio should be reloaded",
|
||||
mPipBoundsHandler.getDefaultAspectRatio(), newDefaultAspectRatio,
|
||||
mPipBoundsAlgorithm.getDefaultAspectRatio(), newDefaultAspectRatio,
|
||||
ASPECT_RATIO_ERROR_MARGIN);
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
};
|
||||
for (float aspectRatio : aspectRatios) {
|
||||
mPipBoundsState.setAspectRatio(aspectRatio);
|
||||
final Rect destinationBounds = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
final float actualAspectRatio =
|
||||
destinationBounds.width() / (destinationBounds.height() * 1f);
|
||||
assertEquals("Destination bounds matches the given aspect ratio",
|
||||
@@ -136,11 +136,11 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
};
|
||||
for (float aspectRatio : invalidAspectRatios) {
|
||||
mPipBoundsState.setAspectRatio(aspectRatio);
|
||||
final Rect destinationBounds = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
final float actualAspectRatio =
|
||||
destinationBounds.width() / (destinationBounds.height() * 1f);
|
||||
assertEquals("Destination bounds fallbacks to default aspect ratio",
|
||||
mPipBoundsHandler.getDefaultAspectRatio(), actualAspectRatio,
|
||||
mPipBoundsAlgorithm.getDefaultAspectRatio(), actualAspectRatio,
|
||||
ASPECT_RATIO_ERROR_MARGIN);
|
||||
}
|
||||
}
|
||||
@@ -152,7 +152,7 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
currentBounds.right = (int) (currentBounds.height() * aspectRatio) + currentBounds.left;
|
||||
|
||||
mPipBoundsState.setAspectRatio(aspectRatio);
|
||||
final Rect destinationBounds = mPipBoundsHandler.getAdjustedDestinationBounds(
|
||||
final Rect destinationBounds = mPipBoundsAlgorithm.getAdjustedDestinationBounds(
|
||||
currentBounds, aspectRatio);
|
||||
|
||||
final float actualAspectRatio =
|
||||
@@ -178,7 +178,7 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
final Size minimalSize = minimalSizes[i];
|
||||
mPipBoundsState.setAspectRatio(aspectRatio);
|
||||
mPipBoundsState.setOverrideMinSize(minimalSize);
|
||||
final Rect destinationBounds = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
assertTrue("Destination bounds is no smaller than minimal requirement",
|
||||
(destinationBounds.width() == minimalSize.getWidth()
|
||||
&& destinationBounds.height() >= minimalSize.getHeight())
|
||||
@@ -200,7 +200,7 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
|
||||
mPipBoundsState.setAspectRatio(aspectRatio);
|
||||
mPipBoundsState.setOverrideMinSize(minSize);
|
||||
final Rect destinationBounds = mPipBoundsHandler.getAdjustedDestinationBounds(
|
||||
final Rect destinationBounds = mPipBoundsAlgorithm.getAdjustedDestinationBounds(
|
||||
currentBounds, aspectRatio);
|
||||
|
||||
assertTrue("Destination bounds ignores minimal size",
|
||||
@@ -211,12 +211,12 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
@Test
|
||||
public void getEntryDestinationBounds_reentryStateExists_restoreLastSize() {
|
||||
mPipBoundsState.setAspectRatio(DEFAULT_ASPECT_RATIO);
|
||||
final Rect reentryBounds = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect reentryBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
reentryBounds.scale(1.25f);
|
||||
final float reentrySnapFraction = mPipBoundsHandler.getSnapFraction(reentryBounds);
|
||||
final float reentrySnapFraction = mPipBoundsAlgorithm.getSnapFraction(reentryBounds);
|
||||
|
||||
mPipBoundsState.saveReentryState(reentryBounds, reentrySnapFraction);
|
||||
final Rect destinationBounds = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
|
||||
assertEquals(reentryBounds.width(), destinationBounds.width());
|
||||
assertEquals(reentryBounds.height(), destinationBounds.height());
|
||||
@@ -225,13 +225,13 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
@Test
|
||||
public void getEntryDestinationBounds_reentryStateExists_restoreLastPosition() {
|
||||
mPipBoundsState.setAspectRatio(DEFAULT_ASPECT_RATIO);
|
||||
final Rect reentryBounds = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect reentryBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
reentryBounds.offset(0, -100);
|
||||
final float reentrySnapFraction = mPipBoundsHandler.getSnapFraction(reentryBounds);
|
||||
final float reentrySnapFraction = mPipBoundsAlgorithm.getSnapFraction(reentryBounds);
|
||||
|
||||
mPipBoundsState.saveReentryState(reentryBounds, reentrySnapFraction);
|
||||
|
||||
final Rect destinationBounds = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
|
||||
assertBoundsInclusionWithMargin("restoreLastPosition", reentryBounds, destinationBounds);
|
||||
}
|
||||
@@ -240,10 +240,10 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
public void setShelfHeight_offsetBounds() {
|
||||
final int shelfHeight = 100;
|
||||
mPipBoundsState.setAspectRatio(DEFAULT_ASPECT_RATIO);
|
||||
final Rect oldPosition = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect oldPosition = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
|
||||
mPipBoundsState.setShelfVisibility(true, shelfHeight);
|
||||
final Rect newPosition = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect newPosition = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
|
||||
oldPosition.offset(0, -shelfHeight);
|
||||
assertBoundsInclusionWithMargin("offsetBounds by shelf", oldPosition, newPosition);
|
||||
@@ -253,10 +253,10 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
public void onImeVisibilityChanged_offsetBounds() {
|
||||
final int imeHeight = 100;
|
||||
mPipBoundsState.setAspectRatio(DEFAULT_ASPECT_RATIO);
|
||||
final Rect oldPosition = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect oldPosition = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
|
||||
mPipBoundsState.setImeVisibility(true, imeHeight);
|
||||
final Rect newPosition = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect newPosition = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
|
||||
oldPosition.offset(0, -imeHeight);
|
||||
assertBoundsInclusionWithMargin("offsetBounds by IME", oldPosition, newPosition);
|
||||
@@ -265,11 +265,11 @@ public class PipBoundsHandlerTest extends ShellTestCase {
|
||||
@Test
|
||||
public void getEntryDestinationBounds_noReentryState_useDefaultBounds() {
|
||||
mPipBoundsState.setAspectRatio(DEFAULT_ASPECT_RATIO);
|
||||
final Rect defaultBounds = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect defaultBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
|
||||
mPipBoundsState.clearReentryState();
|
||||
|
||||
final Rect actualBounds = mPipBoundsHandler.getEntryDestinationBounds();
|
||||
final Rect actualBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
|
||||
|
||||
assertBoundsInclusionWithMargin("useDefaultBounds", defaultBounds, actualBounds);
|
||||
}
|
||||
@@ -65,7 +65,7 @@ public class PipTaskOrganizerTest extends ShellTestCase {
|
||||
private PipTaskOrganizer mSpiedPipTaskOrganizer;
|
||||
|
||||
@Mock private DisplayController mMockdDisplayController;
|
||||
@Mock private PipBoundsHandler mMockPipBoundsHandler;
|
||||
@Mock private PipBoundsAlgorithm mMockPipBoundsAlgorithm;
|
||||
@Mock private PipMenuActivityController mMenuActivityController;
|
||||
@Mock private PipSurfaceTransactionHelper mMockPipSurfaceTransactionHelper;
|
||||
@Mock private PipUiEventLogger mMockPipUiEventLogger;
|
||||
@@ -83,7 +83,7 @@ public class PipTaskOrganizerTest extends ShellTestCase {
|
||||
mComponent2 = new ComponentName(mContext, "component2");
|
||||
mPipBoundsState = new PipBoundsState(mContext);
|
||||
mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext, mPipBoundsState,
|
||||
mMockPipBoundsHandler, mMenuActivityController, mMockPipSurfaceTransactionHelper,
|
||||
mMockPipBoundsAlgorithm, mMenuActivityController, mMockPipSurfaceTransactionHelper,
|
||||
mMockOptionalSplitScreen, mMockdDisplayController, mMockPipUiEventLogger,
|
||||
mMockShellTaskOrganizer));
|
||||
preparePipTaskOrg();
|
||||
@@ -192,8 +192,8 @@ public class PipTaskOrganizerTest extends ShellTestCase {
|
||||
private void preparePipTaskOrg() {
|
||||
final DisplayInfo info = new DisplayInfo();
|
||||
mPipBoundsState.setDisplayInfo(info);
|
||||
when(mMockPipBoundsHandler.getEntryDestinationBounds()).thenReturn(new Rect());
|
||||
when(mMockPipBoundsHandler.getAdjustedDestinationBounds(any(), anyFloat()))
|
||||
when(mMockPipBoundsAlgorithm.getEntryDestinationBounds()).thenReturn(new Rect());
|
||||
when(mMockPipBoundsAlgorithm.getAdjustedDestinationBounds(any(), anyFloat()))
|
||||
.thenReturn(new Rect());
|
||||
mPipBoundsState.setDisplayInfo(info);
|
||||
mSpiedPipTaskOrganizer.setOneShotAnimationType(PipAnimationController.ANIM_TYPE_ALPHA);
|
||||
|
||||
@@ -40,7 +40,7 @@ import com.android.wm.shell.WindowManagerShellWrapper;
|
||||
import com.android.wm.shell.common.DisplayController;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.common.TaskStackListenerImpl;
|
||||
import com.android.wm.shell.pip.PipBoundsHandler;
|
||||
import com.android.wm.shell.pip.PipBoundsAlgorithm;
|
||||
import com.android.wm.shell.pip.PipBoundsState;
|
||||
import com.android.wm.shell.pip.PipMediaController;
|
||||
import com.android.wm.shell.pip.PipTaskOrganizer;
|
||||
@@ -63,7 +63,7 @@ public class PipControllerTest extends ShellTestCase {
|
||||
@Mock private DisplayController mMockDisplayController;
|
||||
@Mock private PipMenuActivityController mMockPipMenuActivityController;
|
||||
@Mock private PipAppOpsListener mMockPipAppOpsListener;
|
||||
@Mock private PipBoundsHandler mMockPipBoundsHandler;
|
||||
@Mock private PipBoundsAlgorithm mMockPipBoundsAlgorithm;
|
||||
@Mock private PipMediaController mMockPipMediaController;
|
||||
@Mock private PipTaskOrganizer mMockPipTaskOrganizer;
|
||||
@Mock private PipTouchHandler mMockPipTouchHandler;
|
||||
@@ -76,7 +76,7 @@ public class PipControllerTest extends ShellTestCase {
|
||||
public void setUp() throws RemoteException {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mPipController = new PipController(mContext, mMockDisplayController,
|
||||
mMockPipAppOpsListener, mMockPipBoundsHandler, mMockPipBoundsState,
|
||||
mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState,
|
||||
mMockPipMediaController, mMockPipMenuActivityController, mMockPipTaskOrganizer,
|
||||
mMockPipTouchHandler, mMockWindowManagerShellWrapper, mMockTaskStackListener,
|
||||
mMockExecutor);
|
||||
@@ -109,7 +109,7 @@ public class PipControllerTest extends ShellTestCase {
|
||||
when(spyContext.getPackageManager()).thenReturn(mockPackageManager);
|
||||
|
||||
assertNull(PipController.create(spyContext, mMockDisplayController,
|
||||
mMockPipAppOpsListener, mMockPipBoundsHandler, mMockPipBoundsState,
|
||||
mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState,
|
||||
mMockPipMediaController, mMockPipMenuActivityController, mMockPipTaskOrganizer,
|
||||
mMockPipTouchHandler, mMockWindowManagerShellWrapper, mMockTaskStackListener,
|
||||
mMockExecutor));
|
||||
|
||||
@@ -33,7 +33,7 @@ import androidx.test.filters.SmallTest;
|
||||
import com.android.wm.shell.R;
|
||||
import com.android.wm.shell.ShellTestCase;
|
||||
import com.android.wm.shell.common.FloatingContentCoordinator;
|
||||
import com.android.wm.shell.pip.PipBoundsHandler;
|
||||
import com.android.wm.shell.pip.PipBoundsAlgorithm;
|
||||
import com.android.wm.shell.pip.PipBoundsState;
|
||||
import com.android.wm.shell.pip.PipSnapAlgorithm;
|
||||
import com.android.wm.shell.pip.PipTaskOrganizer;
|
||||
@@ -72,7 +72,7 @@ public class PipTouchHandlerTest extends ShellTestCase {
|
||||
private PipUiEventLogger mPipUiEventLogger;
|
||||
|
||||
private PipBoundsState mPipBoundsState;
|
||||
private PipBoundsHandler mPipBoundsHandler;
|
||||
private PipBoundsAlgorithm mPipBoundsAlgorithm;
|
||||
private PipSnapAlgorithm mPipSnapAlgorithm;
|
||||
private PipMotionHelper mMotionHelper;
|
||||
private PipResizeGestureHandler mPipResizeGestureHandler;
|
||||
@@ -89,12 +89,12 @@ public class PipTouchHandlerTest extends ShellTestCase {
|
||||
public void setUp() throws Exception {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mPipBoundsState = new PipBoundsState(mContext);
|
||||
mPipBoundsHandler = new PipBoundsHandler(mContext, mPipBoundsState);
|
||||
mPipSnapAlgorithm = mPipBoundsHandler.getSnapAlgorithm();
|
||||
mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState);
|
||||
mPipSnapAlgorithm = mPipBoundsAlgorithm.getSnapAlgorithm();
|
||||
mPipSnapAlgorithm = new PipSnapAlgorithm(mContext);
|
||||
mPipTouchHandler = new PipTouchHandler(mContext, mPipMenuActivityController,
|
||||
mPipBoundsHandler, mPipBoundsState, mPipTaskOrganizer, mFloatingContentCoordinator,
|
||||
mPipUiEventLogger);
|
||||
mPipBoundsAlgorithm, mPipBoundsState, mPipTaskOrganizer,
|
||||
mFloatingContentCoordinator, mPipUiEventLogger);
|
||||
mMotionHelper = Mockito.spy(mPipTouchHandler.getMotionHelper());
|
||||
mPipResizeGestureHandler = Mockito.spy(mPipTouchHandler.getPipResizeGestureHandler());
|
||||
mPipTouchHandler.setPipMotionHelper(mMotionHelper);
|
||||
|
||||
Reference in New Issue
Block a user