1 /*
2  * Copyright (C) 2021 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.systemui.accessibility;
18 
19 import android.annotation.NonNull;
20 import android.graphics.Rect;
21 import android.graphics.Region;
22 import android.os.IBinder;
23 import android.view.Display;
24 import android.view.View;
25 import android.view.ViewGroup;
26 import android.view.WindowInsets;
27 import android.view.WindowManager;
28 import android.view.WindowMetrics;
29 
30 public class TestableWindowManager implements WindowManager {
31 
32     private final WindowManager mWindowManager;
33     private View mView;
34     private Rect mWindowBounds = null;
35     private WindowInsets mWindowInsets = null;
36 
TestableWindowManager(WindowManager windowManager)37     TestableWindowManager(WindowManager windowManager) {
38         mWindowManager = windowManager;
39     }
40 
41     @Override
getDefaultDisplay()42     public Display getDefaultDisplay() {
43         return mWindowManager.getDefaultDisplay();
44     }
45 
46     @Override
removeViewImmediate(View view)47     public void removeViewImmediate(View view) {
48         mWindowManager.removeViewImmediate(view);
49     }
50 
51     @Override
requestAppKeyboardShortcuts(WindowManager.KeyboardShortcutsReceiver receiver, int deviceId)52     public void requestAppKeyboardShortcuts(WindowManager.KeyboardShortcutsReceiver receiver,
53             int deviceId) {
54         mWindowManager.requestAppKeyboardShortcuts(receiver, deviceId);
55     }
56 
57     @Override
getCurrentImeTouchRegion()58     public Region getCurrentImeTouchRegion() {
59         return mWindowManager.getCurrentImeTouchRegion();
60     }
61 
62     @Override
addView(View view, ViewGroup.LayoutParams params)63     public void addView(View view, ViewGroup.LayoutParams params) {
64         mView = view;
65         mWindowManager.addView(view, params);
66     }
67 
68     @Override
updateViewLayout(View view, ViewGroup.LayoutParams params)69     public void updateViewLayout(View view, ViewGroup.LayoutParams params) {
70         mWindowManager.updateViewLayout(view, params);
71     }
72 
73     @Override
removeView(View view)74     public void removeView(View view) {
75         mView = null;
76         mWindowManager.removeView(view);
77     }
78 
79     @Override
getCurrentWindowMetrics()80     public WindowMetrics getCurrentWindowMetrics() {
81         final WindowMetrics realMetrics = mWindowManager.getCurrentWindowMetrics();
82         final WindowMetrics windowMetrics = new WindowMetrics(
83                 mWindowBounds == null ? realMetrics.getBounds()
84                         : mWindowBounds,
85                 mWindowInsets == null ?  realMetrics.getWindowInsets() : mWindowInsets);
86         return windowMetrics;
87     }
88 
89     @Override
getMaximumWindowMetrics()90     public WindowMetrics getMaximumWindowMetrics() {
91         return mWindowManager.getMaximumWindowMetrics();
92     }
93 
94     @Override
getDefaultToken()95     public @NonNull IBinder getDefaultToken() {
96         return mWindowManager.getDefaultToken();
97     }
98 
getAttachedView()99     public View getAttachedView() {
100         return mView;
101     }
102 
getLayoutParamsFromAttachedView()103     public WindowManager.LayoutParams getLayoutParamsFromAttachedView() {
104         if (mView == null) {
105             return null;
106         }
107         return (WindowManager.LayoutParams) mView.getLayoutParams();
108     }
109 
110     /**
111      * Sets the given window bounds to current window metrics.
112      *
113      * @param bounds the window bounds
114      */
setWindowBounds(Rect bounds)115     public void setWindowBounds(Rect bounds) {
116         mWindowBounds = bounds;
117     }
118 
119     /**
120      * Sets the given window insets to the current window metrics.
121      *
122      * @param insets the window insets.
123      */
setWindowInsets(WindowInsets insets)124     public void setWindowInsets(WindowInsets insets) {
125         mWindowInsets = insets;
126     }
127 }
128