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