TestWindowManagerPolicy.java revision e1cfcf4c4d15417bc912d36d487b4454c19b30fa
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 org.mockito.invocation.InvocationOnMock;
33
34import android.annotation.Nullable;
35import android.app.ActivityManagerInternal;
36import android.content.Context;
37import android.content.res.CompatibilityInfo;
38import android.content.res.Configuration;
39import android.graphics.Rect;
40import android.hardware.display.DisplayManagerInternal;
41import android.os.Bundle;
42import android.os.IBinder;
43import android.os.RemoteException;
44import android.view.Display;
45import android.view.IWindowManager;
46import android.view.InputChannel;
47import android.view.KeyEvent;
48import android.view.WindowManager;
49import android.view.WindowManagerPolicy;
50import android.view.animation.Animation;
51import android.os.PowerManagerInternal;
52
53import com.android.internal.policy.IKeyguardDismissCallback;
54import com.android.internal.policy.IShortcutService;
55import com.android.server.input.InputManagerService;
56import com.android.server.LocalServices;
57
58import java.io.PrintWriter;
59
60class 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 false;
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