Home | History | Annotate | Download | only in wm
      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