1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.wm.shell.flicker.splitscreen
18 
19 import android.platform.test.annotations.Postsubmit
20 import android.platform.test.annotations.Presubmit
21 import android.tools.NavBar
22 import android.tools.flicker.junit.FlickerParametersRunnerFactory
23 import android.tools.flicker.legacy.FlickerBuilder
24 import android.tools.flicker.legacy.LegacyFlickerTest
25 import android.tools.flicker.legacy.LegacyFlickerTestFactory
26 import androidx.test.filters.FlakyTest
27 import androidx.test.filters.RequiresDevice
28 import com.android.wm.shell.flicker.splitscreen.benchmark.EnterSplitScreenByDragFromTaskbarBenchmark
29 import com.android.wm.shell.flicker.utils.ICommonAssertions
30 import com.android.wm.shell.flicker.utils.SPLIT_SCREEN_DIVIDER_COMPONENT
31 import com.android.wm.shell.flicker.utils.appWindowBecomesVisible
32 import com.android.wm.shell.flicker.utils.appWindowIsVisibleAtEnd
33 import com.android.wm.shell.flicker.utils.layerBecomesVisible
34 import com.android.wm.shell.flicker.utils.layerIsVisibleAtEnd
35 import com.android.wm.shell.flicker.utils.splitAppLayerBoundsBecomesVisibleByDrag
36 import com.android.wm.shell.flicker.utils.splitAppLayerBoundsIsVisibleAtEnd
37 import com.android.wm.shell.flicker.utils.splitScreenDividerBecomesVisible
38 import org.junit.FixMethodOrder
39 import org.junit.Test
40 import org.junit.runner.RunWith
41 import org.junit.runners.MethodSorters
42 import org.junit.runners.Parameterized
43 
44 /**
45  * Test enter split screen by dragging app icon from taskbar. This test is only for large screen
46  * devices.
47  *
48  * To run this test: `atest WMShellFlickerTestsSplitScreen:EnterSplitScreenByDragFromTaskbar`
49  */
50 @RequiresDevice
51 @RunWith(Parameterized::class)
52 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
53 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
54 class EnterSplitScreenByDragFromTaskbar(override val flicker: LegacyFlickerTest) :
55     EnterSplitScreenByDragFromTaskbarBenchmark(flicker), ICommonAssertions {
56     /** {@inheritDoc} */
57     override val transition: FlickerBuilder.() -> Unit
<lambda>null58         get() = {
59             defaultSetup(this)
60             defaultTeardown(this)
61             thisTransition(this)
62         }
63 
64     @FlakyTest(bugId = 245472831)
65     @Test
splitScreenDividerBecomesVisiblenull66     fun splitScreenDividerBecomesVisible() {
67         flicker.splitScreenDividerBecomesVisible()
68     }
69 
70     // TODO(b/245472831): Back to splitScreenDividerBecomesVisible after shell transition ready.
71     @Presubmit
72     @Test
splitScreenDividerIsVisibleAtEndnull73     fun splitScreenDividerIsVisibleAtEnd() {
74         flicker.assertLayersEnd { this.isVisible(SPLIT_SCREEN_DIVIDER_COMPONENT) }
75     }
76 
primaryAppLayerIsVisibleAtEndnull77     @Presubmit @Test fun primaryAppLayerIsVisibleAtEnd() = flicker.layerIsVisibleAtEnd(primaryApp)
78 
79     @Presubmit
80     @Test
81     fun secondaryAppLayerBecomesVisible() {
82         flicker.layerBecomesVisible(secondaryApp)
83     }
84 
85     @Presubmit
86     @Test
primaryAppBoundsIsVisibleAtEndnull87     fun primaryAppBoundsIsVisibleAtEnd() =
88         flicker.splitAppLayerBoundsIsVisibleAtEnd(
89             primaryApp,
90             landscapePosLeft = false,
91             portraitPosTop = false
92         )
93 
94     @Presubmit
95     @Test
96     fun secondaryAppBoundsBecomesVisible() =
97         flicker.splitAppLayerBoundsBecomesVisibleByDrag(secondaryApp)
98 
99     @Presubmit
100     @Test
101     fun primaryAppWindowIsVisibleAtEnd() = flicker.appWindowIsVisibleAtEnd(primaryApp)
102 
103     @Presubmit
104     @Test
105     fun secondaryAppWindowBecomesVisible() = flicker.appWindowBecomesVisible(secondaryApp)
106 
107     /** {@inheritDoc} */
108     @Postsubmit @Test override fun entireScreenCovered() = super.entireScreenCovered()
109 
110     /** {@inheritDoc} */
111     @Postsubmit
112     @Test
113     override fun navBarLayerIsVisibleAtStartAndEnd() = super.navBarLayerIsVisibleAtStartAndEnd()
114 
115     /** {@inheritDoc} */
116     @Postsubmit
117     @Test
118     override fun navBarLayerPositionAtStartAndEnd() = super.navBarLayerPositionAtStartAndEnd()
119 
120     /** {@inheritDoc} */
121     @Postsubmit
122     @Test
123     override fun navBarWindowIsAlwaysVisible() = super.navBarWindowIsAlwaysVisible()
124 
125     /** {@inheritDoc} */
126     @Postsubmit
127     @Test
128     override fun statusBarLayerIsVisibleAtStartAndEnd() =
129         super.statusBarLayerIsVisibleAtStartAndEnd()
130 
131     /** {@inheritDoc} */
132     @Postsubmit
133     @Test
134     override fun statusBarLayerPositionAtStartAndEnd() = super.statusBarLayerPositionAtStartAndEnd()
135 
136     /** {@inheritDoc} */
137     @Postsubmit
138     @Test
139     override fun statusBarWindowIsAlwaysVisible() = super.statusBarWindowIsAlwaysVisible()
140 
141     /** {@inheritDoc} */
142     @Postsubmit
143     @Test
144     override fun taskBarLayerIsVisibleAtStartAndEnd() = super.taskBarLayerIsVisibleAtStartAndEnd()
145 
146     /** {@inheritDoc} */
147     @Postsubmit
148     @Test
149     override fun taskBarWindowIsAlwaysVisible() = super.taskBarWindowIsAlwaysVisible()
150 
151     /** {@inheritDoc} */
152     @Postsubmit
153     @Test
154     override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
155         super.visibleLayersShownMoreThanOneConsecutiveEntry()
156 
157     /** {@inheritDoc} */
158     @Postsubmit
159     @Test
160     override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
161         super.visibleWindowsShownMoreThanOneConsecutiveEntry()
162 
163     companion object {
164         @Parameterized.Parameters(name = "{0}")
165         @JvmStatic
166         fun getParams() =
167             LegacyFlickerTestFactory.nonRotationTests(
168                 supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
169             )
170     }
171 }
172