diff options
3 files changed, 20 insertions, 65 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 8ab01f0601fe..7d5aa96db0b8 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -813,12 +813,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A      @Nullable      private Rect mLetterboxBoundsForFixedOrientationAndAspectRatio; -    // Bounds populated in resolveAspectRatioRestriction when this activity is letterboxed for -    // aspect ratio. If not null, they are used as parent container in -    // resolveSizeCompatModeConfiguration and in a constructor of CompatDisplayInsets. -    @Nullable -    private Rect mLetterboxBoundsForAspectRatio; -      // Whether the activity is eligible to be letterboxed for fixed orientation with respect to its      // requested orientation, even when it's letterbox for another reason (e.g., size compat mode)      // and therefore #isLetterboxedForFixedOrientationAndAspectRatio returns false. @@ -8408,14 +8402,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A                      fullConfig.windowConfiguration.getRotation());          } -        final Rect letterboxedContainerBounds = -                mLetterboxBoundsForFixedOrientationAndAspectRatio != null -                ? mLetterboxBoundsForFixedOrientationAndAspectRatio -                : mLetterboxBoundsForAspectRatio; -          // The role of CompatDisplayInsets is like the override bounds.          mCompatDisplayInsets = -                new CompatDisplayInsets(mDisplayContent, this, letterboxedContainerBounds); +                new CompatDisplayInsets( +                        mDisplayContent, this, mLetterboxBoundsForFixedOrientationAndAspectRatio);      }      private void clearSizeCompatModeAttributes() { @@ -8487,7 +8477,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A          mIsAspectRatioApplied = false;          mIsEligibleForFixedOrientationLetterbox = false;          mLetterboxBoundsForFixedOrientationAndAspectRatio = null; -        mLetterboxBoundsForAspectRatio = null;          // Can't use resolvedConfig.windowConfiguration.getWindowingMode() because it can be          // different from windowing mode of the task (PiP) during transition from fullscreen to PiP @@ -8522,11 +8511,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A                  getTaskFragment().computeConfigResourceOverrides(resolvedConfig,                          newParentConfiguration);              } -        }          // If activity in fullscreen mode is letterboxed because of fixed orientation then bounds -        // are already calculated in resolveFixedOrientationConfiguration, or if in size compat -        // mode, it should already be calculated in resolveSizeCompatModeConfiguration -        if (!isLetterboxedForFixedOrientationAndAspectRatio() && !mInSizeCompatModeForBounds) { +        // are already calculated in resolveFixedOrientationConfiguration. +        } else if (!isLetterboxedForFixedOrientationAndAspectRatio()) {              resolveAspectRatioRestriction(newParentConfiguration);          } @@ -8933,8 +8920,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A          }          final CompatDisplayInsets compatDisplayInsets = getCompatDisplayInsets(); -        if (compatDisplayInsets != null -                && !compatDisplayInsets.mIsInFixedOrientationOrAspectRatioLetterbox) { +        if (compatDisplayInsets != null && !compatDisplayInsets.mIsInFixedOrientationLetterbox) {              // App prefers to keep its original size.              // If the size compat is from previous fixed orientation letterboxing, we may want to              // have fixed orientation letterbox again, otherwise it will show the size compat @@ -9066,7 +9052,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A              // restrict, the bounds should be the requested override bounds.              getTaskFragment().computeConfigResourceOverrides(resolvedConfig, newParentConfiguration,                      getFixedRotationTransformDisplayInfo()); -            mLetterboxBoundsForAspectRatio = new Rect(resolvedBounds);          }      } @@ -10635,10 +10620,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A          /** Whether the {@link Task} windowingMode represents a floating window*/          final boolean mIsFloating;          /** -         * Whether is letterboxed because of fixed orientation or aspect ratio when the -         * unresizable activity is first shown. +         * Whether is letterboxed because of fixed orientation when the unresizable activity is +         * first shown.           */ -        final boolean mIsInFixedOrientationOrAspectRatioLetterbox; +        final boolean mIsInFixedOrientationLetterbox;          /**           * The nonDecorInsets for each rotation. Includes the navigation bar and cutout insets. It           * is used to compute the appBounds. @@ -10653,7 +10638,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A          /** Constructs the environment to simulate the bounds behavior of the given container. */          CompatDisplayInsets(DisplayContent display, ActivityRecord container, -                @Nullable Rect letterboxedContainerBounds) { +                @Nullable Rect fixedOrientationBounds) {              mOriginalRotation = display.getRotation();              mIsFloating = container.getWindowConfiguration().tasksAreFloating();              mOriginalRequestedOrientation = container.getRequestedConfigurationOrientation(); @@ -10668,21 +10653,22 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A                      mNonDecorInsets[rotation] = emptyRect;                      mStableInsets[rotation] = emptyRect;                  } -                mIsInFixedOrientationOrAspectRatioLetterbox = false; +                mIsInFixedOrientationLetterbox = false;                  return;              }              final Task task = container.getTask(); -            mIsInFixedOrientationOrAspectRatioLetterbox = letterboxedContainerBounds != null; +            mIsInFixedOrientationLetterbox = fixedOrientationBounds != null; +              // Store the bounds of the Task for the non-resizable activity to use in size compat              // mode so that the activity will not be resized regardless the windowing mode it is              // currently in. -            // When an activity needs to be letterboxed because of fixed orientation or aspect -            // ratio, use resolved bounds instead of task bounds since the activity will be -            // displayed within these even if it is in size compat mode. -            final Rect filledContainerBounds = mIsInFixedOrientationOrAspectRatioLetterbox -                    ? letterboxedContainerBounds +            // When an activity needs to be letterboxed because of fixed orientation, use fixed +            // orientation bounds instead of task bounds since the activity will be displayed +            // within these even if it is in size compat mode. +            final Rect filledContainerBounds = mIsInFixedOrientationLetterbox +                    ? fixedOrientationBounds                      : task != null ? task.getBounds() : display.getBounds();              final int filledContainerRotation = task != null                      ? task.getConfiguration().windowConfiguration.getRotation() diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index b6aaf77d5ab7..b96f39d7a4e1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -27,7 +27,6 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;  import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;  import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;  import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; -import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;  import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;  import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_16_9;  import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_3_2; @@ -1911,7 +1910,8 @@ public class SizeCompatTests extends WindowTestsBase {          assertThat(mActivity.inSizeCompatMode()).isTrue();          assertActivityMaxBoundsSandboxed(); -        final int scale = dh / dw; + +	final int scale = dh / dw;          // App bounds should be dh / scale x dw / scale          assertEquals(dw, rotatedDisplayBounds.width()); @@ -4101,37 +4101,6 @@ public class SizeCompatTests extends WindowTestsBase {      }      @Test -    public void testFixedAspectRatioAppInPortraitCloseToSquareDisplay_notInSizeCompat() { -        setUpDisplaySizeWithApp(2200, 2280); -        mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); -        final DisplayContent display = mActivity.mDisplayContent; -        // Simulate taskbar, final app bounds are (0, 0, 2200, 2130) - landscape -        final WindowState navbar = createWindow(null, TYPE_NAVIGATION_BAR, mDisplayContent, -                "navbar"); -        final Binder owner = new Binder(); -        navbar.mAttrs.providedInsets = new InsetsFrameProvider[] { -                new InsetsFrameProvider(owner, 0, WindowInsets.Type.navigationBars()) -                        .setInsetsSize(Insets.of(0, 0, 0, 150)) -        }; -        display.getDisplayPolicy().addWindowLw(navbar, navbar.mAttrs); -        assertTrue(navbar.providesDisplayDecorInsets() -                && display.getDisplayPolicy().updateDecorInsetsInfo()); -        display.sendNewConfiguration(); - -        prepareMinAspectRatio(mActivity, OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE, -                SCREEN_ORIENTATION_LANDSCAPE); -        // To force config to update again but with the same landscape orientation. -        mActivity.setRequestedOrientation(SCREEN_ORIENTATION_SENSOR_LANDSCAPE); - -        assertTrue(mActivity.shouldCreateCompatDisplayInsets()); -        assertNotNull(mActivity.getCompatDisplayInsets()); -        // Activity is not letterboxed for fixed orientation because orientation is respected -        // with insets, and should not be in size compat mode -        assertFalse(mActivity.isLetterboxedForFixedOrientationAndAspectRatio()); -        assertFalse(mActivity.inSizeCompatMode()); -    } - -    @Test      public void testApplyAspectRatio_activityAlignWithParentAppVertical() {          // The display's app bounds will be (0, 100, 1000, 2350)          final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2500) diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index b467acf678cb..961fdfb14bf3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -799,7 +799,7 @@ public class TaskTests extends WindowTestsBase {          final ActivityRecord activity = new ActivityBuilder(mAtm).setTask(task).build();          final ActivityRecord.CompatDisplayInsets compatInsets =                  new ActivityRecord.CompatDisplayInsets( -                        display, activity, /* letterboxedContainerBounds */ null); +                        display, activity, /* fixedOrientationBounds= */ null);          task.computeConfigResourceOverrides(inOutConfig, parentConfig, compatInsets);          assertEquals(largerLandscapeBounds, inOutConfig.windowConfiguration.getAppBounds());  |