blob: 95adc9cd5a1a77e0d546e17b877969c5c86c9480 [file] [log] [blame]
Wale Ogunwaleb699ce02016-07-18 12:05:30 -07001/*
2 * Copyright (C) 2016 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
17package com.android.server.wm;
18
Jorim Jaggi9bafc712017-01-19 17:28:30 +010019import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
Andrii Kulian3a1619d2017-07-07 14:38:09 -070020import static android.view.WindowManagerPolicy.NAV_BAR_BOTTOM;
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -070021
22import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
23
24import static org.mockito.ArgumentMatchers.anyString;
jackqdyulei455e90a2017-02-09 15:29:16 -080025import static org.mockito.Matchers.anyInt;
26import static org.mockito.Mockito.doReturn;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070027import static org.mockito.Mockito.mock;
Wale Ogunwale17f175c2017-02-07 16:54:10 -080028import static org.mockito.Mockito.any;
29import static org.mockito.Mockito.doAnswer;
jackqdyulei455e90a2017-02-09 15:29:16 -080030
31import android.os.PowerSaveState;
Wale Ogunwale17f175c2017-02-07 16:54:10 -080032import org.mockito.invocation.InvocationOnMock;
Wale Ogunwalecfca2582016-10-19 09:53:25 -070033
Jorim Jaggiba41f4b2016-12-14 17:43:07 -080034import android.annotation.Nullable;
Wale Ogunwale17f175c2017-02-07 16:54:10 -080035import android.app.ActivityManagerInternal;
Jorim Jaggiba41f4b2016-12-14 17:43:07 -080036import android.content.Context;
37import android.content.res.CompatibilityInfo;
38import android.content.res.Configuration;
39import android.graphics.Rect;
Andrii Kulian4ede3e02017-01-12 11:52:31 -080040import android.hardware.display.DisplayManagerInternal;
Jorim Jaggiba41f4b2016-12-14 17:43:07 -080041import android.os.Bundle;
42import android.os.IBinder;
43import android.os.RemoteException;
Jorim Jaggiba41f4b2016-12-14 17:43:07 -080044import android.view.Display;
45import android.view.IWindowManager;
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -070046import android.view.InputChannel;
Jorim Jaggiba41f4b2016-12-14 17:43:07 -080047import android.view.KeyEvent;
48import android.view.WindowManager;
49import android.view.WindowManagerPolicy;
50import android.view.animation.Animation;
Andrii Kulian4ede3e02017-01-12 11:52:31 -080051import android.os.PowerManagerInternal;
Jorim Jaggiba41f4b2016-12-14 17:43:07 -080052
53import com.android.internal.policy.IKeyguardDismissCallback;
54import com.android.internal.policy.IShortcutService;
55import com.android.server.input.InputManagerService;
Andrii Kulian4ede3e02017-01-12 11:52:31 -080056import com.android.server.LocalServices;
Jorim Jaggiba41f4b2016-12-14 17:43:07 -080057
58import java.io.PrintWriter;
59
Wale Ogunwalecfca2582016-10-19 09:53:25 -070060class TestWindowManagerPolicy implements WindowManagerPolicy {
Wale Ogunwaleadde52e2016-07-16 13:11:55 -070061 private static final String TAG = "TestWindowManagerPolicy";
Wale Ogunwaleb699ce02016-07-18 12:05:30 -070062
Wale Ogunwale51362492016-09-08 17:49:17 -070063 private static WindowManagerService sWm = null;
64
Andrii Kulian4ede3e02017-01-12 11:52:31 -080065 int rotationToReport = 0;
66
Jorim Jaggi9bafc712017-01-19 17:28:30 +010067 private Runnable mRunnableWhenAddingSplashScreen;
68
Wale Ogunwale51362492016-09-08 17:49:17 -070069 static synchronized WindowManagerService getWindowManagerService(Context context) {
70 if (sWm == null) {
71 // We only want to do this once for the test process as we don't want WM to try to
72 // register a bunch of local services again.
Andrii Kulian4ede3e02017-01-12 11:52:31 -080073 if (LocalServices.getService(DisplayManagerInternal.class) == null) {
74 LocalServices.addService(DisplayManagerInternal.class,
75 mock(DisplayManagerInternal.class));
76 }
77 if (LocalServices.getService(PowerManagerInternal.class) == null) {
78 LocalServices.addService(PowerManagerInternal.class,
79 mock(PowerManagerInternal.class));
jackqdyulei455e90a2017-02-09 15:29:16 -080080 final PowerManagerInternal pm =
81 LocalServices.getService(PowerManagerInternal.class);
82 PowerSaveState state = new PowerSaveState.Builder().build();
83 doReturn(state).when(pm).getLowPowerState(anyInt());
Andrii Kulian4ede3e02017-01-12 11:52:31 -080084 }
Wale Ogunwale17f175c2017-02-07 16:54:10 -080085 if (LocalServices.getService(ActivityManagerInternal.class) == null) {
86 LocalServices.addService(ActivityManagerInternal.class,
87 mock(ActivityManagerInternal.class));
88 final ActivityManagerInternal am =
89 LocalServices.getService(ActivityManagerInternal.class);
90 doAnswer((InvocationOnMock invocationOnMock) -> {
Paul Duffin192bb0b2017-03-09 18:49:41 +000091 final Runnable runnable = invocationOnMock.<Runnable>getArgument(0);
Wale Ogunwale17f175c2017-02-07 16:54:10 -080092 if (runnable != null) {
93 runnable.run();
94 }
95 return null;
96 }).when(am).notifyKeyguardFlagsChanged(any());
97 }
Bryce Lee04ab3462017-04-10 15:06:33 -070098
Tarandeep Singhe1cfcf42017-07-10 18:50:00 -070099 InputManagerService ims = mock(InputManagerService.class);
100 // InputChannel is final and can't be mocked.
101 InputChannel[] input = InputChannel.openInputChannelPair(TAG_WM);
102 if (input != null && input.length > 1) {
103 doReturn(input[1]).when(ims).monitorInput(anyString());
104 }
105
106 sWm = WindowManagerService.main(context, ims, true, false,
Wale Ogunwalecfca2582016-10-19 09:53:25 -0700107 false, new TestWindowManagerPolicy());
Wale Ogunwale51362492016-09-08 17:49:17 -0700108 }
109 return sWm;
110 }
111
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700112 @Override
113 public void registerShortcutKey(long shortcutCode, IShortcutService shortcutKeyReceiver)
114 throws RemoteException {
115
116 }
117
118 @Override
119 public void init(Context context, IWindowManager windowManager,
120 WindowManagerFuncs windowManagerFuncs) {
121
122 }
123
124 @Override
125 public boolean isDefaultOrientationForced() {
126 return false;
127 }
128
129 @Override
130 public void setInitialDisplaySize(Display display, int width, int height, int density) {
131
132 }
133
134 @Override
135 public void setDisplayOverscan(Display display, int left, int top, int right, int bottom) {
136
137 }
138
139 @Override
140 public int checkAddPermission(WindowManager.LayoutParams attrs, int[] outAppOp) {
141 return 0;
142 }
143
144 @Override
145 public boolean checkShowToOwnerOnly(WindowManager.LayoutParams attrs) {
146 return false;
147 }
148
149 @Override
150 public void adjustWindowParamsLw(WindowManager.LayoutParams attrs) {
151
152 }
153
154 @Override
155 public void adjustConfigurationLw(Configuration config, int keyboardPresence,
156 int navigationPresence) {
157
158 }
159
160 @Override
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700161 public int getMaxWallpaperLayer() {
162 return 0;
163 }
164
165 @Override
Andrii Kuliandb8e1062016-11-15 18:30:27 -0800166 public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode,
167 int displayId) {
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700168 return 0;
169 }
170
171 @Override
Andrii Kuliandb8e1062016-11-15 18:30:27 -0800172 public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode,
173 int displayId) {
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700174 return 0;
175 }
176
177 @Override
Andrii Kuliandb8e1062016-11-15 18:30:27 -0800178 public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode,
179 int displayId) {
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700180 return 0;
181 }
182
183 @Override
Andrii Kuliandb8e1062016-11-15 18:30:27 -0800184 public int getConfigDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode,
185 int displayId) {
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700186 return 0;
187 }
188
189 @Override
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700190 public boolean isKeyguardHostWindow(WindowManager.LayoutParams attrs) {
191 return false;
192 }
193
194 @Override
Jorim Jaggife762342016-10-13 14:33:27 +0200195 public boolean canBeHiddenByKeyguardLw(WindowState win) {
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700196 return false;
197 }
198
Jorim Jaggi9bafc712017-01-19 17:28:30 +0100199 /**
200 * Sets a runnable to run when adding a splash screen which gets executed after the window has
201 * been added but before returning the surface.
202 */
203 void setRunnableWhenAddingSplashScreen(Runnable r) {
204 mRunnableWhenAddingSplashScreen = r;
205 }
206
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700207 @Override
Jorim Jaggiba41f4b2016-12-14 17:43:07 -0800208 public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme,
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700209 CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon,
Andrii Kulianfb1bf692017-01-17 11:17:34 -0800210 int logo, int windowFlags, Configuration overrideConfig, int displayId) {
Jorim Jaggi9bafc712017-01-19 17:28:30 +0100211 final com.android.server.wm.WindowState window;
212 final AppWindowToken atoken;
213 synchronized (sWm.mWindowMap) {
Wale Ogunwale11cc5162017-04-25 20:29:13 -0700214 atoken = sWm.mRoot.getAppWindowToken(appToken);
Jorim Jaggi9bafc712017-01-19 17:28:30 +0100215 window = WindowTestsBase.createWindow(null, TYPE_APPLICATION_STARTING, atoken,
216 "Starting window");
217 atoken.startingWindow = window;
218 }
219 if (mRunnableWhenAddingSplashScreen != null) {
220 mRunnableWhenAddingSplashScreen.run();
221 mRunnableWhenAddingSplashScreen = null;
222 }
223 return () -> {
224 synchronized (sWm.mWindowMap) {
225 atoken.removeChild(window);
226 atoken.startingWindow = null;
227 }
228 };
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700229 }
230
231 @Override
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700232 public int prepareAddWindowLw(WindowState win,
233 WindowManager.LayoutParams attrs) {
234 return 0;
235 }
236
237 @Override
238 public void removeWindowLw(WindowState win) {
239
240 }
241
242 @Override
243 public int selectAnimationLw(WindowState win, int transit) {
244 return 0;
245 }
246
247 @Override
248 public void selectRotationAnimationLw(int[] anim) {
249
250 }
251
252 @Override
253 public boolean validateRotationAnimationLw(int exitAnimId, int enterAnimId,
254 boolean forceDefault) {
255 return false;
256 }
257
258 @Override
Jorim Jaggife762342016-10-13 14:33:27 +0200259 public Animation createHiddenByKeyguardExit(boolean onWallpaper,
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700260 boolean goingToNotificationShade) {
261 return null;
262 }
263
264 @Override
Jorim Jaggife762342016-10-13 14:33:27 +0200265 public Animation createKeyguardWallpaperExit(boolean goingToNotificationShade) {
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700266 return null;
267 }
268
269 @Override
270 public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
271 return 0;
272 }
273
274 @Override
275 public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags) {
276 return 0;
277 }
278
279 @Override
280 public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event,
281 int policyFlags) {
282 return 0;
283 }
284
285 @Override
286 public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event,
287 int policyFlags) {
288 return null;
289 }
290
291 @Override
292 public void beginLayoutLw(boolean isDefaultDisplay, int displayWidth, int displayHeight,
293 int displayRotation, int uiMode) {
294
295 }
296
297 @Override
298 public int getSystemDecorLayerLw() {
299 return 0;
300 }
301
302 @Override
303 public void getContentRectLw(Rect r) {
304
305 }
306
307 @Override
308 public void layoutWindowLw(WindowState win,
309 WindowState attached) {
310
311 }
312
313 @Override
314 public boolean getInsetHintLw(WindowManager.LayoutParams attrs, Rect taskBounds,
315 int displayRotation, int displayWidth, int displayHeight, Rect outContentInsets,
316 Rect outStableInsets, Rect outOutsets) {
317 return false;
318 }
319
320 @Override
321 public void finishLayoutLw() {
322
323 }
324
325 @Override
326 public void beginPostLayoutPolicyLw(int displayWidth, int displayHeight) {
327
328 }
329
330 @Override
331 public void applyPostLayoutPolicyLw(WindowState win,
Jorim Jaggife762342016-10-13 14:33:27 +0200332 WindowManager.LayoutParams attrs, WindowState attached, WindowState imeTarget) {
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700333 }
334
335 @Override
336 public int finishPostLayoutPolicyLw() {
337 return 0;
338 }
339
340 @Override
341 public boolean allowAppAnimationsLw() {
342 return false;
343 }
344
345 @Override
346 public int focusChangedLw(WindowState lastFocus,
347 WindowState newFocus) {
348 return 0;
349 }
350
351 @Override
352 public void startedWakingUp() {
353
354 }
355
356 @Override
357 public void finishedWakingUp() {
358
359 }
360
361 @Override
362 public void startedGoingToSleep(int why) {
363
364 }
365
366 @Override
367 public void finishedGoingToSleep(int why) {
368
369 }
370
371 @Override
372 public void screenTurningOn(ScreenOnListener screenOnListener) {
373
374 }
375
376 @Override
377 public void screenTurnedOn() {
378
379 }
380
381 @Override
Jorim Jaggi51304d72017-05-17 17:25:32 +0200382 public void screenTurningOff(ScreenOffListener screenOffListener) {
383
384 }
385
386 @Override
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700387 public void screenTurnedOff() {
388
389 }
390
391 @Override
392 public boolean isScreenOn() {
Jorim Jaggi9bafc712017-01-19 17:28:30 +0100393 return true;
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700394 }
395
396 @Override
Adrian Roos7c894802017-07-19 12:25:34 +0200397 public boolean okToAnimate() {
Adrian Roose94c15c2017-05-09 13:17:54 -0700398 return true;
399 }
400
401 @Override
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700402 public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) {
403
404 }
405
406 @Override
407 public void notifyCameraLensCoverSwitchChanged(long whenNanos, boolean lensCovered) {
408
409 }
410
411 @Override
412 public void enableKeyguard(boolean enabled) {
413
414 }
415
416 @Override
417 public void exitKeyguardSecurely(OnKeyguardExitResult callback) {
418
419 }
420
421 @Override
422 public boolean isKeyguardLocked() {
423 return false;
424 }
425
426 @Override
427 public boolean isKeyguardSecure(int userId) {
428 return false;
429 }
430
431 @Override
Jorim Jaggife762342016-10-13 14:33:27 +0200432 public boolean isKeyguardOccluded() {
433 return false;
434 }
435
436 @Override
437 public boolean isKeyguardTrustedLw() {
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700438 return false;
439 }
440
441 @Override
442 public boolean isKeyguardShowingAndNotOccluded() {
443 return false;
444 }
445
446 @Override
447 public boolean inKeyguardRestrictedKeyInputMode() {
448 return false;
449 }
450
451 @Override
Jorim Jaggi241ae102016-11-02 21:57:33 -0700452 public void dismissKeyguardLw(@Nullable IKeyguardDismissCallback callback) {
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700453 }
454
455 @Override
Jorim Jaggife762342016-10-13 14:33:27 +0200456 public boolean isKeyguardDrawnLw() {
457 return false;
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700458 }
459
460 @Override
Jorim Jaggi77e10432016-10-26 17:43:56 -0700461 public boolean isShowingDreamLw() {
462 return false;
463 }
464
465 @Override
Jorim Jaggife762342016-10-13 14:33:27 +0200466 public void onKeyguardOccludedChangedLw(boolean occluded) {
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700467 }
468
469 @Override
470 public int rotationForOrientationLw(int orientation,
471 int lastRotation) {
Andrii Kulian4ede3e02017-01-12 11:52:31 -0800472 return rotationToReport;
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700473 }
474
475 @Override
Andrii Kuliana95bfff2017-03-30 19:00:41 -0700476 public boolean rotationHasCompatibleMetricsLw(int orientation, int rotation) {
477 return true;
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700478 }
479
480 @Override
481 public void setRotationLw(int rotation) {
482
483 }
484
485 @Override
486 public void setSafeMode(boolean safeMode) {
487
488 }
489
490 @Override
491 public void systemReady() {
492
493 }
494
495 @Override
496 public void systemBooted() {
497
498 }
499
500 @Override
501 public void showBootMessage(CharSequence msg, boolean always) {
502
503 }
504
505 @Override
506 public void hideBootMessages() {
507
508 }
509
510 @Override
511 public void userActivity() {
512
513 }
514
515 @Override
516 public void enableScreenAfterBoot() {
517
518 }
519
520 @Override
521 public void setCurrentOrientationLw(int newOrientation) {
522
523 }
524
525 @Override
526 public boolean performHapticFeedbackLw(WindowState win, int effectId,
527 boolean always) {
528 return false;
529 }
530
531 @Override
532 public void keepScreenOnStartedLw() {
533
534 }
535
536 @Override
537 public void keepScreenOnStoppedLw() {
538
539 }
540
541 @Override
542 public int getUserRotationMode() {
543 return 0;
544 }
545
546 @Override
547 public void setUserRotationMode(int mode,
548 int rotation) {
549
550 }
551
552 @Override
553 public int adjustSystemUiVisibilityLw(int visibility) {
554 return 0;
555 }
556
557 @Override
558 public boolean hasNavigationBar() {
559 return false;
560 }
561
562 @Override
563 public void lockNow(Bundle options) {
564
565 }
566
567 @Override
568 public void setLastInputMethodWindowLw(WindowState ime,
569 WindowState target) {
570
571 }
572
573 @Override
574 public void showRecentApps(boolean fromHome) {
575
576 }
577
578 @Override
579 public void showGlobalActions() {
580
581 }
582
583 @Override
584 public int getInputMethodWindowVisibleHeightLw() {
585 return 0;
586 }
587
588 @Override
589 public void setCurrentUserLw(int newUserId) {
590
591 }
592
593 @Override
Evan Rosky18396452016-07-27 15:19:37 -0700594 public void setSwitchingUser(boolean switching) {
595
596 }
597
598 @Override
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700599 public void dump(String prefix, PrintWriter writer, String[] args) {
600
601 }
602
603 @Override
604 public boolean canMagnifyWindow(int windowType) {
605 return false;
606 }
607
608 @Override
609 public boolean isTopLevelWindow(int windowType) {
610 return false;
611 }
612
613 @Override
614 public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) {
615
616 }
617
618 @Override
619 public void getStableInsetsLw(int displayRotation, int displayWidth, int displayHeight,
620 Rect outInsets) {
621
622 }
623
624 @Override
625 public boolean isNavBarForcedShownLw(WindowState win) {
626 return false;
627 }
628
629 @Override
Andrii Kulian3a1619d2017-07-07 14:38:09 -0700630 public int getNavBarPosition() {
631 return NAV_BAR_BOTTOM;
632 }
633
634 @Override
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700635 public void getNonDecorInsetsLw(int displayRotation, int displayWidth, int displayHeight,
636 Rect outInsets) {
637
638 }
639
640 @Override
641 public boolean isDockSideAllowed(int dockSide) {
642 return false;
643 }
644
645 @Override
646 public void onConfigurationChanged() {
647
648 }
649
650 @Override
651 public boolean shouldRotateSeamlessly(int oldRotation, int newRotation) {
652 return false;
653 }
Brian Carlstrom7203d622016-09-21 01:00:36 -0700654
655 @Override
Winson Chungac52f282017-03-30 14:44:52 -0700656 public void setPipVisibilityLw(boolean visible) {
Brian Carlstrom7203d622016-09-21 01:00:36 -0700657
658 }
659
660 @Override
661 public void setRecentsVisibilityLw(boolean visible) {
662
Keun-young Park4136d2d2017-05-08 14:51:59 -0700663 }
664
665 @Override
666 public void onSystemUiStarted() {
667 }
668
669 @Override
670 public boolean canDismissBootAnimation() {
671 return true;
672 }
Wale Ogunwaleb699ce02016-07-18 12:05:30 -0700673}