diff options
3 files changed, 62 insertions, 12 deletions
diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java index d7b49299c517..0a600eaf13f9 100644 --- a/core/java/android/window/WindowContainerTransaction.java +++ b/core/java/android/window/WindowContainerTransaction.java @@ -122,6 +122,19 @@ public final class WindowContainerTransaction implements Parcelable { } /** + * 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 73a740381090..2abc48da6fbe 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 fd477532e984..6228050dc583 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; |