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