diff options
Diffstat (limited to 'libs')
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 72be066fc7a7..71f30f39136a 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 @@ -36,6 +36,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; @@ -87,7 +88,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, |