diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java | 17 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java | 55 | 
2 files changed, 61 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java b/services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java index f04b4af285be..8069a9335151 100644 --- a/services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java +++ b/services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java @@ -48,8 +48,15 @@ public class DesktopModeLaunchParamsModifier implements LaunchParamsModifier {      /**       * Flag to indicate whether to restrict desktop mode to supported devices.       */ +    @VisibleForTesting +    static final String ENFORCE_DEVICE_RESTRICTIONS_KEY = +            "persist.wm.debug.desktop_mode_enforce_device_restrictions"; + +    /** +     * Flag to indicate whether to restrict desktop mode to supported devices. +     */      private static final boolean ENFORCE_DEVICE_RESTRICTIONS = SystemProperties.getBoolean( -            "persist.wm.debug.desktop_mode_enforce_device_restrictions", true); +            ENFORCE_DEVICE_RESTRICTIONS_KEY, true);      private StringBuilder mLogBuilder; @@ -178,24 +185,24 @@ public class DesktopModeLaunchParamsModifier implements LaunchParamsModifier {       * Return {@code true} if desktop mode should be restricted to supported devices.       */      @VisibleForTesting -    public boolean enforceDeviceRestrictions() { +    static boolean enforceDeviceRestrictions() {          return ENFORCE_DEVICE_RESTRICTIONS;      }      /**       * Return {@code true} if the current device supports desktop mode.       */ +    // TODO(b/337819319): use a companion object instead.      @VisibleForTesting -    public boolean isDesktopModeSupported(@NonNull Context context) { +    static boolean isDesktopModeSupported(@NonNull Context context) {          return context.getResources().getBoolean(R.bool.config_isDesktopModeSupported);      }      /**       * Return {@code true} if desktop mode can be entered on the current device.       */ -    boolean canEnterDesktopMode(@NonNull Context context) { +    static boolean canEnterDesktopMode(@NonNull Context context) {          return isDesktopModeEnabled()                  && (!enforceDeviceRestrictions() || isDesktopModeSupported(context));      } -  } diff --git a/services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java index 353ba01d3cf4..89ae802f474c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java @@ -22,6 +22,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;  import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;  import static com.android.server.wm.DesktopModeLaunchParamsModifier.DESKTOP_MODE_INITIAL_BOUNDS_SCALE; +import static com.android.server.wm.DesktopModeLaunchParamsModifier.ENFORCE_DEVICE_RESTRICTIONS_KEY;  import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.PHASE_BOUNDS;  import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.PHASE_DISPLAY;  import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.RESULT_CONTINUE; @@ -29,18 +30,21 @@ import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.  import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.RESULT_SKIP;  import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq;  import static org.mockito.Mockito.doReturn;  import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; +import android.content.res.Resources;  import android.graphics.Rect; +import android.os.SystemProperties;  import android.platform.test.annotations.DisableFlags;  import android.platform.test.annotations.EnableFlags;  import android.platform.test.annotations.Presubmit;  import androidx.test.filters.SmallTest; +import com.android.internal.R;  import com.android.server.wm.LaunchParamsController.LaunchParamsModifier.Result;  import com.android.window.flags.Flags; @@ -48,6 +52,7 @@ import org.junit.Before;  import org.junit.Test;  import org.junit.runner.RunWith;  import org.mockito.Mock; +import org.mockito.Mockito;  /**   * Tests for desktop mode task bounds. @@ -71,8 +76,6 @@ public class DesktopModeLaunchParamsModifierTests extends WindowTestsBase {      @Before      public void setUp() throws Exception {          mActivity = new ActivityBuilder(mAtm).build(); -        mTarget = spy(new DesktopModeLaunchParamsModifier(mContext)); -        doReturn(true).when(mTarget).isDesktopModeSupported(any());          mCurrent = new LaunchParamsController.LaunchParams();          mCurrent.reset();          mResult = new LaunchParamsController.LaunchParams(); @@ -82,20 +85,26 @@ public class DesktopModeLaunchParamsModifierTests extends WindowTestsBase {      @Test      @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testReturnsContinueIfDesktopWindowingIsDisabled() { +        setupDesktopModeLaunchParamsModifier(); +          assertEquals(RESULT_CONTINUE, new CalculateRequestBuilder().setTask(null).calculate());      }      @Test      @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testReturnsContinueIfDesktopWindowingIsEnabledOnUnsupportedDevice() { -        doReturn(false).when(mTarget).isDesktopModeSupported(any()); +        setupDesktopModeLaunchParamsModifier(/*isDesktopModeSupported=*/ false, +                /*enforceDeviceRestrictions=*/ true); +          assertEquals(RESULT_CONTINUE, new CalculateRequestBuilder().setTask(null).calculate());      }      @Test      @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testReturnsDoneIfDesktopWindowingIsEnabledAndUnsupportedDeviceOverridden() { -        doReturn(false).when(mTarget).enforceDeviceRestrictions(); +        setupDesktopModeLaunchParamsModifier(/*isDesktopModeSupported=*/ true, +                /*enforceDeviceRestrictions=*/ false); +          final Task task = new TaskBuilder(mSupervisor).build();          assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(task).calculate());      } @@ -103,12 +112,16 @@ public class DesktopModeLaunchParamsModifierTests extends WindowTestsBase {      @Test      @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testReturnsSkipIfTaskIsNull() { +        setupDesktopModeLaunchParamsModifier(); +          assertEquals(RESULT_SKIP, new CalculateRequestBuilder().setTask(null).calculate());      }      @Test      @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testReturnsSkipIfNotBoundsPhase() { +        setupDesktopModeLaunchParamsModifier(); +          final Task task = new TaskBuilder(mSupervisor).build();          assertEquals(RESULT_SKIP, new CalculateRequestBuilder().setTask(task).setPhase(                  PHASE_DISPLAY).calculate()); @@ -117,6 +130,8 @@ public class DesktopModeLaunchParamsModifierTests extends WindowTestsBase {      @Test      @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testReturnsSkipIfTaskNotUsingActivityTypeStandardOrUndefined() { +        setupDesktopModeLaunchParamsModifier(); +          final Task task = new TaskBuilder(mSupervisor).setActivityType(                  ACTIVITY_TYPE_ASSISTANT).build();          assertEquals(RESULT_SKIP, new CalculateRequestBuilder().setTask(task).calculate()); @@ -125,6 +140,8 @@ public class DesktopModeLaunchParamsModifierTests extends WindowTestsBase {      @Test      @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testReturnsDoneIfTaskUsingActivityTypeStandard() { +        setupDesktopModeLaunchParamsModifier(); +          final Task task = new TaskBuilder(mSupervisor).setActivityType(                  ACTIVITY_TYPE_STANDARD).build();          assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(task).calculate()); @@ -133,6 +150,8 @@ public class DesktopModeLaunchParamsModifierTests extends WindowTestsBase {      @Test      @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testReturnsDoneIfTaskUsingActivityTypeUndefined() { +        setupDesktopModeLaunchParamsModifier(); +          final Task task = new TaskBuilder(mSupervisor).setActivityType(                  ACTIVITY_TYPE_UNDEFINED).build();          assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(task).calculate()); @@ -141,6 +160,8 @@ public class DesktopModeLaunchParamsModifierTests extends WindowTestsBase {      @Test      @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testReturnsSkipIfCurrentParamsHasBounds() { +        setupDesktopModeLaunchParamsModifier(); +          final Task task = new TaskBuilder(mSupervisor).setActivityType(                  ACTIVITY_TYPE_STANDARD).build();          mCurrent.mBounds.set(/* left */ 0, /* top */ 0, /* right */ 100, /* bottom */ 100); @@ -150,6 +171,8 @@ public class DesktopModeLaunchParamsModifierTests extends WindowTestsBase {      @Test      @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testUsesDefaultBounds() { +        setupDesktopModeLaunchParamsModifier(); +          final Task task = new TaskBuilder(mSupervisor).setActivityType(                  ACTIVITY_TYPE_STANDARD).build();          final int displayHeight = 1600; @@ -165,6 +188,8 @@ public class DesktopModeLaunchParamsModifierTests extends WindowTestsBase {      @Test      @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)      public void testUsesDisplayAreaAndWindowingModeFromSource() { +        setupDesktopModeLaunchParamsModifier(); +          final Task task = new TaskBuilder(mSupervisor).setActivityType(                  ACTIVITY_TYPE_STANDARD).build();          TaskDisplayArea mockTaskDisplayArea = mock(TaskDisplayArea.class); @@ -176,6 +201,24 @@ public class DesktopModeLaunchParamsModifierTests extends WindowTestsBase {          assertEquals(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode);      } +    private void setupDesktopModeLaunchParamsModifier() { +        setupDesktopModeLaunchParamsModifier(/*isDesktopModeSupported=*/ true, +                /*enforceDeviceRestrictions=*/ true); +    } + +    private void setupDesktopModeLaunchParamsModifier(boolean isDesktopModeSupported, +            boolean enforceDeviceRestrictions) { +        Resources mockResources = Mockito.mock(Resources.class); +        when(mockResources.getBoolean(eq(R.bool.config_isDesktopModeSupported))) +                .thenReturn(isDesktopModeSupported); +        doReturn(mockResources).when(mContext).getResources(); + +        SystemProperties.set(ENFORCE_DEVICE_RESTRICTIONS_KEY, +                String.valueOf(enforceDeviceRestrictions)); + +        mTarget = new DesktopModeLaunchParamsModifier(mContext); +    } +      private class CalculateRequestBuilder {          private Task mTask;          private int mPhase = PHASE_BOUNDS;  |