Loading services/core/java/com/android/server/wm/ActivityRecord.java +2 −1 Original line number Diff line number Diff line Loading @@ -8567,7 +8567,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A resolvedConfig, mOptOutEdgeToEdge, hasFixedRotationTransform(), getCompatDisplayInsets() != null); getCompatDisplayInsets() != null, task); mResolveConfigHint.resetTmpOverrides(); logAppCompatState(); Loading services/core/java/com/android/server/wm/ConfigurationContainer.java +17 −12 Original line number Diff line number Diff line Loading @@ -195,12 +195,14 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { * screenWidthDp, screenHeightDp, smallestScreenWidthDp, and orientation. * All overrides to those fields should be in this method. * * Task is only needed for split-screen to apply an offset special handling. * * TODO: Consider integrate this with computeConfigByResolveHint() */ static void applySizeOverrideIfNeeded(DisplayContent displayContent, ApplicationInfo appInfo, Configuration newParentConfiguration, Configuration inOutConfig, boolean optsOutEdgeToEdge, boolean hasFixedRotationTransform, boolean hasCompatDisplayInsets) { boolean hasCompatDisplayInsets, Task task) { if (displayContent == null) { return; } Loading @@ -223,13 +225,16 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { } if (!optsOutEdgeToEdge && (!useOverrideInsetsForConfig || hasCompatDisplayInsets || isFloating || rotation == ROTATION_UNDEFINED)) { // If the insets configuration decoupled logic is not enabled for the app, or the app // already has a compat override, or the context doesn't contain enough info to // calculate the override, skip the override. return; } if (isFloating) { // Floating window won't have any insets affect configuration. Skip the override. return; } // Make sure the orientation related fields will be updated by the override insets, because // fixed rotation has assigned the fields from display's configuration. if (hasFixedRotationTransform) { Loading @@ -255,17 +260,17 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { inOutConfig.windowConfiguration.setAppBounds( newParentConfiguration.windowConfiguration.getBounds()); outAppBounds = inOutConfig.windowConfiguration.getAppBounds(); if (inOutConfig.windowConfiguration.getWindowingMode() == WINDOWING_MODE_FULLSCREEN) { if (task != null) { task = task.getCreatedByOrganizerTask(); if (task != null && (task.mOffsetYForInsets != 0 || task.mOffsetXForInsets != 0)) { outAppBounds.offset(task.mOffsetXForInsets, task.mOffsetYForInsets); } } final DisplayPolicy.DecorInsets.Info decor = displayContent.getDisplayPolicy().getDecorInsetsInfo(rotation, dw, dh); if (outAppBounds.contains(decor.mOverrideNonDecorFrame)) { outAppBounds.intersect(decor.mOverrideNonDecorFrame); } } else { // TODO(b/358509380): Handle other windowing mode like split screen and freeform // cases correctly. outAppBounds.inset(displayContent.getDisplayPolicy() .getDecorInsetsInfo(rotation, dw, dh).mOverrideNonDecorInsets); outAppBounds.intersectUnchecked(decor.mOverrideNonDecorFrame); if (task != null && (task.mOffsetYForInsets != 0 || task.mOffsetXForInsets != 0)) { outAppBounds.offset(-task.mOffsetXForInsets, -task.mOffsetYForInsets); } } float density = inOutConfig.densityDpi; Loading services/core/java/com/android/server/wm/Task.java +11 −0 Original line number Diff line number Diff line Loading @@ -499,6 +499,13 @@ class Task extends TaskFragment { */ boolean mIsTrimmableFromRecents; /** * Bounds offset should be applied when calculating compatible configuration for apps targeting * SDK level 34 or before. */ int mOffsetXForInsets; int mOffsetYForInsets; private final AnimatingActivityRegistry mAnimatingActivityRegistry = new AnimatingActivityRegistry(); Loading Loading @@ -5874,6 +5881,10 @@ class Task extends TaskFragment { super.dumpInner(prefix, pw, dumpAll, dumpPackage); if (mCreatedByOrganizer) { pw.println(prefix + " mCreatedByOrganizer=true"); if (mOffsetXForInsets != 0 || mOffsetYForInsets != 0) { pw.println(prefix + " mOffsetXForInsets=" + mOffsetXForInsets + " mOffsetYForInsets=" + mOffsetYForInsets); } } if (mLastNonFullscreenBounds != null) { pw.print(prefix); pw.print(" mLastNonFullscreenBounds="); Loading services/core/java/com/android/server/wm/WindowOrganizerController.java +28 −0 Original line number Diff line number Diff line Loading @@ -18,9 +18,12 @@ package com.android.server.wm; import static android.Manifest.permission.START_TASKS_FROM_RECENTS; import static android.app.ActivityManager.isStartResultSuccessful; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.WINDOW_CONFIG_BOUNDS; import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED; import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.TRANSIT_CLOSE_PREPARE_BACK_NAVIGATION; import static android.window.TaskFragmentOperation.OP_TYPE_CLEAR_ADJACENT_TASK_FRAGMENTS; Loading Loading @@ -818,6 +821,31 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub final Configuration c = new Configuration(container.getRequestedOverrideConfiguration()); c.setTo(change.getConfiguration(), configMask, windowMask); if (container.getWindowingMode() == WINDOWING_MODE_MULTI_WINDOW && (change.getConfigSetMask() & ActivityInfo.CONFIG_SCREEN_SIZE) != 0) { // Special handling for split screen window got offset. The insets calculation // for configuration should be stable regardless of the offset. Set offset to // the task level to be applied when calculate compat override for apps // targeting SDK level 34 or before. final Task task = container.asTask(); if (task != null) { if (c.screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED && c.screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED) { final Rect oldBounds = container.getRequestedOverrideBounds(); final Rect newBounds = change.getConfiguration().windowConfiguration.getBounds(); if (oldBounds.width() == newBounds.width() && oldBounds.height() == newBounds.height()) { task.mOffsetXForInsets = oldBounds.left - newBounds.left; task.mOffsetYForInsets = oldBounds.top - newBounds.top; } else { task.mOffsetXForInsets = task.mOffsetYForInsets = 0; } } else { task.mOffsetXForInsets = task.mOffsetYForInsets = 0; } } } container.onRequestedOverrideConfigurationChanged(c); } effects |= TRANSACT_EFFECTS_CLIENT_CONFIG; Loading services/core/java/com/android/server/wm/WindowProcessController.java +2 −1 Original line number Diff line number Diff line Loading @@ -1689,7 +1689,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio resolvedConfig, false /* optsOutEdgeToEdge */, false /* hasFixedRotationTransform */, false /* hasCompatDisplayInsets */); false /* hasCompatDisplayInsets */, null /* task */); } void dispatchConfiguration(@NonNull Configuration config) { Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +2 −1 Original line number Diff line number Diff line Loading @@ -8567,7 +8567,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A resolvedConfig, mOptOutEdgeToEdge, hasFixedRotationTransform(), getCompatDisplayInsets() != null); getCompatDisplayInsets() != null, task); mResolveConfigHint.resetTmpOverrides(); logAppCompatState(); Loading
services/core/java/com/android/server/wm/ConfigurationContainer.java +17 −12 Original line number Diff line number Diff line Loading @@ -195,12 +195,14 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { * screenWidthDp, screenHeightDp, smallestScreenWidthDp, and orientation. * All overrides to those fields should be in this method. * * Task is only needed for split-screen to apply an offset special handling. * * TODO: Consider integrate this with computeConfigByResolveHint() */ static void applySizeOverrideIfNeeded(DisplayContent displayContent, ApplicationInfo appInfo, Configuration newParentConfiguration, Configuration inOutConfig, boolean optsOutEdgeToEdge, boolean hasFixedRotationTransform, boolean hasCompatDisplayInsets) { boolean hasCompatDisplayInsets, Task task) { if (displayContent == null) { return; } Loading @@ -223,13 +225,16 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { } if (!optsOutEdgeToEdge && (!useOverrideInsetsForConfig || hasCompatDisplayInsets || isFloating || rotation == ROTATION_UNDEFINED)) { // If the insets configuration decoupled logic is not enabled for the app, or the app // already has a compat override, or the context doesn't contain enough info to // calculate the override, skip the override. return; } if (isFloating) { // Floating window won't have any insets affect configuration. Skip the override. return; } // Make sure the orientation related fields will be updated by the override insets, because // fixed rotation has assigned the fields from display's configuration. if (hasFixedRotationTransform) { Loading @@ -255,17 +260,17 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { inOutConfig.windowConfiguration.setAppBounds( newParentConfiguration.windowConfiguration.getBounds()); outAppBounds = inOutConfig.windowConfiguration.getAppBounds(); if (inOutConfig.windowConfiguration.getWindowingMode() == WINDOWING_MODE_FULLSCREEN) { if (task != null) { task = task.getCreatedByOrganizerTask(); if (task != null && (task.mOffsetYForInsets != 0 || task.mOffsetXForInsets != 0)) { outAppBounds.offset(task.mOffsetXForInsets, task.mOffsetYForInsets); } } final DisplayPolicy.DecorInsets.Info decor = displayContent.getDisplayPolicy().getDecorInsetsInfo(rotation, dw, dh); if (outAppBounds.contains(decor.mOverrideNonDecorFrame)) { outAppBounds.intersect(decor.mOverrideNonDecorFrame); } } else { // TODO(b/358509380): Handle other windowing mode like split screen and freeform // cases correctly. outAppBounds.inset(displayContent.getDisplayPolicy() .getDecorInsetsInfo(rotation, dw, dh).mOverrideNonDecorInsets); outAppBounds.intersectUnchecked(decor.mOverrideNonDecorFrame); if (task != null && (task.mOffsetYForInsets != 0 || task.mOffsetXForInsets != 0)) { outAppBounds.offset(-task.mOffsetXForInsets, -task.mOffsetYForInsets); } } float density = inOutConfig.densityDpi; Loading
services/core/java/com/android/server/wm/Task.java +11 −0 Original line number Diff line number Diff line Loading @@ -499,6 +499,13 @@ class Task extends TaskFragment { */ boolean mIsTrimmableFromRecents; /** * Bounds offset should be applied when calculating compatible configuration for apps targeting * SDK level 34 or before. */ int mOffsetXForInsets; int mOffsetYForInsets; private final AnimatingActivityRegistry mAnimatingActivityRegistry = new AnimatingActivityRegistry(); Loading Loading @@ -5874,6 +5881,10 @@ class Task extends TaskFragment { super.dumpInner(prefix, pw, dumpAll, dumpPackage); if (mCreatedByOrganizer) { pw.println(prefix + " mCreatedByOrganizer=true"); if (mOffsetXForInsets != 0 || mOffsetYForInsets != 0) { pw.println(prefix + " mOffsetXForInsets=" + mOffsetXForInsets + " mOffsetYForInsets=" + mOffsetYForInsets); } } if (mLastNonFullscreenBounds != null) { pw.print(prefix); pw.print(" mLastNonFullscreenBounds="); Loading
services/core/java/com/android/server/wm/WindowOrganizerController.java +28 −0 Original line number Diff line number Diff line Loading @@ -18,9 +18,12 @@ package com.android.server.wm; import static android.Manifest.permission.START_TASKS_FROM_RECENTS; import static android.app.ActivityManager.isStartResultSuccessful; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.WINDOW_CONFIG_BOUNDS; import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED; import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.TRANSIT_CLOSE_PREPARE_BACK_NAVIGATION; import static android.window.TaskFragmentOperation.OP_TYPE_CLEAR_ADJACENT_TASK_FRAGMENTS; Loading Loading @@ -818,6 +821,31 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub final Configuration c = new Configuration(container.getRequestedOverrideConfiguration()); c.setTo(change.getConfiguration(), configMask, windowMask); if (container.getWindowingMode() == WINDOWING_MODE_MULTI_WINDOW && (change.getConfigSetMask() & ActivityInfo.CONFIG_SCREEN_SIZE) != 0) { // Special handling for split screen window got offset. The insets calculation // for configuration should be stable regardless of the offset. Set offset to // the task level to be applied when calculate compat override for apps // targeting SDK level 34 or before. final Task task = container.asTask(); if (task != null) { if (c.screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED && c.screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED) { final Rect oldBounds = container.getRequestedOverrideBounds(); final Rect newBounds = change.getConfiguration().windowConfiguration.getBounds(); if (oldBounds.width() == newBounds.width() && oldBounds.height() == newBounds.height()) { task.mOffsetXForInsets = oldBounds.left - newBounds.left; task.mOffsetYForInsets = oldBounds.top - newBounds.top; } else { task.mOffsetXForInsets = task.mOffsetYForInsets = 0; } } else { task.mOffsetXForInsets = task.mOffsetYForInsets = 0; } } } container.onRequestedOverrideConfigurationChanged(c); } effects |= TRANSACT_EFFECTS_CLIENT_CONFIG; Loading
services/core/java/com/android/server/wm/WindowProcessController.java +2 −1 Original line number Diff line number Diff line Loading @@ -1689,7 +1689,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio resolvedConfig, false /* optsOutEdgeToEdge */, false /* hasFixedRotationTransform */, false /* hasCompatDisplayInsets */); false /* hasCompatDisplayInsets */, null /* task */); } void dispatchConfiguration(@NonNull Configuration config) { Loading