diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/AppCompatCameraPolicy.java | 3 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java | 132 |
2 files changed, 81 insertions, 54 deletions
diff --git a/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java b/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java index 9547e5cc8ba9..6074608422d1 100644 --- a/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java +++ b/services/core/java/com/android/server/wm/AppCompatCameraPolicy.java @@ -39,7 +39,8 @@ class AppCompatCameraPolicy { @VisibleForTesting final CameraStateMonitor mCameraStateMonitor; @Nullable - private final ActivityRefresher mActivityRefresher; + @VisibleForTesting + final ActivityRefresher mActivityRefresher; @Nullable final DisplayRotationCompatPolicy mDisplayRotationCompatPolicy; @Nullable diff --git a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java index 748a47a520d1..b6f442460ec8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java @@ -26,6 +26,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.servertransaction.ActivityLifecycleItem.ON_PAUSE; import static android.app.servertransaction.ActivityLifecycleItem.ON_STOP; import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT; +import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_FULL_USER; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; @@ -44,6 +45,7 @@ import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKT import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; @@ -54,6 +56,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import android.annotation.NonNull; import android.app.CameraCompatTaskInfo; import android.app.IApplicationThread; import android.app.WindowConfiguration.WindowingMode; @@ -109,56 +112,25 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { private CameraManager.AvailabilityCallback mCameraAvailabilityCallback; private CameraCompatFreeformPolicy mCameraCompatFreeformPolicy; private ActivityRecord mActivity; - private ActivityRefresher mActivityRefresher; + // TODO(b/384465100): use a robot structure. @Before public void setUp() throws Exception { - mAppCompatConfiguration = mDisplayContent.mWmService.mAppCompatConfiguration; - spyOn(mAppCompatConfiguration); - when(mAppCompatConfiguration.isCameraCompatTreatmentEnabled()).thenReturn(true); - when(mAppCompatConfiguration.isCameraCompatRefreshEnabled()).thenReturn(true); - when(mAppCompatConfiguration.isCameraCompatRefreshCycleThroughStopEnabled()) - .thenReturn(true); - - final CameraManager mockCameraManager = mock(CameraManager.class); - doAnswer(invocation -> { - mCameraAvailabilityCallback = invocation.getArgument(1); - return null; - }).when(mockCameraManager).registerAvailabilityCallback( - any(Executor.class), any(CameraManager.AvailabilityCallback.class)); - - when(mContext.getSystemService(CameraManager.class)).thenReturn(mockCameraManager); - - mDisplayContent.setIgnoreOrientationRequest(true); - - final Handler mockHandler = mock(Handler.class); - - when(mockHandler.postDelayed(any(Runnable.class), anyLong())).thenAnswer( - invocation -> { - ((Runnable) invocation.getArgument(0)).run(); - return null; - }); - - mActivityRefresher = new ActivityRefresher(mDisplayContent.mWmService, mockHandler); - final CameraStateMonitor cameraStateMonitor = new CameraStateMonitor(mDisplayContent, - mockHandler); - mCameraCompatFreeformPolicy = new CameraCompatFreeformPolicy(mDisplayContent, - cameraStateMonitor, mActivityRefresher); - - setDisplayRotation(ROTATION_90); - mCameraCompatFreeformPolicy.start(); - cameraStateMonitor.startListeningToCameraState(); + setupAppCompatConfiguration(); + setupCameraManager(); + setupHandler(); + doReturn(true).when(() -> DesktopModeHelper.canEnterDesktopMode(any())); } @Test @DisableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING) @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT}) - public void testIsCameraRunningAndWindowingModeEligible_featureDisabled_returnsFalse() { + public void testFeatureDisabled_cameraCompatFreeformPolicyNotCreated() { configureActivity(SCREEN_ORIENTATION_PORTRAIT); mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1); - assertFalse(mCameraCompatFreeformPolicy.isCameraRunningAndWindowingModeEligible(mActivity)); + assertNull(mCameraCompatFreeformPolicy); } @Test @@ -203,17 +175,6 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { } @Test - @DisableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING) - @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT}) - public void testIsFreeformLetterboxingForCameraAllowed_featureDisabled_returnsFalse() { - configureActivity(SCREEN_ORIENTATION_PORTRAIT); - - mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1); - - assertFalse(mCameraCompatFreeformPolicy.isFreeformLetterboxingForCameraAllowed(mActivity)); - } - - @Test @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING) public void testIsFreeformLetterboxingForCameraAllowed_overrideDisabled_returnsFalse() { configureActivity(SCREEN_ORIENTATION_PORTRAIT); @@ -341,6 +302,7 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1); callOnActivityConfigurationChanging(mActivity, /* letterboxNew= */ true, /* lastLetterbox= */ false); + assertActivityRefreshRequested(/* refreshRequested */ true); mCameraAvailabilityCallback.onCameraClosed(CAMERA_ID_1); mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1); // Activity is letterboxed from the previous configuration change. @@ -556,6 +518,40 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { assertCompatibilityInfoSentWithDisplayRotation(ROTATION_90); } + private void setupAppCompatConfiguration() { + mAppCompatConfiguration = mDisplayContent.mWmService.mAppCompatConfiguration; + spyOn(mAppCompatConfiguration); + when(mAppCompatConfiguration.isCameraCompatTreatmentEnabled()).thenReturn(true); + when(mAppCompatConfiguration.isCameraCompatTreatmentEnabledAtBuildTime()).thenReturn(true); + when(mAppCompatConfiguration.isCameraCompatRefreshEnabled()).thenReturn(true); + when(mAppCompatConfiguration.isCameraCompatSplitScreenAspectRatioEnabled()) + .thenReturn(false); + when(mAppCompatConfiguration.isCameraCompatRefreshCycleThroughStopEnabled()) + .thenReturn(true); + } + + private void setupCameraManager() { + final CameraManager mockCameraManager = mock(CameraManager.class); + doAnswer(invocation -> { + mCameraAvailabilityCallback = invocation.getArgument(1); + return null; + }).when(mockCameraManager).registerAvailabilityCallback( + any(Executor.class), any(CameraManager.AvailabilityCallback.class)); + + when(mContext.getSystemService(CameraManager.class)).thenReturn(mockCameraManager); + } + + private void setupHandler() { + final Handler handler = mDisplayContent.mWmService.mH; + spyOn(handler); + + when(handler.postDelayed(any(Runnable.class), anyLong())).thenAnswer( + invocation -> { + ((Runnable) invocation.getArgument(0)).run(); + return null; + }); + } + private void configureActivity(@ScreenOrientation int activityOrientation) { configureActivity(activityOrientation, WINDOWING_MODE_FREEFORM); } @@ -567,28 +563,57 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { private void configureActivityAndDisplay(@ScreenOrientation int activityOrientation, @Orientation int naturalOrientation, @WindowingMode int windowingMode) { + setupDisplayContent(naturalOrientation); + final Task task = setupTask(windowingMode); + setupActivity(task, activityOrientation, windowingMode); + setupMockApplicationThread(); + + mCameraCompatFreeformPolicy = mDisplayContent.mAppCompatCameraPolicy + .mCameraCompatFreeformPolicy; + } + + private void setupDisplayContent(@Orientation int naturalOrientation) { + // Create a new DisplayContent so that the flag values create the camera freeform policy. + mDisplayContent = new TestDisplayContent.Builder(mAtm, mDisplayContent.getSurfaceWidth(), + mDisplayContent.getSurfaceHeight()).build(); + mDisplayContent.setIgnoreOrientationRequest(true); + setDisplayRotation(ROTATION_90); + doReturn(naturalOrientation).when(mDisplayContent).getNaturalOrientation(); + } + + private Task setupTask(@WindowingMode int windowingMode) { + final TaskDisplayArea tda = mDisplayContent.getDefaultTaskDisplayArea(); + spyOn(tda); + doReturn(true).when(tda).supportsNonResizableMultiWindow(); + final Task task = new TaskBuilder(mSupervisor) .setDisplay(mDisplayContent) .setWindowingMode(windowingMode) .build(); + task.setBounds(0, 0, 1000, 500); + return task; + } + private void setupActivity(@NonNull Task task, @ScreenOrientation int activityOrientation, + @WindowingMode int windowingMode) { mActivity = new ActivityBuilder(mAtm) // Set the component to be that of the test class in order to enable compat changes .setComponent(ComponentName.createRelative(mContext, com.android.server.wm.CameraCompatFreeformPolicyTests.class.getName())) .setScreenOrientation(activityOrientation) + .setResizeMode(RESIZE_MODE_RESIZEABLE) + .setCreateTask(true) + .setOnTop(true) .setTask(task) .build(); + mActivity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); spyOn(mActivity.mAppCompatController.getAppCompatCameraOverrides()); spyOn(mActivity.info); doReturn(mActivity).when(mDisplayContent).topRunningActivity(anyBoolean()); - doReturn(naturalOrientation).when(mDisplayContent).getNaturalOrientation(); - doReturn(windowingMode == WINDOWING_MODE_FREEFORM).when(mActivity) .inFreeformWindowingMode(); - setupMockApplicationThread(); } private void assertInCameraCompatMode(@CameraCompatTaskInfo.FreeformCameraCompatMode int mode) { @@ -625,7 +650,8 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { private void callOnActivityConfigurationChanging(ActivityRecord activity, boolean letterboxNew, boolean lastLetterbox) { - mActivityRefresher.onActivityConfigurationChanging(activity, + mDisplayContent.mAppCompatCameraPolicy.mActivityRefresher + .onActivityConfigurationChanging(activity, /* newConfig */ createConfiguration(letterboxNew), /* lastReportedConfig */ createConfiguration(lastLetterbox)); } |