diff options
author | 2024-08-02 11:50:09 +0000 | |
---|---|---|
committer | 2024-08-02 11:50:09 +0000 | |
commit | fd593b79b5e1e564d862318e6bb536f36a2421a5 (patch) | |
tree | b0cbd09f504bbf457ad39ae5c51d99bb888c55a3 | |
parent | d3d3e7ba2397e2423a6436900b6c1441dc84abb1 (diff) | |
parent | 6c4ac83101991e92ecfddd3a86bce6464b0bb37b (diff) |
Merge "Create inset adjusted alternative to `topActivityLetterboxHeight`" into main
5 files changed, 73 insertions, 23 deletions
diff --git a/core/java/android/app/AppCompatTaskInfo.java b/core/java/android/app/AppCompatTaskInfo.java index a07f620d944c..a6d3f9dba080 100644 --- a/core/java/android/app/AppCompatTaskInfo.java +++ b/core/java/android/app/AppCompatTaskInfo.java @@ -16,6 +16,8 @@ package android.app; +import static android.app.TaskInfo.PROPERTY_VALUE_UNSET; + import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Parcel; @@ -76,25 +78,37 @@ public class AppCompatTaskInfo implements Parcelable { * If {@link #isLetterboxDoubleTapEnabled} it contains the current letterbox vertical position * or {@link TaskInfo#PROPERTY_VALUE_UNSET} otherwise. */ - public int topActivityLetterboxVerticalPosition; + public int topActivityLetterboxVerticalPosition = PROPERTY_VALUE_UNSET; /** * If {@link #isLetterboxDoubleTapEnabled} it contains the current letterbox vertical position * or {@link TaskInfo#PROPERTY_VALUE_UNSET} otherwise. */ - public int topActivityLetterboxHorizontalPosition; + public int topActivityLetterboxHorizontalPosition = PROPERTY_VALUE_UNSET; /** * If {@link #isLetterboxDoubleTapEnabled} it contains the current width of the letterboxed * activity or {@link TaskInfo#PROPERTY_VALUE_UNSET} otherwise. */ - public int topActivityLetterboxWidth; + public int topActivityLetterboxWidth = PROPERTY_VALUE_UNSET; /** * If {@link #isLetterboxDoubleTapEnabled} it contains the current height of the letterboxed * activity or {@link TaskInfo#PROPERTY_VALUE_UNSET} otherwise. */ - public int topActivityLetterboxHeight; + public int topActivityLetterboxHeight = PROPERTY_VALUE_UNSET; + + /** + * Contains the current app height of the letterboxed activity if available or + * {@link TaskInfo#PROPERTY_VALUE_UNSET} otherwise. + */ + public int topActivityLetterboxAppHeight = PROPERTY_VALUE_UNSET; + + /** + * Contains the current app width of the letterboxed activity if available or + * {@link TaskInfo#PROPERTY_VALUE_UNSET} otherwise. + */ + public int topActivityLetterboxAppWidth = PROPERTY_VALUE_UNSET; /** * Stores camera-related app compat information about a particular Task. @@ -162,6 +176,8 @@ public class AppCompatTaskInfo implements Parcelable { && topActivityLetterboxVerticalPosition == that.topActivityLetterboxVerticalPosition && topActivityLetterboxWidth == that.topActivityLetterboxWidth && topActivityLetterboxHeight == that.topActivityLetterboxHeight + && topActivityLetterboxAppWidth == that.topActivityLetterboxAppWidth + && topActivityLetterboxAppHeight == that.topActivityLetterboxAppHeight && topActivityLetterboxHorizontalPosition == that.topActivityLetterboxHorizontalPosition && isUserFullscreenOverrideEnabled == that.isUserFullscreenOverrideEnabled @@ -188,6 +204,8 @@ public class AppCompatTaskInfo implements Parcelable { == that.topActivityLetterboxHorizontalPosition && topActivityLetterboxWidth == that.topActivityLetterboxWidth && topActivityLetterboxHeight == that.topActivityLetterboxHeight + && topActivityLetterboxAppWidth == that.topActivityLetterboxAppWidth + && topActivityLetterboxAppHeight == that.topActivityLetterboxAppHeight && isUserFullscreenOverrideEnabled == that.isUserFullscreenOverrideEnabled && isSystemFullscreenOverrideEnabled == that.isSystemFullscreenOverrideEnabled && cameraCompatTaskInfo.equalsForCompatUi(that.cameraCompatTaskInfo); @@ -208,6 +226,8 @@ public class AppCompatTaskInfo implements Parcelable { topActivityLetterboxHorizontalPosition = source.readInt(); topActivityLetterboxWidth = source.readInt(); topActivityLetterboxHeight = source.readInt(); + topActivityLetterboxAppWidth = source.readInt(); + topActivityLetterboxAppHeight = source.readInt(); isUserFullscreenOverrideEnabled = source.readBoolean(); isSystemFullscreenOverrideEnabled = source.readBoolean(); cameraCompatTaskInfo = source.readTypedObject(CameraCompatTaskInfo.CREATOR); @@ -229,6 +249,8 @@ public class AppCompatTaskInfo implements Parcelable { dest.writeInt(topActivityLetterboxHorizontalPosition); dest.writeInt(topActivityLetterboxWidth); dest.writeInt(topActivityLetterboxHeight); + dest.writeInt(topActivityLetterboxAppWidth); + dest.writeInt(topActivityLetterboxAppHeight); dest.writeBoolean(isUserFullscreenOverrideEnabled); dest.writeBoolean(isSystemFullscreenOverrideEnabled); dest.writeTypedObject(cameraCompatTaskInfo, flags); @@ -250,6 +272,8 @@ public class AppCompatTaskInfo implements Parcelable { + topActivityLetterboxHorizontalPosition + " topActivityLetterboxWidth=" + topActivityLetterboxWidth + " topActivityLetterboxHeight=" + topActivityLetterboxHeight + + " topActivityLetterboxAppWidth=" + topActivityLetterboxAppWidth + + " topActivityLetterboxAppHeight=" + topActivityLetterboxAppHeight + " isUserFullscreenOverrideEnabled=" + isUserFullscreenOverrideEnabled + " isSystemFullscreenOverrideEnabled=" + isSystemFullscreenOverrideEnabled + " cameraCompatTaskInfo=" + cameraCompatTaskInfo.toString() diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt index 9fcf73d2c375..026094cd6f2a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt @@ -63,7 +63,8 @@ fun calculateInitialBounds( if (taskInfo.isResizeable) { if (isFixedOrientationPortrait(topActivityInfo.screenOrientation)) { // Respect apps fullscreen width - Size(taskInfo.appCompatTaskInfo.topActivityLetterboxWidth, idealSize.height) + Size(taskInfo.appCompatTaskInfo.topActivityLetterboxAppWidth, + idealSize.height) } else { idealSize } @@ -79,7 +80,7 @@ fun calculateInitialBounds( // Respect apps fullscreen height and apply custom app width Size( customPortraitWidthForLandscapeApp, - taskInfo.appCompatTaskInfo.topActivityLetterboxHeight + taskInfo.appCompatTaskInfo.topActivityLetterboxAppHeight ) } else { idealSize @@ -143,9 +144,9 @@ fun maximizeSizeGivenAspectRatio( /** Calculates the aspect ratio of an activity from its fullscreen bounds. */ fun calculateAspectRatio(taskInfo: RunningTaskInfo): Float { + val appLetterboxWidth = taskInfo.appCompatTaskInfo.topActivityLetterboxAppWidth + val appLetterboxHeight = taskInfo.appCompatTaskInfo.topActivityLetterboxAppHeight if (taskInfo.appCompatTaskInfo.topActivityBoundsLetterboxed) { - val appLetterboxWidth = taskInfo.appCompatTaskInfo.topActivityLetterboxWidth - val appLetterboxHeight = taskInfo.appCompatTaskInfo.topActivityLetterboxHeight return maxOf(appLetterboxWidth, appLetterboxHeight) / minOf(appLetterboxWidth, appLetterboxHeight).toFloat() } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index e6c72cdcf054..0597951c9bbc 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -2694,14 +2694,14 @@ class DesktopTasksControllerTest : ShellTestCase() { screenOrientation == SCREEN_ORIENTATION_PORTRAIT) { // Letterbox to portrait size appCompatTaskInfo.topActivityBoundsLetterboxed = true - appCompatTaskInfo.topActivityLetterboxWidth = 1200 - appCompatTaskInfo.topActivityLetterboxHeight = 1600 + appCompatTaskInfo.topActivityLetterboxAppWidth = 1200 + appCompatTaskInfo.topActivityLetterboxAppHeight = 1600 } else if (deviceOrientation == ORIENTATION_PORTRAIT && screenOrientation == SCREEN_ORIENTATION_LANDSCAPE) { // Letterbox to landscape size appCompatTaskInfo.topActivityBoundsLetterboxed = true - appCompatTaskInfo.topActivityLetterboxWidth = 1600 - appCompatTaskInfo.topActivityLetterboxHeight = 1200 + appCompatTaskInfo.topActivityLetterboxAppWidth = 1600 + appCompatTaskInfo.topActivityLetterboxAppHeight = 1200 } } else { appCompatTaskInfo.topActivityBoundsLetterboxed = false diff --git a/services/core/java/com/android/server/wm/AppCompatUtils.java b/services/core/java/com/android/server/wm/AppCompatUtils.java index 8c5193ef4a52..d98c2b37d8cf 100644 --- a/services/core/java/com/android/server/wm/AppCompatUtils.java +++ b/services/core/java/com/android/server/wm/AppCompatUtils.java @@ -89,13 +89,32 @@ class AppCompatUtils { return activityRecord.info.isChangeEnabled(overrideChangeId); } + /** + * Attempts to return the app bounds (bounds without insets) of the top most opaque activity. If + * these are not available, it defaults to the bounds of the activity which include insets. In + * the event the activity is in Size Compat Mode, the Size Compat bounds are returned instead. + */ + @NonNull + static Rect getAppBounds(@NonNull ActivityRecord activityRecord) { + // TODO(b/268458693): Refactor configuration inheritance in case of translucent activities + final Rect appBounds = activityRecord.getConfiguration().windowConfiguration.getAppBounds(); + if (appBounds == null) { + return activityRecord.getBounds(); + } + return activityRecord.mAppCompatController.getTransparentPolicy() + .findOpaqueNotFinishingActivityBelow() + .map(AppCompatUtils::getAppBounds) + .orElseGet(() -> { + if (activityRecord.hasSizeCompatBounds()) { + return activityRecord.getScreenResolvedBounds(); + } + return appBounds; + }); + } + static void fillAppCompatTaskInfo(@NonNull Task task, @NonNull TaskInfo info, @Nullable ActivityRecord top) { final AppCompatTaskInfo appCompatTaskInfo = info.appCompatTaskInfo; - appCompatTaskInfo.topActivityLetterboxVerticalPosition = TaskInfo.PROPERTY_VALUE_UNSET; - appCompatTaskInfo.topActivityLetterboxHorizontalPosition = TaskInfo.PROPERTY_VALUE_UNSET; - appCompatTaskInfo.topActivityLetterboxWidth = TaskInfo.PROPERTY_VALUE_UNSET; - appCompatTaskInfo.topActivityLetterboxHeight = TaskInfo.PROPERTY_VALUE_UNSET; appCompatTaskInfo.cameraCompatTaskInfo.freeformCameraCompatMode = CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_NONE; if (top == null) { @@ -124,8 +143,13 @@ class AppCompatUtils { .getAppCompatAspectRatioOverrides().isSystemOverrideToFullscreenEnabled(); appCompatTaskInfo.isFromLetterboxDoubleTap = reachabilityOverrides.isFromDoubleTap(); - appCompatTaskInfo.topActivityLetterboxWidth = top.getBounds().width(); - appCompatTaskInfo.topActivityLetterboxHeight = top.getBounds().height(); + final Rect bounds = top.getBounds(); + final Rect appBounds = getAppBounds(top); + appCompatTaskInfo.topActivityLetterboxWidth = bounds.width(); + appCompatTaskInfo.topActivityLetterboxHeight = bounds.height(); + appCompatTaskInfo.topActivityLetterboxAppWidth = appBounds.width(); + appCompatTaskInfo.topActivityLetterboxAppHeight = appBounds.height(); + // We need to consider if letterboxed or pillarboxed. // TODO(b/336807329) Encapsulate reachability logic appCompatTaskInfo.isLetterboxDoubleTapEnabled = reachabilityOverrides diff --git a/services/core/java/com/android/server/wm/DesktopModeBoundsCalculator.java b/services/core/java/com/android/server/wm/DesktopModeBoundsCalculator.java index 9996bbcb6597..3e55e2d9b25c 100644 --- a/services/core/java/com/android/server/wm/DesktopModeBoundsCalculator.java +++ b/services/core/java/com/android/server/wm/DesktopModeBoundsCalculator.java @@ -234,12 +234,13 @@ public final class DesktopModeBoundsCalculator { float desiredAspectRatio = 0; if (taskInfo.isRunning) { final AppCompatTaskInfo appCompatTaskInfo = taskInfo.appCompatTaskInfo; + final int appLetterboxWidth = + taskInfo.appCompatTaskInfo.topActivityLetterboxAppWidth; + final int appLetterboxHeight = + taskInfo.appCompatTaskInfo.topActivityLetterboxAppHeight; if (appCompatTaskInfo.topActivityBoundsLetterboxed) { - desiredAspectRatio = (float) Math.max( - appCompatTaskInfo.topActivityLetterboxWidth, - appCompatTaskInfo.topActivityLetterboxHeight) - / Math.min(appCompatTaskInfo.topActivityLetterboxWidth, - appCompatTaskInfo.topActivityLetterboxHeight); + desiredAspectRatio = (float) Math.max(appLetterboxWidth, appLetterboxHeight) + / Math.min(appLetterboxWidth, appLetterboxHeight); } else { desiredAspectRatio = Math.max(fullscreenHeight, fullscreenWidth) / Math.min(fullscreenHeight, fullscreenWidth); |