summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yuichiro Hanada <yhanada@google.com> 2025-01-23 14:47:15 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-23 14:47:15 -0800
commit2802b72fb11b142fc0b07bdbcb13384a65e22145 (patch)
tree6b056ec7db2e4fa2030682d66292124e455331e4
parentc7eaa6ee4287dbfb9d633cff4aaf31ffa36e3c91 (diff)
parent9a0b58ce46a7d9ed4255d5a396369b9b34e5399c (diff)
Merge "Add a config to turn on window drag" into main
-rw-r--r--libs/WindowManager/Shell/res/values/config.xml3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt25
3 files changed, 29 insertions, 5 deletions
diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml
index 59e6c7786cb8..c38d459f64d3 100644
--- a/libs/WindowManager/Shell/res/values/config.xml
+++ b/libs/WindowManager/Shell/res/values/config.xml
@@ -188,4 +188,7 @@
<string-array name="desktop_windowing_app_handle_education_allowlist_apps"></string-array>
<!-- Apps that can trigger Desktop Windowing App-To-Web Education -->
<string-array name="desktop_windowing_app_to_web_education_allowlist_apps"></string-array>
+
+ <!-- Whether this device allows to drag windows across displays. -->
+ <bool name="config_enableConnectedDisplayWindowDrag">true</bool>
</resources>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java
index e69d60ddd6c6..ad11252364ce 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java
@@ -37,6 +37,7 @@ import android.window.WindowContainerTransaction;
import androidx.annotation.BinderThread;
import com.android.window.flags.Flags;
+import com.android.wm.shell.R;
import com.android.wm.shell.common.DisplayChangeController.OnDisplayChangingListener;
import com.android.wm.shell.shared.annotations.ShellMainThread;
import com.android.wm.shell.sysui.ShellInit;
@@ -91,7 +92,10 @@ public class DisplayController {
onDisplayAdded(displayIds[i]);
}
- if (Flags.enableConnectedDisplaysWindowDrag()) {
+ final boolean enableConnectedDisplayWindowDrag =
+ mContext.getResources()
+ .getBoolean(R.bool.config_enableConnectedDisplayWindowDrag);
+ if (Flags.enableConnectedDisplaysWindowDrag() && enableConnectedDisplayWindowDrag) {
mDisplayManager.registerTopologyListener(mMainExecutor,
this::onDisplayTopologyChanged);
onDisplayTopologyChanged(mDisplayManager.getDisplayTopology());
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt
index 07496eb0e526..33f0432372d0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt
@@ -29,6 +29,7 @@ import android.window.TransitionRequestInfo
import android.window.WindowContainerTransaction
import com.android.internal.jank.Cuj
import com.android.internal.jank.InteractionJankMonitor
+import com.android.wm.shell.R
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.MultiDisplayDragMoveBoundsCalculator
@@ -67,6 +68,8 @@ class MultiDisplayVeiledResizeTaskPositioner(
(ctrlType and DragPositioningCallback.CTRL_TYPE_LEFT) != 0 ||
(ctrlType and DragPositioningCallback.CTRL_TYPE_RIGHT) != 0
+ private val enableMultiDisplayWindowDrag: Boolean
+
@DragPositioningCallback.CtrlType private var ctrlType = 0
private var isResizingOrAnimatingResize = false
@Surface.Rotation private var rotation = 0
@@ -93,6 +96,10 @@ class MultiDisplayVeiledResizeTaskPositioner(
init {
dragEventListeners.add(dragEventListener)
+ enableMultiDisplayWindowDrag =
+ desktopWindowDecoration.mDecorWindowContext.resources.getBoolean(
+ R.bool.config_enableConnectedDisplayWindowDrag
+ )
}
override fun onDragPositioningStart(ctrlType: Int, displayId: Int, x: Float, y: Float): Rect {
@@ -168,8 +175,13 @@ class MultiDisplayVeiledResizeTaskPositioner(
val startDisplayLayout = displayController.getDisplayLayout(startDisplayId)
val currentDisplayLayout = displayController.getDisplayLayout(displayId)
- if (startDisplayLayout == null || currentDisplayLayout == null) {
- // Fall back to single-display drag behavior if any display layout is unavailable.
+ if (
+ startDisplayLayout == null ||
+ currentDisplayLayout == null ||
+ !enableMultiDisplayWindowDrag
+ ) {
+ // Fall back to single-display drag behavior if any display layout is unavailable or
+ // it's explicitly disabled.
DragPositioningCallbackUtility.setPositionOnDrag(
desktopWindowDecoration,
repositionTaskBounds,
@@ -237,8 +249,13 @@ class MultiDisplayVeiledResizeTaskPositioner(
val startDisplayLayout = displayController.getDisplayLayout(startDisplayId)
val currentDisplayLayout = displayController.getDisplayLayout(displayId)
- if (startDisplayLayout == null || currentDisplayLayout == null) {
- // Fall back to single-display drag behavior if any display layout is unavailable.
+ if (
+ startDisplayLayout == null ||
+ currentDisplayLayout == null ||
+ !enableMultiDisplayWindowDrag
+ ) {
+ // Fall back to single-display drag behavior if any display layout is unavailable or
+ // it's explicitly disabled.
DragPositioningCallbackUtility.updateTaskBounds(
repositionTaskBounds,
taskBoundsAtDragStart,