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

Commit 02a27d23 authored by nergi's avatar nergi
Browse files

Added CD Window drag test

Similar to MoveToNextDisplay, but this utilized caption bar drag to move
the window

Demo: http://shortn/_v3d1k5PSxZ

Bug: 403197745
Test: atest DragMoveWindowToNextDisplayTest
Flag: EXEMPT adding new test

Change-Id: I10b2bb06e537a3e39a65a5ccdd41776de196a312
parent 6e14ced4
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
/*
 * Copyright 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.wm.shell.functional

import android.platform.test.annotations.Postsubmit
import com.android.wm.shell.scenarios.DragMoveWindowToNextDisplay
import org.junit.runner.RunWith
import org.junit.runners.BlockJUnit4ClassRunner

/* Functional test for [DragMoveWindowToNextDisplay]. */
@RunWith(BlockJUnit4ClassRunner::class)
@Postsubmit
class DragMoveWindowToNextDisplayTest : DragMoveWindowToNextDisplay()
+113 −0
Original line number Diff line number Diff line
/*
 * Copyright 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.wm.shell.scenarios

import android.graphics.Point
import android.hardware.display.DisplayManager
import android.platform.test.annotations.RequiresFlagsEnabled
import android.platform.test.flag.junit.DeviceFlagsValueProvider
import android.tools.NavBar
import android.tools.Rotation
import android.tools.traces.parsers.WindowManagerStateHelper
import android.view.Display.DEFAULT_DISPLAY
import android.view.DisplayInfo
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import androidx.test.uiautomator.UiDevice
import com.android.server.wm.flicker.helpers.DesktopModeAppHelper
import com.android.server.wm.flicker.helpers.SimpleAppHelper
import com.android.window.flags.Flags
import com.android.wm.shell.Utils
import com.android.wm.shell.shared.desktopmode.DesktopState
import org.junit.After
import org.junit.Assume.assumeTrue
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import platform.test.desktop.DesktopMouseTestRule
import platform.test.desktop.SimulatedConnectedDisplayTestRule

/** Base scenario test for moving a task to another display via window caption bar dragging. */
@Ignore("Test Base Class")
@RequiresFlagsEnabled(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
    Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WINDOW_DRAG,
)
abstract class DragMoveWindowToNextDisplay {
    private val wmHelper = WindowManagerStateHelper(getInstrumentation())
    private val device = UiDevice.getInstance(getInstrumentation())
    private val testApp = DesktopModeAppHelper(SimpleAppHelper(getInstrumentation()))
    private val displayManager =
        getInstrumentation().targetContext.getSystemService(DisplayManager::class.java)

    @get:Rule(order = 0) val checkFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
    @get:Rule(order = 1)
    val testSetupRule = Utils.testSetupRule(NavBar.MODE_GESTURAL, Rotation.ROTATION_0)
    @get:Rule(order = 2) val connectedDisplayRule = SimulatedConnectedDisplayTestRule()
    @get:Rule(order = 3) val desktopMouseRule = DesktopMouseTestRule()

    @Before
    fun setup() {
        val desktopState = DesktopState.fromContext(getInstrumentation().context)
        assumeTrue(desktopState.isDesktopModeSupportedOnDisplay(DEFAULT_DISPLAY))
    }

    @Test
    fun moveToNextDisplay() {
        val connectedDisplayId = connectedDisplayRule.setupTestDisplay()
        testApp.enterDesktopMode(wmHelper, device)

        val captionBounds =
            checkNotNull(testApp.getCaptionForTheApp(wmHelper, device)?.visibleBounds)
        val dragCoords = Point(captionBounds.centerX(), captionBounds.centerY())

        // Move cursor to designated drag point
        desktopMouseRule.move(DEFAULT_DISPLAY, dragCoords.x, dragCoords.y)

        // Start drag and move
        desktopMouseRule.startDrag()
        val displayInfo = DisplayInfo()
        displayManager.getDisplay(connectedDisplayId).getDisplayInfo(displayInfo)
        desktopMouseRule.move(
            connectedDisplayId,
            displayInfo.appWidth / 2,
            displayInfo.appHeight / 2,
        )
        desktopMouseRule.stopDrag()
        wmHelper.StateSyncBuilder().withAppTransitionIdle().waitForAndVerify()

        wmHelper
            .StateSyncBuilder()
            .add("testApp is on the connected display") { dump ->
                val display =
                    requireNotNull(dump.wmState.getDisplay(connectedDisplayId)) {
                        "Display $connectedDisplayId not found"
                    }
                display.containsActivity(testApp)
            }
            .waitForAndVerify()
    }

    @After
    fun teardown() {
        testApp.exit(wmHelper)
    }

    private companion object {
        val CAPTION_BAR_OFFSET_Y_PX = 20
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -333,7 +333,7 @@ open class DesktopModeAppHelper(private val innerHelper: IStandardAppHelper) :
            .waitForAndVerify()
    }

    private fun getCaptionForTheApp(
    fun getCaptionForTheApp(
        wmHelper: WindowManagerStateHelper,
        device: UiDevice
    ): UiObject2? {