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

Commit fd593b79 authored by Eghosa Ewansiha-Vlachavas's avatar Eghosa Ewansiha-Vlachavas Committed by Android (Google) Code Review
Browse files

Merge "Create inset adjusted alternative to `topActivityLetterboxHeight`" into main

parents d3d3e7ba 6c4ac831
Loading
Loading
Loading
Loading
+28 −4
Original line number Diff line number Diff line
@@ -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()
+5 −4
Original line number Diff line number Diff line
@@ -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()
    }
+4 −4
Original line number Diff line number Diff line
@@ -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
+30 −6
Original line number Diff line number Diff line
@@ -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
+6 −5
Original line number Diff line number Diff line
@@ -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);