• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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 android.server.wm;
18 
19 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
20 import static android.server.wm.ComponentNameUtils.getWindowName;
21 import static android.server.wm.UiDeviceUtils.pressUnlockButton;
22 import static android.server.wm.WindowManagerState.STATE_STOPPED;
23 import static android.server.wm.app.Components.SHOW_WHEN_LOCKED_ACTIVITY;
24 import static android.server.wm.app.Components.TEST_ACTIVITY;
25 import static android.server.wm.app.Components.TEST_DREAM_SERVICE;
26 import static android.server.wm.app.Components.TEST_STUBBORN_DREAM_SERVICE;
27 import static android.view.Display.DEFAULT_DISPLAY;
28 
29 import static org.junit.Assert.assertFalse;
30 import static org.junit.Assert.assertTrue;
31 import static org.junit.Assert.fail;
32 import static org.junit.Assume.assumeFalse;
33 import static org.junit.Assume.assumeTrue;
34 
35 import android.content.ComponentName;
36 import android.platform.test.annotations.Presubmit;
37 import android.server.wm.app.Components;
38 import android.view.Surface;
39 
40 import org.junit.After;
41 import org.junit.Before;
42 import org.junit.Test;
43 
44 @Presubmit
45 public class DreamManagerServiceTests extends ActivityManagerTestBase {
46 
47     // Maximum timeout in seconds after which the dream should have finished willingly
48     private static final int ACTIVITY_STOP_MAX_TIMEOUT = 3;
49 
50     // Maximum timeout in seconds after which the dream should have been forcefully stopped
51     private static final int DREAM_FORCE_STOP_MAX_TIMEOUT = 15;
52 
53     private ComponentName mDreamActivityName;
54 
55     private DreamCoordinator mDreamCoordinator = new DreamCoordinator(mContext);
56 
57     @Before
setup()58     public void setup() {
59         mDreamCoordinator.setup();
60     }
61 
62     @After
reset()63     public void reset() {
64         mDreamCoordinator.restoreDefaults();
65         mDreamCoordinator.stopDream();
66     }
67 
waitAndAssertDreamActivityGone(int maxTimeOutInSeconds)68     private void waitAndAssertDreamActivityGone(int maxTimeOutInSeconds) {
69         String msg = "Dream Activity must be gone";
70         Condition.waitFor(new Condition<>(msg, this::isDreamActivityGone)
71                 .setRetryLimit(maxTimeOutInSeconds)
72                 .setOnFailure(o -> fail(msg))
73         );
74     }
75 
isDreamActivityGone()76     private boolean isDreamActivityGone() {
77         mWmState.computeState();
78         return !mWmState.containsWindow(getWindowName(mDreamActivityName))
79                 && !mWmState.containsActivity(mDreamActivityName);
80     }
81 
startFullscreenTestActivity()82     private void startFullscreenTestActivity() {
83         launchActivity(TEST_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
84         waitAndAssertTopResumedActivity(TEST_ACTIVITY, DEFAULT_DISPLAY,
85                 "Test activity should be the top resumed activity");
86         mWmState.assertVisibility(TEST_ACTIVITY, true);
87     }
88 
startFullscreenTestActivityWithShowWhenLocked()89     private void startFullscreenTestActivityWithShowWhenLocked() {
90         launchActivity(SHOW_WHEN_LOCKED_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
91         waitAndAssertTopResumedActivity(SHOW_WHEN_LOCKED_ACTIVITY, DEFAULT_DISPLAY,
92                 "Test activity with android:showWhenLocked should be the top resumed activity");
93         mWmState.assertVisibility(SHOW_WHEN_LOCKED_ACTIVITY, true);
94     }
95 
96 
97     @Test
testStartAndStopDream()98     public void testStartAndStopDream() throws Exception {
99         startFullscreenTestActivity();
100         mDreamActivityName = mDreamCoordinator.setActiveDream(TEST_DREAM_SERVICE);
101 
102         mDreamCoordinator.startDream();
103         waitAndAssertTopResumedActivity(mDreamActivityName, DEFAULT_DISPLAY,
104                 "Dream activity should be the top resumed activity");
105         mWmState.waitForValidState(mWmState.getHomeActivityName());
106         mWmState.assertVisibility(mWmState.getHomeActivityName(), false);
107         mWmState.waitForValidState(TEST_ACTIVITY);
108         mWmState.assertVisibility(TEST_ACTIVITY, false);
109 
110         assertTrue(mDreamCoordinator.isDreaming());
111 
112         mDreamCoordinator.stopDream();
113         mWmState.waitAndAssertActivityRemoved(mDreamActivityName);
114 
115         //To reduce flakiness, dismiss keyguard in case the device locked while test was running
116         pressUnlockButton();
117 
118         waitAndAssertTopResumedActivity(TEST_ACTIVITY, DEFAULT_DISPLAY,
119                 "Previous top activity should show when dream is stopped");
120     }
121 
122     @Test
testShowWhenLockedActivityUnderDream()123     public void testShowWhenLockedActivityUnderDream() throws Exception {
124         startFullscreenTestActivityWithShowWhenLocked();
125         mDreamActivityName = mDreamCoordinator.setActiveDream(TEST_DREAM_SERVICE);
126 
127         mDreamCoordinator.startDream();
128         waitAndAssertTopResumedActivity(mDreamActivityName, DEFAULT_DISPLAY,
129                 "Dream activity should be the top resumed activity");
130         mWmState.waitForValidState(mWmState.getHomeActivityName());
131         mWmState.assertVisibility(mWmState.getHomeActivityName(), false);
132         mWmState.waitForValidState(SHOW_WHEN_LOCKED_ACTIVITY);
133         mWmState.assertVisibility(SHOW_WHEN_LOCKED_ACTIVITY, false);
134 
135         assertTrue(mDreamCoordinator.isDreaming());
136 
137         mDreamCoordinator.stopDream();
138         mWmState.waitAndAssertActivityRemoved(mDreamActivityName);
139 
140         waitAndAssertTopResumedActivity(SHOW_WHEN_LOCKED_ACTIVITY, DEFAULT_DISPLAY,
141                 "ShowWhenLocked activity should be resumed when dream is stopped");
142         mWmState.assertVisibility(SHOW_WHEN_LOCKED_ACTIVITY, true);
143     }
144 
145 
146     @Test
testDreamServiceStopsTimely()147     public void testDreamServiceStopsTimely() throws Exception {
148         mDreamActivityName = mDreamCoordinator.setActiveDream(TEST_DREAM_SERVICE);
149 
150         mDreamCoordinator.startDream();
151         waitAndAssertTopResumedActivity(mDreamActivityName, DEFAULT_DISPLAY,
152                 "Dream activity should be the top resumed activity");
153         mWmState.waitForValidState(mWmState.getHomeActivityName());
154         mWmState.assertVisibility(mWmState.getHomeActivityName(), false);
155         assertTrue(mDreamCoordinator.isDreaming());
156 
157         mDreamCoordinator.stopDream();
158 
159         waitAndAssertDreamActivityGone(ACTIVITY_STOP_MAX_TIMEOUT);
160 
161         assertFalse(mDreamCoordinator.isDreaming());
162     }
163 
164     @Test
testForceStopStubbornDream()165     public void testForceStopStubbornDream() throws Exception {
166         startFullscreenTestActivity();
167         mDreamActivityName = mDreamCoordinator.setActiveDream(TEST_STUBBORN_DREAM_SERVICE);
168 
169         mDreamCoordinator.startDream();
170         waitAndAssertTopResumedActivity(mDreamActivityName, DEFAULT_DISPLAY,
171                 "Dream activity should be the top resumed activity");
172         mWmState.waitForValidState(mWmState.getHomeActivityName());
173         mWmState.assertVisibility(mWmState.getHomeActivityName(), false);
174         mWmState.waitForValidState(TEST_ACTIVITY);
175         mWmState.assertVisibility(TEST_ACTIVITY, false);
176 
177         mDreamCoordinator.stopDream();
178 
179         waitAndAssertDreamActivityGone(DREAM_FORCE_STOP_MAX_TIMEOUT);
180 
181         assertFalse(mDreamCoordinator.isDreaming());
182         pressUnlockButton();
183         waitAndAssertTopResumedActivity(TEST_ACTIVITY, DEFAULT_DISPLAY,
184                 "Previous top activity should show when dream is stopped");
185     }
186 
187     @Test
testDreamNotFinishAfterRotation()188     public void testDreamNotFinishAfterRotation() {
189         assumeTrue("Skipping test: no rotation support", supportsRotation());
190 
191         final RotationSession rotationSession = createManagedRotationSession();
192         rotationSession.set(Surface.ROTATION_0);
193         mDreamActivityName = mDreamCoordinator.setActiveDream(TEST_DREAM_SERVICE);
194         mDreamCoordinator.startDream();
195         rotationSession.set(Surface.ROTATION_90);
196 
197         waitAndAssertTopResumedActivity(mDreamActivityName, DEFAULT_DISPLAY,
198                 "Dream activity should be the top resumed activity");
199     }
200 
201     @Test
testStartActivityDoesNotWakeAndIsNotResumed()202     public void testStartActivityDoesNotWakeAndIsNotResumed() {
203         assumeFalse(dismissDreamOnActivityStart());
204 
205         try (DreamingState state = new DreamingState(TEST_DREAM_SERVICE)) {
206             launchActivity(Components.TEST_ACTIVITY);
207             mWmState.waitForActivityState(Components.TEST_ACTIVITY, STATE_STOPPED);
208             assertTrue(mDreamCoordinator.isDreaming());
209         }
210     }
211 
212     @Test
testStartActivityWakesDevice()213     public void testStartActivityWakesDevice() {
214         assumeTrue(dismissDreamOnActivityStart());
215 
216         try (DreamingState state = new DreamingState(TEST_DREAM_SERVICE)) {
217             launchActivity(TEST_ACTIVITY);
218             state.waitForDreamGone();
219             assertFalse(mDreamCoordinator.isDreaming());
220             waitAndAssertTopResumedActivity(TEST_ACTIVITY, DEFAULT_DISPLAY,
221                     "Test activity should be the top resumed activity");
222             mWmState.assertVisibility(TEST_ACTIVITY, true);
223         }
224     }
225 
226     @Test
testStartTurnScreenOnActivityDoesWake()227     public void testStartTurnScreenOnActivityDoesWake() {
228         try (DreamingState state = new DreamingState(TEST_DREAM_SERVICE)) {
229             launchActivity(Components.TURN_SCREEN_ON_ACTIVITY);
230 
231             state.waitForDreamGone();
232             waitAndAssertTopResumedActivity(Components.TURN_SCREEN_ON_ACTIVITY,
233                     DEFAULT_DISPLAY, "TurnScreenOnActivity should resume through dream");
234         }
235     }
236 
237     @Test
testStartTurnScreenOnAttrActivityDoesWake()238     public void testStartTurnScreenOnAttrActivityDoesWake() {
239         try (DreamingState state = new DreamingState(TEST_DREAM_SERVICE)) {
240             launchActivity(Components.TURN_SCREEN_ON_ATTR_ACTIVITY);
241             pressUnlockButton();
242             state.waitForDreamGone();
243             waitAndAssertTopResumedActivity(Components.TURN_SCREEN_ON_ATTR_ACTIVITY,
244                     DEFAULT_DISPLAY, "TurnScreenOnAttrActivity should resume through dream");
245         }
246     }
247 
248     @Test
testStartActivityOnKeyguardLocked()249     public void testStartActivityOnKeyguardLocked() {
250         assumeTrue(supportsLockScreen());
251         assumeFalse(dismissDreamOnActivityStart());
252 
253         final LockScreenSession lockScreenSession = createManagedLockScreenSession();
254         lockScreenSession.setLockCredential();
255         try (DreamingState state = new DreamingState(TEST_DREAM_SERVICE)) {
256             launchActivityNoWait(Components.TEST_ACTIVITY);
257             waitAndAssertActivityState(Components.TEST_ACTIVITY, STATE_STOPPED,
258                 "Activity must be started and stopped");
259             assertTrue(mDreamCoordinator.isDreaming());
260 
261             launchActivity(Components.TURN_SCREEN_ON_SHOW_ON_LOCK_ACTIVITY);
262             state.waitForDreamGone();
263             waitAndAssertTopResumedActivity(Components.TURN_SCREEN_ON_SHOW_ON_LOCK_ACTIVITY,
264                     DEFAULT_DISPLAY, "TurnScreenOnShowOnLockActivity should resume through dream");
265             assertFalse(mDreamCoordinator.isDreaming());
266         }
267     }
268 
269     @Test
testStartActivityDismissesDreamOnKeyguardLocked()270     public void testStartActivityDismissesDreamOnKeyguardLocked() {
271         assumeTrue(supportsLockScreen());
272         assumeTrue(dismissDreamOnActivityStart());
273 
274         final LockScreenSession lockScreenSession = createManagedLockScreenSession();
275         lockScreenSession.setLockCredential();
276         try (DreamingState state = new DreamingState(TEST_DREAM_SERVICE)) {
277             launchActivity(SHOW_WHEN_LOCKED_ACTIVITY);
278             state.waitForDreamGone();
279             waitAndAssertTopResumedActivity(SHOW_WHEN_LOCKED_ACTIVITY,
280                     DEFAULT_DISPLAY, "Activity should dismiss dream");
281             assertFalse(mDreamCoordinator.isDreaming());
282         }
283     }
284 
285     private class DreamingState implements AutoCloseable {
DreamingState(ComponentName dream)286         public DreamingState(ComponentName dream) {
287             mDreamActivityName = mDreamCoordinator.setActiveDream(dream);
288             mDreamCoordinator.startDream();
289             waitAndAssertDreaming();
290         }
291 
292         @Override
close()293         public void close() {
294             mDreamCoordinator.stopDream();
295         }
296 
waitAndAssertDreaming()297         public void waitAndAssertDreaming() {
298             waitAndAssertTopResumedActivity(mDreamActivityName, DEFAULT_DISPLAY,
299                     "Dream activity should be the top resumed activity");
300             mWmState.waitForActivityState(mWmState.getHomeActivityName(), STATE_STOPPED);
301             mWmState.waitAndAssertVisibilityGone(mWmState.getHomeActivityName());
302             assertTrue(mDreamCoordinator.isDreaming());
303         }
304 
waitForDreamGone()305         public void waitForDreamGone() {
306             mWmState.waitForDreamGone();
307             assertFalse(mDreamCoordinator.isDreaming());
308         }
309     }
310 }
311