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

Commit d74344d9 authored by Ajinkya Chalke's avatar Ajinkya Chalke
Browse files

Add test for switching out of desktop with Alt+Tab

- Added a functional test to switch out and into desktop mode from
  fullscreen app.

Bug: 382769617
Test: atest WMShellFlickerTestsDesktopMode:com.android.wm.shell.functional.AltTabSwitchOutDesktopModeTest
Flag: EXEMPT adding functional test
Change-Id: Idcdd77538f2aed0ee3e4feb8f2a855571562c44d
parent aacd8b5d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ java_library {
        "WMShellTestUtils",
        "wm-shell-flicker-utils",
        "androidx.test.ext.junit",
        "com_android_launcher3_flags_lib",
        "flickertestapplib",
        "flickerlib-helpers",
        "flickerlib-trace_processor_shell",
+29 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 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 android.platform.test.rule.ScreenRecordRule
import com.android.wm.shell.scenarios.AltTabSwitchOutDesktopMode
import org.junit.runner.RunWith
import org.junit.runners.BlockJUnit4ClassRunner

/* Functional test for Alt+Tab app switching out of desktop mode. */
@RunWith(BlockJUnit4ClassRunner::class)
@Postsubmit
@ScreenRecordRule.ScreenRecord
class AltTabSwitchOutDesktopModeTest : AltTabSwitchOutDesktopMode()
+87 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 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.app.Instrumentation
import android.platform.test.annotations.RequiresFlagsEnabled
import android.tools.flicker.rules.ChangeDisplayOrientationRule
import android.tools.NavBar
import android.tools.Rotation
import android.tools.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.android.launcher3.tapl.LauncherInstrumentation
import com.android.server.wm.flicker.helpers.DesktopModeAppHelper
import com.android.server.wm.flicker.helpers.MailAppHelper
import com.android.server.wm.flicker.helpers.SimpleAppHelper
import com.android.window.flags.Flags
import com.android.wm.shell.Utils
import org.junit.After
import org.junit.Assume
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test

@Ignore("Test Base Class")
@RequiresFlagsEnabled(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
    com.android.launcher3.Flags.FLAG_ENABLE_ALT_TAB_KQS_FLATENNING
)
abstract class AltTabSwitchOutDesktopMode : TestScenarioBase() {
    private val rotation: Rotation = Rotation.ROTATION_0
    private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
    private val tapl = LauncherInstrumentation()
    private val wmHelper = WindowManagerStateHelper(instrumentation)
    private val device = UiDevice.getInstance(instrumentation)
    private val firstApp = DesktopModeAppHelper(SimpleAppHelper(instrumentation))
    private val secondApp = DesktopModeAppHelper(MailAppHelper(instrumentation))

    @Rule
    @JvmField val testSetupRule = Utils.testSetupRule(NavBar.MODE_GESTURAL, rotation)

    @Before
    fun setup() {
        Assume.assumeTrue(tapl.isTablet)
        tapl.setEnableRotation(true)
        tapl.setExpectedRotation(rotation.value)
        tapl.enableTransientTaskbar(false)
        ChangeDisplayOrientationRule.setRotation(rotation)
    }

    @Test
    fun switchBetweenFullscreenAppAndDesktopApp() {
        firstApp.launchViaIntent(wmHelper)
        secondApp.enterDesktopMode(wmHelper, device)

        tapl.launchedAppState
            .showQuickSwitchView()
            .launchFocusedAppTask(firstApp.packageName)
        firstApp.waitForTransitionToFullscreen(wmHelper)

        tapl.launchedAppState
            .showQuickSwitchView()
            .launchFocusedAppTask(secondApp.packageName)
        secondApp.waitForTransitionToFreeform(wmHelper)
    }

    @After
    fun teardown() {
        firstApp.exit(wmHelper)
        secondApp.exit(wmHelper)
    }
}
+10 −1
Original line number Diff line number Diff line
@@ -598,7 +598,7 @@ open class DesktopModeAppHelper(private val innerHelper: IStandardAppHelper) :


    /** Wait for transition to full screen to finish. */
    private fun waitForTransitionToFullscreen(wmHelper: WindowManagerStateHelper) {
    fun waitForTransitionToFullscreen(wmHelper: WindowManagerStateHelper) {
        wmHelper
            .StateSyncBuilder()
            .withFullScreenApp(innerHelper)
@@ -606,6 +606,15 @@ open class DesktopModeAppHelper(private val innerHelper: IStandardAppHelper) :
            .waitForAndVerify()
    }

    /** Wait for transition to freeform to finish. */
    fun waitForTransitionToFreeform(wmHelper: WindowManagerStateHelper) {
        wmHelper
            .StateSyncBuilder()
            .withFreeformApp(innerHelper)
            .withAppTransitionIdle()
            .waitForAndVerify()
    }

    private fun getWindowInsets(context: Context, typeMask: Int): Insets {
        val wm: WindowManager = context.getSystemService(WindowManager::class.java)
            ?: error("Unable to connect to WindowManager service")