Merge "Make the aspect ratio for multi-windowed apps 1.01 for small screens" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
75696bcbe2
@@ -223,6 +223,7 @@ import static com.android.server.wm.ActivityTaskSupervisor.PRESERVE_WINDOWS;
|
|||||||
import static com.android.server.wm.IdentifierProto.HASH_CODE;
|
import static com.android.server.wm.IdentifierProto.HASH_CODE;
|
||||||
import static com.android.server.wm.IdentifierProto.TITLE;
|
import static com.android.server.wm.IdentifierProto.TITLE;
|
||||||
import static com.android.server.wm.IdentifierProto.USER_ID;
|
import static com.android.server.wm.IdentifierProto.USER_ID;
|
||||||
|
import static com.android.server.wm.LetterboxConfiguration.DEFAULT_LETTERBOX_ASPECT_RATIO_FOR_MULTI_WINDOW;
|
||||||
import static com.android.server.wm.LetterboxConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
|
import static com.android.server.wm.LetterboxConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
|
||||||
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
|
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
|
||||||
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS;
|
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS;
|
||||||
@@ -8794,9 +8795,18 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
|||||||
|
|
||||||
final float letterboxAspectRatioOverride =
|
final float letterboxAspectRatioOverride =
|
||||||
mLetterboxUiController.getFixedOrientationLetterboxAspectRatio(newParentConfig);
|
mLetterboxUiController.getFixedOrientationLetterboxAspectRatio(newParentConfig);
|
||||||
final float desiredAspectRatio =
|
|
||||||
letterboxAspectRatioOverride > MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO
|
// Aspect ratio as suggested by the system. Apps requested mix/max aspect ratio will
|
||||||
? letterboxAspectRatioOverride : computeAspectRatio(parentBounds);
|
// be respected in #applyAspectRatio.
|
||||||
|
final float desiredAspectRatio;
|
||||||
|
if (isDefaultMultiWindowLetterboxAspectRatioDesired(newParentConfig)) {
|
||||||
|
desiredAspectRatio = DEFAULT_LETTERBOX_ASPECT_RATIO_FOR_MULTI_WINDOW;
|
||||||
|
} else if (letterboxAspectRatioOverride > MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO) {
|
||||||
|
desiredAspectRatio = letterboxAspectRatioOverride;
|
||||||
|
} else {
|
||||||
|
desiredAspectRatio = computeAspectRatio(parentBounds);
|
||||||
|
}
|
||||||
|
|
||||||
// Apply aspect ratio to resolved bounds
|
// Apply aspect ratio to resolved bounds
|
||||||
mIsAspectRatioApplied = applyAspectRatio(resolvedBounds, containingBoundsWithInsets,
|
mIsAspectRatioApplied = applyAspectRatio(resolvedBounds, containingBoundsWithInsets,
|
||||||
containingBounds, desiredAspectRatio);
|
containingBounds, desiredAspectRatio);
|
||||||
@@ -8821,6 +8831,20 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
|||||||
mLetterboxBoundsForFixedOrientationAndAspectRatio = new Rect(resolvedBounds);
|
mLetterboxBoundsForFixedOrientationAndAspectRatio = new Rect(resolvedBounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns {@code true} if the default aspect ratio for a letterboxed app in multi-window mode
|
||||||
|
* should be used.
|
||||||
|
*/
|
||||||
|
private boolean isDefaultMultiWindowLetterboxAspectRatioDesired(
|
||||||
|
@NonNull Configuration parentConfig) {
|
||||||
|
if (mDisplayContent == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final int windowingMode = parentConfig.windowConfiguration.getWindowingMode();
|
||||||
|
return WindowConfiguration.inMultiWindowMode(windowingMode)
|
||||||
|
&& !mDisplayContent.getIgnoreOrientationRequest();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolves aspect ratio restrictions for an activity. If the bounds are restricted by
|
* Resolves aspect ratio restrictions for an activity. If the bounds are restricted by
|
||||||
* aspect ratio, the position will be adjusted later in {@link #updateResolvedBoundsPosition
|
* aspect ratio, the position will be adjusted later in {@link #updateResolvedBoundsPosition
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ final class LetterboxConfiguration {
|
|||||||
*/
|
*/
|
||||||
static final float MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO = 1.0f;
|
static final float MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO = 1.0f;
|
||||||
|
|
||||||
|
/** The default aspect ratio for a letterboxed app in multi-window mode. */
|
||||||
|
static final float DEFAULT_LETTERBOX_ASPECT_RATIO_FOR_MULTI_WINDOW = 1.01f;
|
||||||
|
|
||||||
/** Letterboxed app window position multiplier indicating center position. */
|
/** Letterboxed app window position multiplier indicating center position. */
|
||||||
static final float LETTERBOX_POSITION_MULTIPLIER_CENTER = 0.5f;
|
static final float LETTERBOX_POSITION_MULTIPLIER_CENTER = 0.5f;
|
||||||
|
|
||||||
|
|||||||
@@ -2045,6 +2045,72 @@ public class SizeCompatTests extends WindowTestsBase {
|
|||||||
activityBounds.width());
|
activityBounds.width());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDefaultLetterboxAspectRatioForMultiWindowMode_fixedOrientationApp() {
|
||||||
|
// Set-up display in portrait.
|
||||||
|
mAtm.mDevEnableNonResizableMultiWindow = true;
|
||||||
|
final int screenWidth = 1100;
|
||||||
|
final int screenHeight = 2100;
|
||||||
|
setUpDisplaySizeWithApp(screenWidth, screenHeight);
|
||||||
|
|
||||||
|
mActivity.mDisplayContent.getWindowConfiguration()
|
||||||
|
.setAppBounds(/* left */ 0, /* top */ 0, screenWidth, screenHeight);
|
||||||
|
|
||||||
|
final TestSplitOrganizer organizer =
|
||||||
|
new TestSplitOrganizer(mAtm, mActivity.getDisplayContent());
|
||||||
|
// Move activity to multi-window which takes half of the screen.
|
||||||
|
mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test");
|
||||||
|
organizer.mPrimary.setBounds(0, 0, screenWidth, getExpectedSplitSize(screenHeight));
|
||||||
|
assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode());
|
||||||
|
assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode());
|
||||||
|
|
||||||
|
// Unresizable portrait-only activity.
|
||||||
|
prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
|
||||||
|
|
||||||
|
// Activity should be letterboxed with an aspect ratio of 1.01.
|
||||||
|
final Rect afterBounds = mActivity.getBounds();
|
||||||
|
final float actualAspectRatio = 1f * afterBounds.height() / afterBounds.width();
|
||||||
|
assertEquals(LetterboxConfiguration.DEFAULT_LETTERBOX_ASPECT_RATIO_FOR_MULTI_WINDOW,
|
||||||
|
actualAspectRatio, 0.001f);
|
||||||
|
assertTrue(mActivity.areBoundsLetterboxed());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void
|
||||||
|
testDefaultLetterboxAspectRatioForMultiWindowMode_fixedOrientationAppWithMinRatio() {
|
||||||
|
// Set-up display in portrait.
|
||||||
|
mAtm.mDevEnableNonResizableMultiWindow = true;
|
||||||
|
final int screenWidth = 1100;
|
||||||
|
final int screenHeight = 2100;
|
||||||
|
setUpDisplaySizeWithApp(screenWidth, screenHeight);
|
||||||
|
|
||||||
|
mActivity.mDisplayContent.getWindowConfiguration()
|
||||||
|
.setAppBounds(/* left */ 0, /* top */ 0, screenWidth, screenHeight);
|
||||||
|
|
||||||
|
// Set min aspect ratio to value greater than the default letterbox aspect ratio for
|
||||||
|
// multi-window mode.
|
||||||
|
final float minAspectRatio = 1.2f;
|
||||||
|
mActivity.info.setMinAspectRatio(minAspectRatio);
|
||||||
|
|
||||||
|
final TestSplitOrganizer organizer =
|
||||||
|
new TestSplitOrganizer(mAtm, mActivity.getDisplayContent());
|
||||||
|
// Move activity to multi-window which takes half of the screen.
|
||||||
|
mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test");
|
||||||
|
organizer.mPrimary.setBounds(0, 0, screenWidth, getExpectedSplitSize(screenHeight));
|
||||||
|
assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode());
|
||||||
|
assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode());
|
||||||
|
|
||||||
|
// Unresizable portrait-only activity.
|
||||||
|
prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
|
||||||
|
|
||||||
|
// Activity should be letterboxed with the min aspect ratio requested by the app NOT the
|
||||||
|
// default letterbox aspect ratio for multi-window.
|
||||||
|
final Rect afterBounds = mActivity.getBounds();
|
||||||
|
final float actualAspectRatio = 1f * afterBounds.height() / afterBounds.width();
|
||||||
|
assertEquals(minAspectRatio, actualAspectRatio, 0.001f);
|
||||||
|
assertTrue(mActivity.areBoundsLetterboxed());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDisplayIgnoreOrientationRequest_unresizableWithCorrespondingMinAspectRatio() {
|
public void testDisplayIgnoreOrientationRequest_unresizableWithCorrespondingMinAspectRatio() {
|
||||||
// Set up a display in landscape and ignoring orientation request.
|
// Set up a display in landscape and ignoring orientation request.
|
||||||
|
|||||||
Reference in New Issue
Block a user