1 /* 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 17 package com.android.server.wm; 18 19 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; 20 import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; 21 22 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 23 24 import static org.mockito.ArgumentMatchers.anyString; 25 import static org.mockito.Matchers.anyInt; 26 import static org.mockito.Mockito.doReturn; 27 import static org.mockito.Mockito.mock; 28 import static org.mockito.Mockito.any; 29 import static org.mockito.Mockito.doAnswer; 30 31 import android.os.PowerSaveState; 32 import org.mockito.invocation.InvocationOnMock; 33 34 import android.annotation.Nullable; 35 import android.app.ActivityManagerInternal; 36 import android.content.Context; 37 import android.content.res.CompatibilityInfo; 38 import android.content.res.Configuration; 39 import android.graphics.Rect; 40 import android.hardware.display.DisplayManagerInternal; 41 import android.os.Bundle; 42 import android.os.IBinder; 43 import android.os.RemoteException; 44 import android.view.Display; 45 import android.view.IWindowManager; 46 import android.view.InputChannel; 47 import android.view.KeyEvent; 48 import android.view.WindowManager; 49 import android.view.WindowManagerPolicy; 50 import android.view.animation.Animation; 51 import android.os.PowerManagerInternal; 52 53 import com.android.internal.policy.IKeyguardDismissCallback; 54 import com.android.internal.policy.IShortcutService; 55 import com.android.server.input.InputManagerService; 56 import com.android.server.LocalServices; 57 58 import java.io.PrintWriter; 59 60 class TestWindowManagerPolicy implements WindowManagerPolicy { 61 private static final String TAG = "TestWindowManagerPolicy"; 62 63 private static WindowManagerService sWm = null; 64 65 int rotationToReport = 0; 66 67 private Runnable mRunnableWhenAddingSplashScreen; 68 69 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. 73 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)); 80 final PowerManagerInternal pm = 81 LocalServices.getService(PowerManagerInternal.class); 82 PowerSaveState state = new PowerSaveState.Builder().build(); 83 doReturn(state).when(pm).getLowPowerState(anyInt()); 84 } 85 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) -> { 91 final Runnable runnable = invocationOnMock.<Runnable>getArgument(0); 92 if (runnable != null) { 93 runnable.run(); 94 } 95 return null; 96 }).when(am).notifyKeyguardFlagsChanged(any()); 97 } 98 99 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, 107 false, new TestWindowManagerPolicy()); 108 } 109 return sWm; 110 } 111 112 @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 161 public int getMaxWallpaperLayer() { 162 return 0; 163 } 164 165 @Override 166 public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode, 167 int displayId) { 168 return 0; 169 } 170 171 @Override 172 public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode, 173 int displayId) { 174 return 0; 175 } 176 177 @Override 178 public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode, 179 int displayId) { 180 return 0; 181 } 182 183 @Override 184 public int getConfigDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode, 185 int displayId) { 186 return 0; 187 } 188 189 @Override 190 public boolean isKeyguardHostWindow(WindowManager.LayoutParams attrs) { 191 return attrs.type == TYPE_STATUS_BAR; 192 } 193 194 @Override 195 public boolean canBeHiddenByKeyguardLw(WindowState win) { 196 return false; 197 } 198 199 /** 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 207 @Override 208 public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme, 209 CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon, 210 int logo, int windowFlags, Configuration overrideConfig, int displayId) { 211 final com.android.server.wm.WindowState window; 212 final AppWindowToken atoken; 213 synchronized (sWm.mWindowMap) { 214 atoken = sWm.mRoot.getAppWindowToken(appToken); 215 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 }; 229 } 230 231 @Override 232 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 259 public Animation createHiddenByKeyguardExit(boolean onWallpaper, 260 boolean goingToNotificationShade) { 261 return null; 262 } 263 264 @Override 265 public Animation createKeyguardWallpaperExit(boolean goingToNotificationShade) { 266 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, 332 WindowManager.LayoutParams attrs, WindowState attached, WindowState imeTarget) { 333 } 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 382 public void screenTurningOff(ScreenOffListener screenOffListener) { 383 384 } 385 386 @Override 387 public void screenTurnedOff() { 388 389 } 390 391 @Override 392 public boolean isScreenOn() { 393 return true; 394 } 395 396 @Override 397 public boolean okToAnimate() { 398 return true; 399 } 400 401 @Override 402 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 432 public boolean isKeyguardOccluded() { 433 return false; 434 } 435 436 @Override 437 public boolean isKeyguardTrustedLw() { 438 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 452 public void dismissKeyguardLw(@Nullable IKeyguardDismissCallback callback) { 453 } 454 455 @Override 456 public boolean isKeyguardDrawnLw() { 457 return false; 458 } 459 460 @Override 461 public boolean isShowingDreamLw() { 462 return false; 463 } 464 465 @Override 466 public void onKeyguardOccludedChangedLw(boolean occluded) { 467 } 468 469 @Override 470 public int rotationForOrientationLw(int orientation, 471 int lastRotation) { 472 return rotationToReport; 473 } 474 475 @Override 476 public boolean rotationHasCompatibleMetricsLw(int orientation, int rotation) { 477 return true; 478 } 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 594 public void setSwitchingUser(boolean switching) { 595 596 } 597 598 @Override 599 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 630 public int getNavBarPosition() { 631 return NAV_BAR_BOTTOM; 632 } 633 634 @Override 635 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 } 654 655 @Override 656 public void setPipVisibilityLw(boolean visible) { 657 658 } 659 660 @Override 661 public void setRecentsVisibilityLw(boolean visible) { 662 663 } 664 665 @Override 666 public void onSystemUiStarted() { 667 } 668 669 @Override 670 public boolean canDismissBootAnimation() { 671 return true; 672 } 673 } 674