From 6a3d39104b5d1f55e47db376a0aeab5ff5563e13 Mon Sep 17 00:00:00 2001 From: Ats Jenk Date: Thu, 9 Mar 2023 09:15:48 -0800 Subject: [PATCH 1/2] Enable overriding density for desktop tasks Add a new API to WindowContainerTransaction to support updating the container density. This allows us to update the configuration object with a new density value that would get applied by the WindowOrganizerController. Allow list density changes in WindowOrganizerController as an allowed configuration change. Update DesktopTasksController to change the density value when moving a task to desktop or back to fullscreen (if enabled). Use system property persist.wm.desktop_mode_density to override the density for desktop tasks. Allowed range for the density override is 100 to 1000. Bug: 272529050 Test: atest DesktopTasksControllerTest Change-Id: I96539176252fdd5b69b02e3bd1b6a4231990decb --- .../window/WindowContainerTransaction.java | 13 ++++ .../desktopmode/DesktopTasksController.kt | 59 +++++++++++++++---- .../server/wm/WindowOrganizerController.java | 2 +- 3 files changed, 62 insertions(+), 12 deletions(-) diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java index d7b49299c5170..0a600eaf13f94 100644 --- a/core/java/android/window/WindowContainerTransaction.java +++ b/core/java/android/window/WindowContainerTransaction.java @@ -121,6 +121,19 @@ public final class WindowContainerTransaction implements Parcelable { return this; } + /** + * Sets the densityDpi value in the configuration for the given container. + * @hide + */ + @NonNull + public WindowContainerTransaction setDensityDpi(@NonNull WindowContainerToken container, + int densityDpi) { + Change chg = getOrCreateChange(container.asBinder()); + chg.mConfiguration.densityDpi = densityDpi; + chg.mConfigSetMask |= ActivityInfo.CONFIG_DENSITY; + return this; + } + /** * Notify {@link com.android.server.wm.PinnedTaskController} that the picture-in-picture task * has finished the enter animation with the given bounds. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 73a7403810903..2abc48da6fbe4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -25,6 +25,7 @@ import android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED import android.app.WindowConfiguration.WindowingMode import android.content.Context import android.os.IBinder +import android.os.SystemProperties import android.view.SurfaceControl import android.view.WindowManager.TRANSIT_CHANGE import android.view.WindowManager.TRANSIT_NONE @@ -32,6 +33,7 @@ import android.view.WindowManager.TRANSIT_OPEN import android.view.WindowManager.TRANSIT_TO_FRONT import android.window.TransitionInfo import android.window.TransitionRequestInfo +import android.window.WindowContainerToken import android.window.WindowContainerTransaction import androidx.annotation.BinderThread import com.android.internal.protolog.common.ProtoLog @@ -115,10 +117,7 @@ class DesktopTasksController( val wct = WindowContainerTransaction() // Bring other apps to front first bringDesktopAppsToFront(wct) - - wct.setWindowingMode(task.getToken(), WINDOWING_MODE_FREEFORM) - wct.reorder(task.getToken(), true /* onTop */) - + addMoveToDesktopChanges(wct, task.token) if (Transitions.ENABLE_SHELL_TRANSITIONS) { transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */) } else { @@ -136,8 +135,7 @@ class DesktopTasksController( ProtoLog.v(WM_SHELL_DESKTOP_MODE, "moveToFullscreen: %d", task.taskId) val wct = WindowContainerTransaction() - wct.setWindowingMode(task.getToken(), WINDOWING_MODE_FULLSCREEN) - wct.setBounds(task.getToken(), null) + addMoveToFullscreenChanges(wct, task.token) if (Transitions.ENABLE_SHELL_TRANSITIONS) { transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */) } else { @@ -234,8 +232,8 @@ class DesktopTasksController( " taskId=%d", task.taskId ) - return WindowContainerTransaction().apply { - setWindowingMode(task.token, WINDOWING_MODE_FREEFORM) + return WindowContainerTransaction().also { wct -> + addMoveToDesktopChanges(wct, task.token) } } } @@ -251,15 +249,48 @@ class DesktopTasksController( " taskId=%d", task.taskId ) - return WindowContainerTransaction().apply { - setWindowingMode(task.token, WINDOWING_MODE_FULLSCREEN) - setBounds(task.token, null) + return WindowContainerTransaction().also { wct -> + addMoveToFullscreenChanges(wct, task.token) } } } return null } + private fun addMoveToDesktopChanges( + wct: WindowContainerTransaction, + token: WindowContainerToken + ) { + wct.setWindowingMode(token, WINDOWING_MODE_FREEFORM) + wct.reorder(token, true /* onTop */) + if (isDesktopDensityOverrideSet()) { + wct.setDensityDpi(token, getDesktopDensityDpi()) + } + } + + private fun addMoveToFullscreenChanges( + wct: WindowContainerTransaction, + token: WindowContainerToken + ) { + wct.setWindowingMode(token, WINDOWING_MODE_FULLSCREEN) + wct.setBounds(token, null) + if (isDesktopDensityOverrideSet()) { + wct.setDensityDpi(token, getFullscreenDensityDpi()) + } + } + + private fun isDesktopDensityOverrideSet(): Boolean { + return DESKTOP_DENSITY_OVERRIDE in DESKTOP_DENSITY_ALLOWED_RANGE + } + + private fun getFullscreenDensityDpi(): Int { + return context.resources.displayMetrics.densityDpi + } + + private fun getDesktopDensityDpi(): Int { + return DESKTOP_DENSITY_OVERRIDE + } + /** Creates a new instance of the external interface to pass to another process. */ private fun createExternalInterface(): ExternalInterfaceBinder { return IDesktopModeImpl(this) @@ -318,4 +349,10 @@ class DesktopTasksController( return result[0] } } + + companion object { + private val DESKTOP_DENSITY_OVERRIDE = + SystemProperties.getInt("persist.wm.debug.desktop_mode_density", 0) + private val DESKTOP_DENSITY_ALLOWED_RANGE = (100..1000) + } } diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index fd477532e984d..6228050dc583e 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -131,7 +131,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub */ static final int CONTROLLABLE_CONFIGS = ActivityInfo.CONFIG_WINDOW_CONFIGURATION | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE | ActivityInfo.CONFIG_SCREEN_SIZE - | ActivityInfo.CONFIG_LAYOUT_DIRECTION; + | ActivityInfo.CONFIG_LAYOUT_DIRECTION | ActivityInfo.CONFIG_DENSITY; static final int CONTROLLABLE_WINDOW_CONFIGS = WINDOW_CONFIG_BOUNDS | WindowConfiguration.WINDOW_CONFIG_APP_BOUNDS; From 1026b4585bb1187ae11aa2bfcb6d1b3324c7d42f Mon Sep 17 00:00:00 2001 From: Ats Jenk Date: Mon, 13 Mar 2023 15:41:21 -0700 Subject: [PATCH 2/2] Use system density for window decoration There is a prototype feature to allow overriding density for desktop tasks. This override should not apply to the window decoration. If the override system property is detected, use the system density for the window decoration. Bug: 272529050 Test: set 272 dpi for desktop tasks, move a fullscreen task to desktop, observe that task is using a different density, but window decoration is using the system density Test: remove desktop task density override, observe that desktop task window decoration using task density (which matches system) Change-Id: I1c8db490e527381b2adaa0a657050822763e1516 --- .../wm/shell/desktopmode/DesktopTasksController.kt | 12 ++++++++---- .../windowdecor/DesktopModeWindowDecoration.java | 13 +++++++++++++ .../wm/shell/windowdecor/WindowDecoration.java | 14 ++++++++++++-- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 2abc48da6fbe4..31c5e33f21e32 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -279,10 +279,6 @@ class DesktopTasksController( } } - private fun isDesktopDensityOverrideSet(): Boolean { - return DESKTOP_DENSITY_OVERRIDE in DESKTOP_DENSITY_ALLOWED_RANGE - } - private fun getFullscreenDensityDpi(): Int { return context.resources.displayMetrics.densityDpi } @@ -354,5 +350,13 @@ class DesktopTasksController( private val DESKTOP_DENSITY_OVERRIDE = SystemProperties.getInt("persist.wm.debug.desktop_mode_density", 0) private val DESKTOP_DENSITY_ALLOWED_RANGE = (100..1000) + + /** + * Check if desktop density override is enabled + */ + @JvmStatic + fun isDesktopDensityOverrideSet(): Boolean { + return DESKTOP_DENSITY_OVERRIDE in DESKTOP_DENSITY_ALLOWED_RANGE + } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index 72da1089c91cf..3c0ef965f4f56 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -23,6 +23,7 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.ColorStateList; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Point; @@ -46,6 +47,7 @@ import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.DesktopModeStatus; +import com.android.wm.shell.desktopmode.DesktopTasksController; /** * Defines visuals and behaviors of a window decoration of a caption bar and shadows. It works with @@ -95,6 +97,17 @@ public class DesktopModeWindowDecoration extends WindowDecoration mSurfaceControlViewHostFactory = surfaceControlViewHostFactory; mDisplay = mDisplayController.getDisplay(mTaskInfo.displayId); - mDecorWindowContext = mContext.createConfigurationContext(mTaskInfo.getConfiguration()); + mDecorWindowContext = mContext.createConfigurationContext( + getConfigurationWithOverrides(mTaskInfo)); + } + + /** + * Get {@link Configuration} from supplied {@link RunningTaskInfo}. + * + * Allows values to be overridden before returning the configuration. + */ + protected Configuration getConfigurationWithOverrides(RunningTaskInfo taskInfo) { + return taskInfo.getConfiguration(); } /** @@ -165,7 +175,7 @@ public abstract class WindowDecoration outResult.mRootView = rootView; rootView = null; // Clear it just in case we use it accidentally - final Configuration taskConfig = mTaskInfo.getConfiguration(); + final Configuration taskConfig = getConfigurationWithOverrides(mTaskInfo); if (oldTaskConfig.densityDpi != taskConfig.densityDpi || mDisplay == null || mDisplay.getDisplayId() != mTaskInfo.displayId) {