Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt +5 −4 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.util.Size import com.android.wm.shell.R import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayLayout import kotlin.math.ceil val DESKTOP_MODE_INITIAL_BOUNDS_SCALE: Float = SystemProperties.getInt("persist.wm.debug.desktop_mode_initial_bounds_scale", 75) / 100f Loading Loading @@ -190,22 +191,22 @@ fun maximizeSizeGivenAspectRatio( val finalWidth: Int // Get orientation either through top activity or task's orientation if (taskInfo.hasPortraitTopActivity()) { val tempWidth = (targetHeight / aspectRatio).toInt() val tempWidth = ceil(targetHeight / aspectRatio).toInt() if (tempWidth <= targetWidth) { finalHeight = targetHeight finalWidth = tempWidth } else { finalWidth = targetWidth finalHeight = (finalWidth * aspectRatio).toInt() finalHeight = ceil(finalWidth * aspectRatio).toInt() } } else { val tempWidth = (targetHeight * aspectRatio).toInt() val tempWidth = ceil(targetHeight * aspectRatio).toInt() if (tempWidth <= targetWidth) { finalHeight = targetHeight finalWidth = tempWidth } else { finalWidth = targetWidth finalHeight = (finalWidth / aspectRatio).toInt() finalHeight = ceil(finalWidth / aspectRatio).toInt() } } return Size(finalWidth, finalHeight + captionInsets) Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +1 −1 Original line number Diff line number Diff line Loading @@ -285,7 +285,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() private val DEFAULT_PORTRAIT_BOUNDS = Rect(200, 165, 1400, 2085) private val RESIZABLE_LANDSCAPE_BOUNDS = Rect(25, 435, 1575, 1635) private val RESIZABLE_PORTRAIT_BOUNDS = Rect(680, 75, 1880, 1275) private val UNRESIZABLE_LANDSCAPE_BOUNDS = Rect(25, 449, 1575, 1611) private val UNRESIZABLE_LANDSCAPE_BOUNDS = Rect(25, 448, 1575, 1611) private val UNRESIZABLE_PORTRAIT_BOUNDS = Rect(830, 75, 1730, 1275) private val wallpaperToken = MockToken().token() private val homeComponentName = ComponentName(HOME_LAUNCHER_PACKAGE_NAME, /* class */ "") Loading services/core/java/com/android/server/wm/AppCompatLetterboxPolicy.java +34 −4 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.content.res.Configuration.ORIENTATION_UNDEFINED; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; Loading Loading @@ -48,6 +49,8 @@ import java.io.PrintWriter; */ class AppCompatLetterboxPolicy { private static final int DIFF_TOLERANCE_PX = 1; @NonNull private final ActivityRecord mActivityRecord; @NonNull Loading @@ -56,6 +59,9 @@ class AppCompatLetterboxPolicy { private final AppCompatRoundedCorners mAppCompatRoundedCorners; @NonNull private final AppCompatConfiguration mAppCompatConfiguration; // Convenience temporary object to save allocation when calculating Rect. @NonNull private final Rect mTmpRect = new Rect(); private boolean mLastShouldShowLetterboxUi; Loading @@ -71,7 +77,7 @@ class AppCompatLetterboxPolicy { : new LegacyLetterboxPolicyState(); // TODO (b/358334569) Improve cutout logic dependency on app compat. mAppCompatRoundedCorners = new AppCompatRoundedCorners(mActivityRecord, this::isLetterboxedNotForDisplayCutout); this::ieEligibleForRoundedCorners); mAppCompatConfiguration = appCompatConfiguration; } Loading @@ -84,7 +90,7 @@ class AppCompatLetterboxPolicy { mLetterboxPolicyState.stop(); } /** @return {@value true} if the letterbox policy is running and the activity letterboxed. */ /** @return {@code true} if the letterbox policy is running and the activity letterboxed. */ boolean isRunning() { return mLetterboxPolicyState.isRunning(); } Loading Loading @@ -130,7 +136,7 @@ class AppCompatLetterboxPolicy { * <li>The activity is in fullscreen. * <li>The activity is portrait-only. * <li>The activity doesn't have a starting window (education should only be displayed * once the starting window is removed in {@link #removeStartingWindow}). * once the starting window is removed in {@link ActivityRecord#removeStartingWindow}). * </ul> */ boolean isEligibleForLetterboxEducation() { Loading Loading @@ -294,16 +300,40 @@ class AppCompatLetterboxPolicy { } } private boolean ieEligibleForRoundedCorners(@NonNull WindowState mainWindow) { return isLetterboxedNotForDisplayCutout(mainWindow) && !isFreeformActivityMatchParentAppBoundsHeight(); } private boolean isLetterboxedNotForDisplayCutout(@NonNull WindowState mainWindow) { return shouldShowLetterboxUi(mainWindow) && !mainWindow.isLetterboxedForDisplayCutout(); } private boolean isFreeformActivityMatchParentAppBoundsHeight() { if (!Flags.excludeCaptionFromAppBounds()) { return false; } final Task task = mActivityRecord.getTask(); if (task == null) { return false; } final Rect parentAppBounds = task.getWindowConfiguration().getAppBounds(); if (parentAppBounds == null) { return false; } mLetterboxPolicyState.getLetterboxInnerBounds(mTmpRect); final int diff = parentAppBounds.height() - mTmpRect.height(); // Compare bounds with tolerance of 1 px to account for rounding error calculations. return task.getWindowingMode() == WINDOWING_MODE_FREEFORM && diff <= DIFF_TOLERANCE_PX; } private static boolean shouldNotLayoutLetterbox(@Nullable WindowState w) { if (w == null) { return true; } final int type = w.mAttrs.type; final int type = w.getAttrs().type; // Allow letterbox to be displayed early for base application or application starting // windows even if it is not on the top z order to prevent flickering when the // letterboxed window is brought to the top Loading services/core/java/com/android/server/wm/AppCompatRoundedCorners.java +4 −4 Original line number Diff line number Diff line Loading @@ -35,12 +35,12 @@ class AppCompatRoundedCorners { @NonNull private final ActivityRecord mActivityRecord; @NonNull private final Predicate<WindowState> mIsLetterboxedNotForDisplayCutout; private final Predicate<WindowState> mRoundedCornersWindowCondition; AppCompatRoundedCorners(@NonNull ActivityRecord activityRecord, @NonNull Predicate<WindowState> isLetterboxedNotForDisplayCutout) { @NonNull Predicate<WindowState> roundedCornersWindowCondition) { mActivityRecord = activityRecord; mIsLetterboxedNotForDisplayCutout = isLetterboxedNotForDisplayCutout; mRoundedCornersWindowCondition = roundedCornersWindowCondition; } void updateRoundedCornersIfNeeded(@NonNull final WindowState mainWindow) { Loading Loading @@ -136,7 +136,7 @@ class AppCompatRoundedCorners { private boolean requiresRoundedCorners(@NonNull final WindowState mainWindow) { final AppCompatLetterboxOverrides letterboxOverrides = mActivityRecord .mAppCompatController.getLetterboxOverrides(); return mIsLetterboxedNotForDisplayCutout.test(mainWindow) return mRoundedCornersWindowCondition.test(mainWindow) && letterboxOverrides.isLetterboxActivityCornersRounded(); } Loading services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java +4 −0 Original line number Diff line number Diff line Loading @@ -151,6 +151,10 @@ class AppCompatActivityRobot { doReturn(taskBounds).when(mTaskStack.top()).getBounds(); } void configureTaskAppBounds(@NonNull Rect appBounds) { mTaskStack.top().getWindowConfiguration().setAppBounds(appBounds); } void configureTopActivityBounds(@NonNull Rect activityBounds) { doReturn(activityBounds).when(mActivityStack.top()).getBounds(); } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt +5 −4 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.util.Size import com.android.wm.shell.R import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayLayout import kotlin.math.ceil val DESKTOP_MODE_INITIAL_BOUNDS_SCALE: Float = SystemProperties.getInt("persist.wm.debug.desktop_mode_initial_bounds_scale", 75) / 100f Loading Loading @@ -190,22 +191,22 @@ fun maximizeSizeGivenAspectRatio( val finalWidth: Int // Get orientation either through top activity or task's orientation if (taskInfo.hasPortraitTopActivity()) { val tempWidth = (targetHeight / aspectRatio).toInt() val tempWidth = ceil(targetHeight / aspectRatio).toInt() if (tempWidth <= targetWidth) { finalHeight = targetHeight finalWidth = tempWidth } else { finalWidth = targetWidth finalHeight = (finalWidth * aspectRatio).toInt() finalHeight = ceil(finalWidth * aspectRatio).toInt() } } else { val tempWidth = (targetHeight * aspectRatio).toInt() val tempWidth = ceil(targetHeight * aspectRatio).toInt() if (tempWidth <= targetWidth) { finalHeight = targetHeight finalWidth = tempWidth } else { finalWidth = targetWidth finalHeight = (finalWidth / aspectRatio).toInt() finalHeight = ceil(finalWidth / aspectRatio).toInt() } } return Size(finalWidth, finalHeight + captionInsets) Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +1 −1 Original line number Diff line number Diff line Loading @@ -285,7 +285,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() private val DEFAULT_PORTRAIT_BOUNDS = Rect(200, 165, 1400, 2085) private val RESIZABLE_LANDSCAPE_BOUNDS = Rect(25, 435, 1575, 1635) private val RESIZABLE_PORTRAIT_BOUNDS = Rect(680, 75, 1880, 1275) private val UNRESIZABLE_LANDSCAPE_BOUNDS = Rect(25, 449, 1575, 1611) private val UNRESIZABLE_LANDSCAPE_BOUNDS = Rect(25, 448, 1575, 1611) private val UNRESIZABLE_PORTRAIT_BOUNDS = Rect(830, 75, 1730, 1275) private val wallpaperToken = MockToken().token() private val homeComponentName = ComponentName(HOME_LAUNCHER_PACKAGE_NAME, /* class */ "") Loading
services/core/java/com/android/server/wm/AppCompatLetterboxPolicy.java +34 −4 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.content.res.Configuration.ORIENTATION_UNDEFINED; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; Loading Loading @@ -48,6 +49,8 @@ import java.io.PrintWriter; */ class AppCompatLetterboxPolicy { private static final int DIFF_TOLERANCE_PX = 1; @NonNull private final ActivityRecord mActivityRecord; @NonNull Loading @@ -56,6 +59,9 @@ class AppCompatLetterboxPolicy { private final AppCompatRoundedCorners mAppCompatRoundedCorners; @NonNull private final AppCompatConfiguration mAppCompatConfiguration; // Convenience temporary object to save allocation when calculating Rect. @NonNull private final Rect mTmpRect = new Rect(); private boolean mLastShouldShowLetterboxUi; Loading @@ -71,7 +77,7 @@ class AppCompatLetterboxPolicy { : new LegacyLetterboxPolicyState(); // TODO (b/358334569) Improve cutout logic dependency on app compat. mAppCompatRoundedCorners = new AppCompatRoundedCorners(mActivityRecord, this::isLetterboxedNotForDisplayCutout); this::ieEligibleForRoundedCorners); mAppCompatConfiguration = appCompatConfiguration; } Loading @@ -84,7 +90,7 @@ class AppCompatLetterboxPolicy { mLetterboxPolicyState.stop(); } /** @return {@value true} if the letterbox policy is running and the activity letterboxed. */ /** @return {@code true} if the letterbox policy is running and the activity letterboxed. */ boolean isRunning() { return mLetterboxPolicyState.isRunning(); } Loading Loading @@ -130,7 +136,7 @@ class AppCompatLetterboxPolicy { * <li>The activity is in fullscreen. * <li>The activity is portrait-only. * <li>The activity doesn't have a starting window (education should only be displayed * once the starting window is removed in {@link #removeStartingWindow}). * once the starting window is removed in {@link ActivityRecord#removeStartingWindow}). * </ul> */ boolean isEligibleForLetterboxEducation() { Loading Loading @@ -294,16 +300,40 @@ class AppCompatLetterboxPolicy { } } private boolean ieEligibleForRoundedCorners(@NonNull WindowState mainWindow) { return isLetterboxedNotForDisplayCutout(mainWindow) && !isFreeformActivityMatchParentAppBoundsHeight(); } private boolean isLetterboxedNotForDisplayCutout(@NonNull WindowState mainWindow) { return shouldShowLetterboxUi(mainWindow) && !mainWindow.isLetterboxedForDisplayCutout(); } private boolean isFreeformActivityMatchParentAppBoundsHeight() { if (!Flags.excludeCaptionFromAppBounds()) { return false; } final Task task = mActivityRecord.getTask(); if (task == null) { return false; } final Rect parentAppBounds = task.getWindowConfiguration().getAppBounds(); if (parentAppBounds == null) { return false; } mLetterboxPolicyState.getLetterboxInnerBounds(mTmpRect); final int diff = parentAppBounds.height() - mTmpRect.height(); // Compare bounds with tolerance of 1 px to account for rounding error calculations. return task.getWindowingMode() == WINDOWING_MODE_FREEFORM && diff <= DIFF_TOLERANCE_PX; } private static boolean shouldNotLayoutLetterbox(@Nullable WindowState w) { if (w == null) { return true; } final int type = w.mAttrs.type; final int type = w.getAttrs().type; // Allow letterbox to be displayed early for base application or application starting // windows even if it is not on the top z order to prevent flickering when the // letterboxed window is brought to the top Loading
services/core/java/com/android/server/wm/AppCompatRoundedCorners.java +4 −4 Original line number Diff line number Diff line Loading @@ -35,12 +35,12 @@ class AppCompatRoundedCorners { @NonNull private final ActivityRecord mActivityRecord; @NonNull private final Predicate<WindowState> mIsLetterboxedNotForDisplayCutout; private final Predicate<WindowState> mRoundedCornersWindowCondition; AppCompatRoundedCorners(@NonNull ActivityRecord activityRecord, @NonNull Predicate<WindowState> isLetterboxedNotForDisplayCutout) { @NonNull Predicate<WindowState> roundedCornersWindowCondition) { mActivityRecord = activityRecord; mIsLetterboxedNotForDisplayCutout = isLetterboxedNotForDisplayCutout; mRoundedCornersWindowCondition = roundedCornersWindowCondition; } void updateRoundedCornersIfNeeded(@NonNull final WindowState mainWindow) { Loading Loading @@ -136,7 +136,7 @@ class AppCompatRoundedCorners { private boolean requiresRoundedCorners(@NonNull final WindowState mainWindow) { final AppCompatLetterboxOverrides letterboxOverrides = mActivityRecord .mAppCompatController.getLetterboxOverrides(); return mIsLetterboxedNotForDisplayCutout.test(mainWindow) return mRoundedCornersWindowCondition.test(mainWindow) && letterboxOverrides.isLetterboxActivityCornersRounded(); } Loading
services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java +4 −0 Original line number Diff line number Diff line Loading @@ -151,6 +151,10 @@ class AppCompatActivityRobot { doReturn(taskBounds).when(mTaskStack.top()).getBounds(); } void configureTaskAppBounds(@NonNull Rect appBounds) { mTaskStack.top().getWindowConfiguration().setAppBounds(appBounds); } void configureTopActivityBounds(@NonNull Rect activityBounds) { doReturn(activityBounds).when(mActivityStack.top()).getBounds(); } Loading