Loading libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/functional/DragMoveWindowToNextDisplayTest.kt 0 → 100644 +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() libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/DragMoveWindowToNextDisplay.kt 0 → 100644 +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 } } tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/DesktopModeAppHelper.kt +1 −1 Original line number Diff line number Diff line Loading @@ -333,7 +333,7 @@ open class DesktopModeAppHelper(private val innerHelper: IStandardAppHelper) : .waitForAndVerify() } private fun getCaptionForTheApp( fun getCaptionForTheApp( wmHelper: WindowManagerStateHelper, device: UiDevice ): UiObject2? { Loading Loading
libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/functional/DragMoveWindowToNextDisplayTest.kt 0 → 100644 +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()
libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/DragMoveWindowToNextDisplay.kt 0 → 100644 +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 } }
tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/DesktopModeAppHelper.kt +1 −1 Original line number Diff line number Diff line Loading @@ -333,7 +333,7 @@ open class DesktopModeAppHelper(private val innerHelper: IStandardAppHelper) : .waitForAndVerify() } private fun getCaptionForTheApp( fun getCaptionForTheApp( wmHelper: WindowManagerStateHelper, device: UiDevice ): UiObject2? { Loading