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