TestWindowManagerPolicy.java revision 9bafc7150ea41758cf40ba60eb90deb62217fc34
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.FIRST_APPLICATION_WINDOW; 20import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; 21import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; 22import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL; 23import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; 24import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; 25import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY; 26import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; 27import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; 28import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL; 29import static android.view.WindowManager.LayoutParams.TYPE_BOOT_PROGRESS; 30import static android.view.WindowManager.LayoutParams.TYPE_DISPLAY_OVERLAY; 31import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; 32import static android.view.WindowManager.LayoutParams.TYPE_DRAG; 33import static android.view.WindowManager.LayoutParams.TYPE_DREAM; 34import static android.view.WindowManager.LayoutParams.TYPE_INPUT_CONSUMER; 35import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; 36import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; 37import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; 38import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY; 39import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; 40import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; 41import static android.view.WindowManager.LayoutParams.TYPE_PHONE; 42import static android.view.WindowManager.LayoutParams.TYPE_POINTER; 43import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION; 44import static android.view.WindowManager.LayoutParams.TYPE_PRIORITY_PHONE; 45import static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION; 46import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG; 47import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT; 48import static android.view.WindowManager.LayoutParams.TYPE_SEARCH_BAR; 49import static android.view.WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY; 50import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; 51import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL; 52import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL; 53import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; 54import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; 55import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 56import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; 57import static android.view.WindowManager.LayoutParams.TYPE_TOAST; 58import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION; 59import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION_STARTING; 60import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; 61import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; 62import static org.mockito.Mockito.mock; 63 64import android.annotation.Nullable; 65import android.content.Context; 66import android.content.res.CompatibilityInfo; 67import android.content.res.Configuration; 68import android.graphics.Rect; 69import android.hardware.display.DisplayManagerInternal; 70import android.os.Bundle; 71import android.os.IBinder; 72import android.os.RemoteException; 73import android.util.Log; 74import android.view.Display; 75import android.view.IWindowManager; 76import android.view.KeyEvent; 77import android.view.WindowManager; 78import android.view.WindowManagerGlobal; 79import android.view.WindowManagerPolicy; 80import android.view.animation.Animation; 81import android.os.PowerManagerInternal; 82 83import com.android.internal.policy.IKeyguardDismissCallback; 84import com.android.internal.policy.IShortcutService; 85import com.android.server.input.InputManagerService; 86import com.android.server.LocalServices; 87 88import java.io.PrintWriter; 89 90class TestWindowManagerPolicy implements WindowManagerPolicy { 91 private static final String TAG = "TestWindowManagerPolicy"; 92 93 private static WindowManagerService sWm = null; 94 95 int rotationToReport = 0; 96 97 private Runnable mRunnableWhenAddingSplashScreen; 98 99 static synchronized WindowManagerService getWindowManagerService(Context context) { 100 if (sWm == null) { 101 // We only want to do this once for the test process as we don't want WM to try to 102 // register a bunch of local services again. 103 if (LocalServices.getService(DisplayManagerInternal.class) == null) { 104 LocalServices.addService(DisplayManagerInternal.class, 105 mock(DisplayManagerInternal.class)); 106 } 107 if (LocalServices.getService(PowerManagerInternal.class) == null) { 108 LocalServices.addService(PowerManagerInternal.class, 109 mock(PowerManagerInternal.class)); 110 } 111 sWm = WindowManagerService.main(context, mock(InputManagerService.class), true, false, 112 false, new TestWindowManagerPolicy()); 113 } 114 return sWm; 115 } 116 117 @Override 118 public void registerShortcutKey(long shortcutCode, IShortcutService shortcutKeyReceiver) 119 throws RemoteException { 120 121 } 122 123 @Override 124 public void init(Context context, IWindowManager windowManager, 125 WindowManagerFuncs windowManagerFuncs) { 126 127 } 128 129 @Override 130 public boolean isDefaultOrientationForced() { 131 return false; 132 } 133 134 @Override 135 public void setInitialDisplaySize(Display display, int width, int height, int density) { 136 137 } 138 139 @Override 140 public void setDisplayOverscan(Display display, int left, int top, int right, int bottom) { 141 142 } 143 144 @Override 145 public int checkAddPermission(WindowManager.LayoutParams attrs, int[] outAppOp) { 146 return 0; 147 } 148 149 @Override 150 public boolean checkShowToOwnerOnly(WindowManager.LayoutParams attrs) { 151 return false; 152 } 153 154 @Override 155 public void adjustWindowParamsLw(WindowManager.LayoutParams attrs) { 156 157 } 158 159 @Override 160 public void adjustConfigurationLw(Configuration config, int keyboardPresence, 161 int navigationPresence) { 162 163 } 164 165 @Override 166 public int windowTypeToLayerLw(int type) { 167 // TODO: figure-out a good way to keep this in-sync with PhoneWindowManager...sigh! 168 if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) { 169 return 2; 170 } 171 switch (type) { 172 case TYPE_PRESENTATION: 173 case TYPE_PRIVATE_PRESENTATION: 174 return 2; 175 case TYPE_WALLPAPER: 176 // wallpaper is at the bottom, though the window manager may move it. 177 return 2; 178 case TYPE_DOCK_DIVIDER: 179 return 2; 180 case TYPE_QS_DIALOG: 181 return 2; 182 case TYPE_PHONE: 183 return 3; 184 case TYPE_SEARCH_BAR: 185 case TYPE_VOICE_INTERACTION_STARTING: 186 return 4; 187 case TYPE_VOICE_INTERACTION: 188 // voice interaction layer is almost immediately above apps. 189 return 5; 190 case TYPE_INPUT_CONSUMER: 191 return 6; 192 case TYPE_SYSTEM_DIALOG: 193 return 7; 194 case TYPE_TOAST: 195 // toasts and the plugged-in battery thing 196 return 8; 197 case TYPE_PRIORITY_PHONE: 198 // SIM errors and unlock. Not sure if this really should be in a high layer. 199 return 9; 200 case TYPE_DREAM: 201 // used for Dreams (screensavers with TYPE_DREAM windows) 202 return 10; 203 case TYPE_SYSTEM_ALERT: 204 // like the ANR / app crashed dialogs 205 return 11; 206 case TYPE_INPUT_METHOD: 207 // on-screen keyboards and other such input method user interfaces go here. 208 return 12; 209 case TYPE_INPUT_METHOD_DIALOG: 210 // on-screen keyboards and other such input method user interfaces go here. 211 return 13; 212 case TYPE_STATUS_BAR_SUB_PANEL: 213 return 15; 214 case TYPE_STATUS_BAR: 215 return 16; 216 case TYPE_STATUS_BAR_PANEL: 217 return 17; 218 case TYPE_KEYGUARD_DIALOG: 219 return 18; 220 case TYPE_VOLUME_OVERLAY: 221 // the on-screen volume indicator and controller shown when the user 222 // changes the device volume 223 return 19; 224 case TYPE_SYSTEM_OVERLAY: 225 // the on-screen volume indicator and controller shown when the user 226 // changes the device volume 227 return 20; 228 case TYPE_NAVIGATION_BAR: 229 // the navigation bar, if available, shows atop most things 230 return 21; 231 case TYPE_NAVIGATION_BAR_PANEL: 232 // some panels (e.g. search) need to show on top of the navigation bar 233 return 22; 234 case TYPE_SCREENSHOT: 235 // screenshot selection layer shouldn't go above system error, but it should cover 236 // navigation bars at the very least. 237 return 23; 238 case TYPE_SYSTEM_ERROR: 239 // system-level error dialogs 240 return 24; 241 case TYPE_MAGNIFICATION_OVERLAY: 242 // used to highlight the magnified portion of a display 243 return 25; 244 case TYPE_DISPLAY_OVERLAY: 245 // used to simulate secondary display devices 246 return 26; 247 case TYPE_DRAG: 248 // the drag layer: input for drag-and-drop is associated with this window, 249 // which sits above all other focusable windows 250 return 27; 251 case TYPE_ACCESSIBILITY_OVERLAY: 252 // overlay put by accessibility services to intercept user interaction 253 return 28; 254 case TYPE_SECURE_SYSTEM_OVERLAY: 255 return 29; 256 case TYPE_BOOT_PROGRESS: 257 return 30; 258 case TYPE_POINTER: 259 // the (mouse) pointer layer 260 return 31; 261 } 262 Log.e(TAG, "Unknown window type: " + type); 263 return 2; 264 } 265 266 @Override 267 public int subWindowTypeToLayerLw(int type) { 268 // TODO: figure-out a good way to keep this in-sync with PhoneWindowManager... 269 switch (type) { 270 case TYPE_APPLICATION_PANEL: 271 case TYPE_APPLICATION_ATTACHED_DIALOG: 272 return 1; 273 case TYPE_APPLICATION_MEDIA: 274 return -2; 275 case TYPE_APPLICATION_MEDIA_OVERLAY: 276 return -1; 277 case TYPE_APPLICATION_SUB_PANEL: 278 return 2; 279 case TYPE_APPLICATION_ABOVE_SUB_PANEL: 280 return 3; 281 } 282 Log.e(TAG, "Unknown sub-window type: " + type); 283 return 0; 284 } 285 286 @Override 287 public int getMaxWallpaperLayer() { 288 return 0; 289 } 290 291 @Override 292 public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode, 293 int displayId) { 294 return 0; 295 } 296 297 @Override 298 public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode, 299 int displayId) { 300 return 0; 301 } 302 303 @Override 304 public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode, 305 int displayId) { 306 return 0; 307 } 308 309 @Override 310 public int getConfigDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode, 311 int displayId) { 312 return 0; 313 } 314 315 @Override 316 public boolean isKeyguardHostWindow(WindowManager.LayoutParams attrs) { 317 return false; 318 } 319 320 @Override 321 public boolean canBeHiddenByKeyguardLw(WindowState win) { 322 return false; 323 } 324 325 /** 326 * Sets a runnable to run when adding a splash screen which gets executed after the window has 327 * been added but before returning the surface. 328 */ 329 void setRunnableWhenAddingSplashScreen(Runnable r) { 330 mRunnableWhenAddingSplashScreen = r; 331 } 332 333 @Override 334 public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme, 335 CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon, 336 int logo, int windowFlags, Configuration overrideConfig, int displayId) { 337 final com.android.server.wm.WindowState window; 338 final AppWindowToken atoken; 339 synchronized (sWm.mWindowMap) { 340 atoken = WindowTestsBase.sDisplayContent.getAppWindowToken(appToken); 341 window = WindowTestsBase.createWindow(null, TYPE_APPLICATION_STARTING, atoken, 342 "Starting window"); 343 atoken.startingWindow = window; 344 } 345 if (mRunnableWhenAddingSplashScreen != null) { 346 mRunnableWhenAddingSplashScreen.run(); 347 mRunnableWhenAddingSplashScreen = null; 348 } 349 return () -> { 350 synchronized (sWm.mWindowMap) { 351 atoken.removeChild(window); 352 atoken.startingWindow = null; 353 } 354 }; 355 } 356 357 @Override 358 public int prepareAddWindowLw(WindowState win, 359 WindowManager.LayoutParams attrs) { 360 return 0; 361 } 362 363 @Override 364 public void removeWindowLw(WindowState win) { 365 366 } 367 368 @Override 369 public int selectAnimationLw(WindowState win, int transit) { 370 return 0; 371 } 372 373 @Override 374 public void selectRotationAnimationLw(int[] anim) { 375 376 } 377 378 @Override 379 public boolean validateRotationAnimationLw(int exitAnimId, int enterAnimId, 380 boolean forceDefault) { 381 return false; 382 } 383 384 @Override 385 public Animation createHiddenByKeyguardExit(boolean onWallpaper, 386 boolean goingToNotificationShade) { 387 return null; 388 } 389 390 @Override 391 public Animation createKeyguardWallpaperExit(boolean goingToNotificationShade) { 392 return null; 393 } 394 395 @Override 396 public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) { 397 return 0; 398 } 399 400 @Override 401 public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags) { 402 return 0; 403 } 404 405 @Override 406 public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, 407 int policyFlags) { 408 return 0; 409 } 410 411 @Override 412 public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, 413 int policyFlags) { 414 return null; 415 } 416 417 @Override 418 public void beginLayoutLw(boolean isDefaultDisplay, int displayWidth, int displayHeight, 419 int displayRotation, int uiMode) { 420 421 } 422 423 @Override 424 public int getSystemDecorLayerLw() { 425 return 0; 426 } 427 428 @Override 429 public void getContentRectLw(Rect r) { 430 431 } 432 433 @Override 434 public void layoutWindowLw(WindowState win, 435 WindowState attached) { 436 437 } 438 439 @Override 440 public boolean getInsetHintLw(WindowManager.LayoutParams attrs, Rect taskBounds, 441 int displayRotation, int displayWidth, int displayHeight, Rect outContentInsets, 442 Rect outStableInsets, Rect outOutsets) { 443 return false; 444 } 445 446 @Override 447 public void finishLayoutLw() { 448 449 } 450 451 @Override 452 public void beginPostLayoutPolicyLw(int displayWidth, int displayHeight) { 453 454 } 455 456 @Override 457 public void applyPostLayoutPolicyLw(WindowState win, 458 WindowManager.LayoutParams attrs, WindowState attached, WindowState imeTarget) { 459 } 460 461 @Override 462 public int finishPostLayoutPolicyLw() { 463 return 0; 464 } 465 466 @Override 467 public boolean allowAppAnimationsLw() { 468 return false; 469 } 470 471 @Override 472 public int focusChangedLw(WindowState lastFocus, 473 WindowState newFocus) { 474 return 0; 475 } 476 477 @Override 478 public void startedWakingUp() { 479 480 } 481 482 @Override 483 public void finishedWakingUp() { 484 485 } 486 487 @Override 488 public void startedGoingToSleep(int why) { 489 490 } 491 492 @Override 493 public void finishedGoingToSleep(int why) { 494 495 } 496 497 @Override 498 public void screenTurningOn(ScreenOnListener screenOnListener) { 499 500 } 501 502 @Override 503 public void screenTurnedOn() { 504 505 } 506 507 @Override 508 public void screenTurnedOff() { 509 510 } 511 512 @Override 513 public boolean isScreenOn() { 514 return true; 515 } 516 517 @Override 518 public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) { 519 520 } 521 522 @Override 523 public void notifyCameraLensCoverSwitchChanged(long whenNanos, boolean lensCovered) { 524 525 } 526 527 @Override 528 public void enableKeyguard(boolean enabled) { 529 530 } 531 532 @Override 533 public void exitKeyguardSecurely(OnKeyguardExitResult callback) { 534 535 } 536 537 @Override 538 public boolean isKeyguardLocked() { 539 return false; 540 } 541 542 @Override 543 public boolean isKeyguardSecure(int userId) { 544 return false; 545 } 546 547 @Override 548 public boolean isKeyguardOccluded() { 549 return false; 550 } 551 552 @Override 553 public boolean isKeyguardTrustedLw() { 554 return false; 555 } 556 557 @Override 558 public boolean isKeyguardShowingAndNotOccluded() { 559 return false; 560 } 561 562 @Override 563 public boolean inKeyguardRestrictedKeyInputMode() { 564 return false; 565 } 566 567 @Override 568 public void dismissKeyguardLw(@Nullable IKeyguardDismissCallback callback) { 569 } 570 571 @Override 572 public boolean isKeyguardDrawnLw() { 573 return false; 574 } 575 576 @Override 577 public boolean isShowingDreamLw() { 578 return false; 579 } 580 581 @Override 582 public void onKeyguardOccludedChangedLw(boolean occluded) { 583 } 584 585 @Override 586 public int rotationForOrientationLw(int orientation, 587 int lastRotation) { 588 return rotationToReport; 589 } 590 591 @Override 592 public boolean rotationHasCompatibleMetricsLw(int orientation, 593 int rotation) { 594 return false; 595 } 596 597 @Override 598 public void setRotationLw(int rotation) { 599 600 } 601 602 @Override 603 public void setSafeMode(boolean safeMode) { 604 605 } 606 607 @Override 608 public void systemReady() { 609 610 } 611 612 @Override 613 public void systemBooted() { 614 615 } 616 617 @Override 618 public void showBootMessage(CharSequence msg, boolean always) { 619 620 } 621 622 @Override 623 public void hideBootMessages() { 624 625 } 626 627 @Override 628 public void userActivity() { 629 630 } 631 632 @Override 633 public void enableScreenAfterBoot() { 634 635 } 636 637 @Override 638 public void setCurrentOrientationLw(int newOrientation) { 639 640 } 641 642 @Override 643 public boolean performHapticFeedbackLw(WindowState win, int effectId, 644 boolean always) { 645 return false; 646 } 647 648 @Override 649 public void keepScreenOnStartedLw() { 650 651 } 652 653 @Override 654 public void keepScreenOnStoppedLw() { 655 656 } 657 658 @Override 659 public int getUserRotationMode() { 660 return 0; 661 } 662 663 @Override 664 public void setUserRotationMode(int mode, 665 int rotation) { 666 667 } 668 669 @Override 670 public int adjustSystemUiVisibilityLw(int visibility) { 671 return 0; 672 } 673 674 @Override 675 public boolean hasNavigationBar() { 676 return false; 677 } 678 679 @Override 680 public void lockNow(Bundle options) { 681 682 } 683 684 @Override 685 public void setLastInputMethodWindowLw(WindowState ime, 686 WindowState target) { 687 688 } 689 690 @Override 691 public void showRecentApps(boolean fromHome) { 692 693 } 694 695 @Override 696 public void showGlobalActions() { 697 698 } 699 700 @Override 701 public int getInputMethodWindowVisibleHeightLw() { 702 return 0; 703 } 704 705 @Override 706 public void setCurrentUserLw(int newUserId) { 707 708 } 709 710 @Override 711 public void setSwitchingUser(boolean switching) { 712 713 } 714 715 @Override 716 public void dump(String prefix, PrintWriter writer, String[] args) { 717 718 } 719 720 @Override 721 public boolean canMagnifyWindow(int windowType) { 722 return false; 723 } 724 725 @Override 726 public boolean isTopLevelWindow(int windowType) { 727 return false; 728 } 729 730 @Override 731 public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) { 732 733 } 734 735 @Override 736 public void getStableInsetsLw(int displayRotation, int displayWidth, int displayHeight, 737 Rect outInsets) { 738 739 } 740 741 @Override 742 public boolean isNavBarForcedShownLw(WindowState win) { 743 return false; 744 } 745 746 @Override 747 public void getNonDecorInsetsLw(int displayRotation, int displayWidth, int displayHeight, 748 Rect outInsets) { 749 750 } 751 752 @Override 753 public boolean isDockSideAllowed(int dockSide) { 754 return false; 755 } 756 757 @Override 758 public void onConfigurationChanged() { 759 760 } 761 762 @Override 763 public boolean shouldRotateSeamlessly(int oldRotation, int newRotation) { 764 return false; 765 } 766 767 @Override 768 public void setTvPipVisibilityLw(boolean visible) { 769 770 } 771 772 @Override 773 public void setRecentsVisibilityLw(boolean visible) { 774 775 } 776} 777