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

Commit f04796f3 authored by Mina Granic's avatar Mina Granic
Browse files

Remove a duplicate method in camera compat.

Also do a few smaller automatic cleanups.

Flag: com.android.window.flags.enable_camera_compat_for_desktop_windowing
Fixes: 371176245
Test: atest WmTests:CameraCompatFreeformPolicyTests
Change-Id: I9890ffdb6e8dbb87d099c95e1a3842c31dc18a8b
parent 92743979
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -165,7 +165,7 @@ class AppCompatCameraOverrides {
     *
     * <p>The treatment is enabled when the following conditions are met:
     * <ul>
     * <li>Property gating the camera compatibility free-form treatment is enabled.
     * <li>Feature flag gating the camera compatibility free-form treatment is enabled.
     * <li>Activity isn't opted out by the device manufacturer with override.
     * </ul>
     */
+2 −23
Original line number Diff line number Diff line
@@ -38,7 +38,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.CameraCompatTaskInfo;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.view.DisplayInfo;
import android.view.Surface;
@@ -46,7 +45,6 @@ import android.view.Surface;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.ProtoLog;
import com.android.internal.protolog.WmProtoLogGroups;
import com.android.window.flags.Flags;

/**
 * Policy for camera compatibility freeform treatment.
@@ -124,26 +122,6 @@ final class CameraCompatFreeformPolicy implements CameraStateMonitor.CameraCompa
        return appBoundsChanged || displayRotationChanged;
    }

    /**
     * Whether activity is eligible for camera compatibility free-form treatment.
     *
     * <p>The treatment is applied to a fixed-orientation camera activity in free-form windowing
     * mode. The treatment letterboxes or pillarboxes the activity to the expected orientation and
     * provides changes to the camera and display orientation signals to match those expected on a
     * portrait device in that orientation (for example, on a standard phone).
     *
     * <p>The treatment is enabled when the following conditions are met:
     * <ul>
     *     <li>Property gating the camera compatibility free-form treatment is enabled.
     *     <li>Activity isn't opted out by the device manufacturer with override.
     * </ul>
     */
    @VisibleForTesting
    boolean isCameraCompatForFreeformEnabledForActivity(@NonNull ActivityRecord activity) {
        return Flags.enableCameraCompatForDesktopWindowing() && !activity.info.isChangeEnabled(
                ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT);
    }

    @Override
    public void onCameraOpened(@NonNull ActivityRecord cameraActivity,
            @NonNull String cameraId) {
@@ -277,7 +255,8 @@ final class CameraCompatFreeformPolicy implements CameraStateMonitor.CameraCompa
    boolean isTreatmentEnabledForActivity(@NonNull ActivityRecord activity,
            boolean checkOrientation) {
        int orientation = activity.getRequestedConfigurationOrientation();
        return isCameraCompatForFreeformEnabledForActivity(activity)
        return activity.mAppCompatController.getAppCompatCameraOverrides()
                .shouldApplyFreeformTreatmentForCameraCompat()
                && mCameraStateMonitor.isCameraRunningForActivity(activity)
                && (!checkOrientation || orientation != ORIENTATION_UNDEFINED)
                && activity.inFreeformWindowingMode()
+24 −26
Original line number Diff line number Diff line
@@ -96,53 +96,46 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase {
    private static final String TEST_PACKAGE_1 = "com.android.frameworks.wmtests";
    private static final String TEST_PACKAGE_2 = "com.test.package.two";
    private static final String CAMERA_ID_1 = "camera-1";
    private static final String CAMERA_ID_2 = "camera-2";
    private CameraManager mMockCameraManager;
    private Handler mMockHandler;
    private AppCompatConfiguration mAppCompatConfiguration;

    private CameraManager.AvailabilityCallback mCameraAvailabilityCallback;
    private CameraCompatFreeformPolicy mCameraCompatFreeformPolicy;
    private ActivityRecord mActivity;
    private Task mTask;
    private ActivityRefresher mActivityRefresher;

    @Before
    public void setUp() throws Exception {
        mAppCompatConfiguration = mDisplayContent.mWmService.mAppCompatConfiguration;
        spyOn(mAppCompatConfiguration);
        when(mAppCompatConfiguration.isCameraCompatTreatmentEnabled())
                .thenReturn(true);
        when(mAppCompatConfiguration.isCameraCompatRefreshEnabled())
                .thenReturn(true);
        when(mAppCompatConfiguration.isCameraCompatTreatmentEnabled()).thenReturn(true);
        when(mAppCompatConfiguration.isCameraCompatRefreshEnabled()).thenReturn(true);
        when(mAppCompatConfiguration.isCameraCompatRefreshCycleThroughStopEnabled())
                .thenReturn(true);

        mMockCameraManager = mock(CameraManager.class);
        final CameraManager mockCameraManager = mock(CameraManager.class);
        doAnswer(invocation -> {
            mCameraAvailabilityCallback = invocation.getArgument(1);
            return null;
        }).when(mMockCameraManager).registerAvailabilityCallback(
        }).when(mockCameraManager).registerAvailabilityCallback(
                any(Executor.class), any(CameraManager.AvailabilityCallback.class));

        when(mContext.getSystemService(CameraManager.class)).thenReturn(mMockCameraManager);
        when(mContext.getSystemService(CameraManager.class)).thenReturn(mockCameraManager);

        mDisplayContent.setIgnoreOrientationRequest(true);

        mMockHandler = mock(Handler.class);
        final Handler mockHandler = mock(Handler.class);

        when(mMockHandler.postDelayed(any(Runnable.class), anyLong())).thenAnswer(
        when(mockHandler.postDelayed(any(Runnable.class), anyLong())).thenAnswer(
                invocation -> {
                    ((Runnable) invocation.getArgument(0)).run();
                    return null;
                });

        mActivityRefresher = new ActivityRefresher(mDisplayContent.mWmService, mMockHandler);
        CameraStateMonitor cameraStateMonitor =
                new CameraStateMonitor(mDisplayContent, mMockHandler);
        mCameraCompatFreeformPolicy =
                new CameraCompatFreeformPolicy(mDisplayContent, cameraStateMonitor,
                        mActivityRefresher);
        mActivityRefresher = new ActivityRefresher(mDisplayContent.mWmService, mockHandler);
        final CameraStateMonitor cameraStateMonitor = new CameraStateMonitor(mDisplayContent,
                mockHandler);
        mCameraCompatFreeformPolicy = new CameraCompatFreeformPolicy(mDisplayContent,
                cameraStateMonitor, mActivityRefresher);

        setDisplayRotation(Surface.ROTATION_90);
        mCameraCompatFreeformPolicy.start();
@@ -250,10 +243,12 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase {
    public void testShouldApplyCameraCompatFreeformTreatment_overrideEnabled_returnsFalse() {
        configureActivity(SCREEN_ORIENTATION_PORTRAIT);

        mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);

        assertTrue(mActivity.info
                .isChangeEnabled(OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT));
        assertFalse(mCameraCompatFreeformPolicy.isCameraCompatForFreeformEnabledForActivity(
                mActivity));
        assertFalse(mCameraCompatFreeformPolicy.isTreatmentEnabledForActivity(
                mActivity, /*  checkOrientation= */ true));
    }

    @Test
@@ -261,8 +256,10 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase {
    public void testShouldApplyCameraCompatFreeformTreatment_notDisabledByOverride_returnsTrue() {
        configureActivity(SCREEN_ORIENTATION_PORTRAIT);

        assertTrue(mCameraCompatFreeformPolicy.isCameraCompatForFreeformEnabledForActivity(
                mActivity));
        mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);

        assertTrue(mCameraCompatFreeformPolicy.isTreatmentEnabledForActivity(
                mActivity, /*  checkOrientation= */ true));
    }

    @Test
@@ -406,7 +403,7 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase {

    private void configureActivityAndDisplay(@ScreenOrientation int activityOrientation,
            @Orientation int naturalOrientation, @WindowingMode int windowingMode) {
        mTask = new TaskBuilder(mSupervisor)
        final Task task = new TaskBuilder(mSupervisor)
                .setDisplay(mDisplayContent)
                .setWindowingMode(windowingMode)
                .build();
@@ -416,7 +413,7 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase {
                .setComponent(ComponentName.createRelative(mContext,
                        com.android.server.wm.CameraCompatFreeformPolicyTests.class.getName()))
                .setScreenOrientation(activityOrientation)
                .setTask(mTask)
                .setTask(task)
                .build();

        spyOn(mActivity.mAppCompatController.getAppCompatCameraOverrides());
@@ -471,7 +468,8 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase {

    private Configuration createConfiguration(boolean letterbox) {
        final Configuration configuration = new Configuration();
        Rect bounds = letterbox ? new Rect(300, 0, 700, 600) : new Rect(0, 0, 1000, 600);
        Rect bounds = letterbox ? new Rect(/*left*/ 300, /*top*/ 0, /*right*/ 700, /*bottom*/ 600)
                : new Rect(/*left*/ 0, /*top*/ 0, /*right*/ 1000, /*bottom*/ 600);
        configuration.windowConfiguration.setAppBounds(bounds);
        return configuration;
    }