Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2802b72f authored by Yuichiro Hanada's avatar Yuichiro Hanada Committed by Android (Google) Code Review
Browse files

Merge "Add a config to turn on window drag" into main

parents c7eaa6ee 9a0b58ce
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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>
+5 −1
Original line number Diff line number Diff line
@@ -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());
+21 −4
Original line number Diff line number Diff line
@@ -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,