TestWindowManagerPolicy.java revision af03df6a7a93c832e0bc77b88607ef9161f0791b
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 17package com.android.server.wm; 18 19import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; 20import static android.view.WindowManagerPolicy.NAV_BAR_BOTTOM; 21 22import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 23 24import static org.mockito.ArgumentMatchers.anyString; 25import static org.mockito.Matchers.anyInt; 26import static org.mockito.Mockito.doReturn; 27import static org.mockito.Mockito.mock; 28import static org.mockito.Mockito.any; 29import static org.mockito.Mockito.doAnswer; 30 31import android.os.PowerSaveState; 32import android.util.proto.ProtoOutputStream; 33import org.mockito.invocation.InvocationOnMock; 34 35import android.annotation.Nullable; 36import android.app.ActivityManagerInternal; 37import android.content.Context; 38import android.content.res.CompatibilityInfo; 39import android.content.res.Configuration; 40import android.graphics.Rect; 41import android.hardware.display.DisplayManagerInternal; 42import android.os.Bundle; 43import android.os.IBinder; 44import android.os.RemoteException; 45import android.view.Display; 46import android.view.IWindowManager; 47import android.view.InputChannel; 48import android.view.KeyEvent; 49import android.view.WindowManager; 50import android.view.WindowManagerPolicy; 51import android.view.animation.Animation; 52import android.os.PowerManagerInternal; 53 54import com.android.internal.policy.IKeyguardDismissCallback; 55import com.android.internal.policy.IShortcutService; 56import com.android.server.input.InputManagerService; 57import com.android.server.LocalServices; 58 59import java.io.PrintWriter; 60 61class TestWindowManagerPolicy implements WindowManagerPolicy { 62 private static final String TAG = "TestWindowManagerPolicy"; 63 64 private static WindowManagerService sWm = null; 65 66 int rotationToReport = 0; 67 68 private Runnable mRunnableWhenAddingSplashScreen; 69 70 static synchronized WindowManagerService getWindowManagerService(Context context) { 71 if (sWm == null) { 72 // We only want to do this once for the test process as we don't want WM to try to 73 // register a bunch of local services again. 74 if (LocalServices.getService(DisplayManagerInternal.class) == null) { 75 LocalServices.addService(DisplayManagerInternal.class, 76 mock(DisplayManagerInternal.class)); 77 } 78 if (LocalServices.getService(PowerManagerInternal.class) == null) { 79 LocalServices.addService(PowerManagerInternal.class, 80 mock(PowerManagerInternal.class)); 81 final PowerManagerInternal pm = 82 LocalServices.getService(PowerManagerInternal.class); 83 PowerSaveState state = new PowerSaveState.Builder().build(); 84 doReturn(state).when(pm).getLowPowerState(anyInt()); 85 } 86 if (LocalServices.getService(ActivityManagerInternal.class) == null) { 87 LocalServices.addService(ActivityManagerInternal.class, 88 mock(ActivityManagerInternal.class)); 89 final ActivityManagerInternal am = 90 LocalServices.getService(ActivityManagerInternal.class); 91 doAnswer((InvocationOnMock invocationOnMock) -> { 92 final Runnable runnable = invocationOnMock.<Runnable>getArgument(0); 93 if (runnable != null) { 94 runnable.run(); 95 } 96 return null; 97 }).when(am).notifyKeyguardFlagsChanged(any()); 98 } 99 100 InputManagerService ims = mock(InputManagerService.class); 101 // InputChannel is final and can't be mocked. 102 InputChannel[] input = InputChannel.openInputChannelPair(TAG_WM); 103 if (input != null && input.length > 1) { 104 doReturn(input[1]).when(ims).monitorInput(anyString()); 105 } 106 107 sWm = WindowManagerService.main(context, ims, true, false, 108 false, new TestWindowManagerPolicy()); 109 } 110 return sWm; 111 } 112 113 @Override 114 public void registerShortcutKey(long shortcutCode, IShortcutService shortcutKeyReceiver) 115 throws RemoteException { 116 117 } 118 119 @Override 120 public void init(Context context, IWindowManager windowManager, 121 WindowManagerFuncs windowManagerFuncs) { 122 123 } 124 125 @Override 126 public boolean isDefaultOrientationForced() { 127 return false; 128 } 129 130 @Override 131 public void setInitialDisplaySize(Display display, int width, int height, int density) { 132 133 } 134 135 @Override 136 public void setDisplayOverscan(Display display, int left, int top, int right, int bottom) { 137 138 } 139 140 @Override 141 public int checkAddPermission(WindowManager.LayoutParams attrs, int[] outAppOp) { 142 return 0; 143 } 144 145 @Override 146 public boolean checkShowToOwnerOnly(WindowManager.LayoutParams attrs) { 147 return false; 148 } 149 150 @Override 151 public void adjustWindowParamsLw(WindowManager.LayoutParams attrs) { 152 153 } 154 155 @Override 156 public void adjustConfigurationLw(Configuration config, int keyboardPresence, 157 int navigationPresence) { 158 159 } 160 161 @Override 162 public int getMaxWallpaperLayer() { 163 return 0; 164 } 165 166 @Override 167 public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode, 168 int displayId) { 169 return 0; 170 } 171 172 @Override 173 public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode, 174 int displayId) { 175 return 0; 176 } 177 178 @Override 179 public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode, 180 int displayId) { 181 return 0; 182 } 183 184 @Override 185 public int getConfigDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode, 186 int displayId) { 187 return 0; 188 } 189 190 @Override 191 public boolean isKeyguardHostWindow(WindowManager.LayoutParams attrs) { 192 return false; 193 } 194 195 @Override 196 public boolean canBeHiddenByKeyguardLw(WindowState win) { 197 return false; 198 } 199 200 /** 201 * Sets a runnable to run when adding a splash screen which gets executed after the window has 202 * been added but before returning the surface. 203 */ 204 void setRunnableWhenAddingSplashScreen(Runnable r) { 205 mRunnableWhenAddingSplashScreen = r; 206 } 207 208 @Override 209 public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme, 210 CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon, 211 int logo, int windowFlags, Configuration overrideConfig, int displayId) { 212 final com.android.server.wm.WindowState window; 213 final AppWindowToken atoken; 214 synchronized (sWm.mWindowMap) { 215 atoken = sWm.mRoot.getAppWindowToken(appToken); 216 window = WindowTestsBase.createWindow(null, TYPE_APPLICATION_STARTING, atoken, 217 "Starting window"); 218 atoken.startingWindow = window; 219 } 220 if (mRunnableWhenAddingSplashScreen != null) { 221 mRunnableWhenAddingSplashScreen.run(); 222 mRunnableWhenAddingSplashScreen = null; 223 } 224 return () -> { 225 synchronized (sWm.mWindowMap) { 226 atoken.removeChild(window); 227 atoken.startingWindow = null; 228 } 229 }; 230 } 231 232 @Override 233 public int prepareAddWindowLw(WindowState win, 234 WindowManager.LayoutParams attrs) { 235 return 0; 236 } 237 238 @Override 239 public void removeWindowLw(WindowState win) { 240 241 } 242 243 @Override 244 public int selectAnimationLw(WindowState win, int transit) { 245 return 0; 246 } 247 248 @Override 249 public void selectRotationAnimationLw(int[] anim) { 250 251 } 252 253 @Override 254 public boolean validateRotationAnimationLw(int exitAnimId, int enterAnimId, 255 boolean forceDefault) { 256 return false; 257 } 258 259 @Override 260 public Animation createHiddenByKeyguardExit(boolean onWallpaper, 261 boolean goingToNotificationShade) { 262 return null; 263 } 264 265 @Override 266 public Animation createKeyguardWallpaperExit(boolean goingToNotificationShade) { 267 return null; 268 } 269 270 @Override 271 public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) { 272 return 0; 273 } 274 275 @Override 276 public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags) { 277 return 0; 278 } 279 280 @Override 281 public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, 282 int policyFlags) { 283 return 0; 284 } 285 286 @Override 287 public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, 288 int policyFlags) { 289 return null; 290 } 291 292 @Override 293 public void beginLayoutLw(boolean isDefaultDisplay, int displayWidth, int displayHeight, 294 int displayRotation, int uiMode) { 295 296 } 297 298 @Override 299 public int getSystemDecorLayerLw() { 300 return 0; 301 } 302 303 @Override 304 public void getContentRectLw(Rect r) { 305 306 } 307 308 @Override 309 public void layoutWindowLw(WindowState win, 310 WindowState attached) { 311 312 } 313 314 @Override 315 public boolean getInsetHintLw(WindowManager.LayoutParams attrs, Rect taskBounds, 316 int displayRotation, int displayWidth, int displayHeight, Rect outContentInsets, 317 Rect outStableInsets, Rect outOutsets) { 318 return false; 319 } 320 321 @Override 322 public void finishLayoutLw() { 323 324 } 325 326 @Override 327 public void beginPostLayoutPolicyLw(int displayWidth, int displayHeight) { 328 329 } 330 331 @Override 332 public void applyPostLayoutPolicyLw(WindowState win, 333 WindowManager.LayoutParams attrs, WindowState attached, WindowState imeTarget) { 334 } 335 336 @Override 337 public int finishPostLayoutPolicyLw() { 338 return 0; 339 } 340 341 @Override 342 public boolean allowAppAnimationsLw() { 343 return false; 344 } 345 346 @Override 347 public int focusChangedLw(WindowState lastFocus, 348 WindowState newFocus) { 349 return 0; 350 } 351 352 @Override 353 public void startedWakingUp() { 354 355 } 356 357 @Override 358 public void finishedWakingUp() { 359 360 } 361 362 @Override 363 public void startedGoingToSleep(int why) { 364 365 } 366 367 @Override 368 public void finishedGoingToSleep(int why) { 369 370 } 371 372 @Override 373 public void screenTurningOn(ScreenOnListener screenOnListener) { 374 375 } 376 377 @Override 378 public void screenTurnedOn() { 379 380 } 381 382 @Override 383 public void screenTurningOff(ScreenOffListener screenOffListener) { 384 385 } 386 387 @Override 388 public void screenTurnedOff() { 389 390 } 391 392 @Override 393 public boolean isScreenOn() { 394 return true; 395 } 396 397 @Override 398 public boolean okToAnimate() { 399 return true; 400 } 401 402 @Override 403 public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) { 404 405 } 406 407 @Override 408 public void notifyCameraLensCoverSwitchChanged(long whenNanos, boolean lensCovered) { 409 410 } 411 412 @Override 413 public void enableKeyguard(boolean enabled) { 414 415 } 416 417 @Override 418 public void exitKeyguardSecurely(OnKeyguardExitResult callback) { 419 420 } 421 422 @Override 423 public boolean isKeyguardLocked() { 424 return false; 425 } 426 427 @Override 428 public boolean isKeyguardSecure(int userId) { 429 return false; 430 } 431 432 @Override 433 public boolean isKeyguardOccluded() { 434 return false; 435 } 436 437 @Override 438 public boolean isKeyguardTrustedLw() { 439 return false; 440 } 441 442 @Override 443 public boolean isKeyguardShowingAndNotOccluded() { 444 return false; 445 } 446 447 @Override 448 public boolean inKeyguardRestrictedKeyInputMode() { 449 return false; 450 } 451 452 @Override 453 public void dismissKeyguardLw(@Nullable IKeyguardDismissCallback callback) { 454 } 455 456 @Override 457 public boolean isKeyguardDrawnLw() { 458 return false; 459 } 460 461 @Override 462 public boolean isShowingDreamLw() { 463 return false; 464 } 465 466 @Override 467 public void onKeyguardOccludedChangedLw(boolean occluded) { 468 } 469 470 @Override 471 public int rotationForOrientationLw(int orientation, 472 int lastRotation) { 473 return rotationToReport; 474 } 475 476 @Override 477 public boolean rotationHasCompatibleMetricsLw(int orientation, int rotation) { 478 return true; 479 } 480 481 @Override 482 public void setRotationLw(int rotation) { 483 484 } 485 486 @Override 487 public void setSafeMode(boolean safeMode) { 488 489 } 490 491 @Override 492 public void systemReady() { 493 494 } 495 496 @Override 497 public void systemBooted() { 498 499 } 500 501 @Override 502 public void showBootMessage(CharSequence msg, boolean always) { 503 504 } 505 506 @Override 507 public void hideBootMessages() { 508 509 } 510 511 @Override 512 public void userActivity() { 513 514 } 515 516 @Override 517 public void enableScreenAfterBoot() { 518 519 } 520 521 @Override 522 public void setCurrentOrientationLw(int newOrientation) { 523 524 } 525 526 @Override 527 public boolean performHapticFeedbackLw(WindowState win, int effectId, 528 boolean always) { 529 return false; 530 } 531 532 @Override 533 public void keepScreenOnStartedLw() { 534 535 } 536 537 @Override 538 public void keepScreenOnStoppedLw() { 539 540 } 541 542 @Override 543 public int getUserRotationMode() { 544 return 0; 545 } 546 547 @Override 548 public void setUserRotationMode(int mode, 549 int rotation) { 550 551 } 552 553 @Override 554 public int adjustSystemUiVisibilityLw(int visibility) { 555 return 0; 556 } 557 558 @Override 559 public boolean hasNavigationBar() { 560 return false; 561 } 562 563 @Override 564 public void lockNow(Bundle options) { 565 566 } 567 568 @Override 569 public void setLastInputMethodWindowLw(WindowState ime, 570 WindowState target) { 571 572 } 573 574 @Override 575 public void showRecentApps(boolean fromHome) { 576 577 } 578 579 @Override 580 public void showGlobalActions() { 581 582 } 583 584 @Override 585 public int getInputMethodWindowVisibleHeightLw() { 586 return 0; 587 } 588 589 @Override 590 public void setCurrentUserLw(int newUserId) { 591 592 } 593 594 @Override 595 public void setSwitchingUser(boolean switching) { 596 597 } 598 599 @Override 600 public void writeToProto(ProtoOutputStream proto, long fieldId) { 601 602 } 603 604 @Override 605 public void dump(String prefix, PrintWriter writer, String[] args) { 606 607 } 608 609 @Override 610 public boolean canMagnifyWindow(int windowType) { 611 return false; 612 } 613 614 @Override 615 public boolean isTopLevelWindow(int windowType) { 616 return false; 617 } 618 619 @Override 620 public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) { 621 622 } 623 624 @Override 625 public void getStableInsetsLw(int displayRotation, int displayWidth, int displayHeight, 626 Rect outInsets) { 627 628 } 629 630 @Override 631 public boolean isNavBarForcedShownLw(WindowState win) { 632 return false; 633 } 634 635 @Override 636 public int getNavBarPosition() { 637 return NAV_BAR_BOTTOM; 638 } 639 640 @Override 641 public void getNonDecorInsetsLw(int displayRotation, int displayWidth, int displayHeight, 642 Rect outInsets) { 643 644 } 645 646 @Override 647 public boolean isDockSideAllowed(int dockSide) { 648 return false; 649 } 650 651 @Override 652 public void onConfigurationChanged() { 653 654 } 655 656 @Override 657 public boolean shouldRotateSeamlessly(int oldRotation, int newRotation) { 658 return false; 659 } 660 661 @Override 662 public void setPipVisibilityLw(boolean visible) { 663 664 } 665 666 @Override 667 public void setRecentsVisibilityLw(boolean visible) { 668 669 } 670 671 @Override 672 public void onSystemUiStarted() { 673 } 674 675 @Override 676 public boolean canDismissBootAnimation() { 677 return true; 678 } 679} 680