1 /*
2  * Copyright (C) 2011 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 #ifndef _UI_INPUT_WINDOW_H
18 #define _UI_INPUT_WINDOW_H
19 
20 #include <input/Input.h>
21 #include <input/InputTransport.h>
22 #include <ui/Rect.h>
23 #include <ui/Region.h>
24 #include <utils/RefBase.h>
25 #include <utils/Timers.h>
26 
27 #include "InputApplication.h"
28 
29 namespace android {
30 class Parcel;
31 
32 /*
33  * Describes the properties of a window that can receive input.
34  */
35 struct InputWindowInfo {
36     InputWindowInfo() = default;
37     InputWindowInfo(const Parcel& from);
38 
39     // Window flags from WindowManager.LayoutParams
40     enum {
41         FLAG_ALLOW_LOCK_WHILE_SCREEN_ON     = 0x00000001,
42         FLAG_DIM_BEHIND        = 0x00000002,
43         FLAG_BLUR_BEHIND        = 0x00000004,
44         FLAG_NOT_FOCUSABLE      = 0x00000008,
45         FLAG_NOT_TOUCHABLE      = 0x00000010,
46         FLAG_NOT_TOUCH_MODAL    = 0x00000020,
47         FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040,
48         FLAG_KEEP_SCREEN_ON     = 0x00000080,
49         FLAG_LAYOUT_IN_SCREEN   = 0x00000100,
50         FLAG_LAYOUT_NO_LIMITS   = 0x00000200,
51         FLAG_FULLSCREEN      = 0x00000400,
52         FLAG_FORCE_NOT_FULLSCREEN   = 0x00000800,
53         FLAG_DITHER             = 0x00001000,
54         FLAG_SECURE             = 0x00002000,
55         FLAG_SCALED             = 0x00004000,
56         FLAG_IGNORE_CHEEK_PRESSES    = 0x00008000,
57         FLAG_LAYOUT_INSET_DECOR = 0x00010000,
58         FLAG_ALT_FOCUSABLE_IM = 0x00020000,
59         FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000,
60         FLAG_SHOW_WHEN_LOCKED = 0x00080000,
61         FLAG_SHOW_WALLPAPER = 0x00100000,
62         FLAG_TURN_SCREEN_ON = 0x00200000,
63         FLAG_DISMISS_KEYGUARD = 0x00400000,
64         FLAG_SPLIT_TOUCH = 0x00800000,
65         FLAG_SLIPPERY = 0x20000000,
66     };
67 
68     // Window types from WindowManager.LayoutParams
69     enum {
70         FIRST_APPLICATION_WINDOW = 1,
71         TYPE_BASE_APPLICATION = 1,
72         TYPE_APPLICATION = 2,
73         TYPE_APPLICATION_STARTING = 3,
74         LAST_APPLICATION_WINDOW = 99,
75         FIRST_SUB_WINDOW = 1000,
76         TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW,
77         TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW + 1,
78         TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW + 2,
79         TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW + 3,
80         TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW + 4,
81         LAST_SUB_WINDOW = 1999,
82         FIRST_SYSTEM_WINDOW = 2000,
83         TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW,
84         TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW + 1,
85         TYPE_PHONE = FIRST_SYSTEM_WINDOW + 2,
86         TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW + 3,
87         TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW + 4,
88         TYPE_TOAST = FIRST_SYSTEM_WINDOW + 5,
89         TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW + 6,
90         TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW + 7,
91         TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW + 8,
92         TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW + 9,
93         TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW + 10,
94         TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW + 11,
95         TYPE_INPUT_METHOD_DIALOG = FIRST_SYSTEM_WINDOW + 12,
96         TYPE_WALLPAPER = FIRST_SYSTEM_WINDOW + 13,
97         TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW + 14,
98         TYPE_SECURE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW + 15,
99         TYPE_DRAG = FIRST_SYSTEM_WINDOW + 16,
100         TYPE_STATUS_BAR_SUB_PANEL = FIRST_SYSTEM_WINDOW + 17,
101         TYPE_POINTER = FIRST_SYSTEM_WINDOW + 18,
102         TYPE_NAVIGATION_BAR = FIRST_SYSTEM_WINDOW + 19,
103         TYPE_VOLUME_OVERLAY = FIRST_SYSTEM_WINDOW + 20,
104         TYPE_BOOT_PROGRESS = FIRST_SYSTEM_WINDOW + 21,
105         TYPE_INPUT_CONSUMER = FIRST_SYSTEM_WINDOW + 22,
106         TYPE_NAVIGATION_BAR_PANEL = FIRST_SYSTEM_WINDOW + 24,
107         TYPE_MAGNIFICATION_OVERLAY = FIRST_SYSTEM_WINDOW + 27,
108         TYPE_ACCESSIBILITY_OVERLAY = FIRST_SYSTEM_WINDOW + 32,
109         TYPE_DOCK_DIVIDER = FIRST_SYSTEM_WINDOW + 34,
110         TYPE_NOTIFICATION_SHADE = FIRST_SYSTEM_WINDOW + 40,
111         TYPE_TRUSTED_APPLICATION_OVERLAY = FIRST_SYSTEM_WINDOW + 42,
112         LAST_SYSTEM_WINDOW = 2999,
113     };
114 
115     enum {
116         INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES = 0x00000001,
117         INPUT_FEATURE_NO_INPUT_CHANNEL = 0x00000002,
118         INPUT_FEATURE_DISABLE_USER_ACTIVITY = 0x00000004,
119     };
120 
121     /* These values are filled in by the WM and passed through SurfaceFlinger
122      * unless specified otherwise.
123      */
124     // This value should NOT be used to uniquely identify the window. There may be different
125     // input windows that have the same token.
126     sp<IBinder> token;
127     // This uniquely identifies the input window.
128     int32_t id = -1;
129     std::string name;
130     int32_t layoutParamsFlags = 0;
131     int32_t layoutParamsType = 0;
132     nsecs_t dispatchingTimeout = -1;
133 
134     /* These values are filled in by SurfaceFlinger. */
135     int32_t frameLeft = -1;
136     int32_t frameTop = -1;
137     int32_t frameRight = -1;
138     int32_t frameBottom = -1;
139 
140     /*
141      * SurfaceFlinger consumes this value to shrink the computed frame. This is
142      * different from shrinking the touchable region in that it DOES shift the coordinate
143      * space where-as the touchable region does not and is more like "cropping". This
144      * is used for window shadows.
145      */
146     int32_t surfaceInset = 0;
147 
148     // A global scaling factor for all windows. Unlike windowScaleX/Y this results
149     // in scaling of the TOUCH_MAJOR/TOUCH_MINOR axis.
150     float globalScaleFactor = 1.0f;
151 
152     // Scaling factors applied to individual windows.
153     float windowXScale = 1.0f;
154     float windowYScale = 1.0f;
155 
156     /*
157      * This is filled in by the WM relative to the frame and then translated
158      * to absolute coordinates by SurfaceFlinger once the frame is computed.
159      */
160     Region touchableRegion;
161     bool visible = false;
162     bool canReceiveKeys = false;
163     bool hasFocus = false;
164     bool hasWallpaper = false;
165     bool paused = false;
166     int32_t ownerPid = -1;
167     int32_t ownerUid = -1;
168     int32_t inputFeatures = 0;
169     int32_t displayId = ADISPLAY_ID_NONE;
170     int32_t portalToDisplayId = ADISPLAY_ID_NONE;
171     InputApplicationInfo applicationInfo;
172     bool replaceTouchableRegionWithCrop = false;
173     wp<IBinder> touchableRegionCropHandle;
174 
175     void addTouchableRegion(const Rect& region);
176 
177     bool touchableRegionContainsPoint(int32_t x, int32_t y) const;
178     bool frameContainsPoint(int32_t x, int32_t y) const;
179 
180     /* Returns true if the window is of a trusted type that is allowed to silently
181      * overlay other windows for the purpose of implementing the secure views feature.
182      * Trusted overlays, such as IME windows, can partly obscure other windows without causing
183      * motion events to be delivered to them with AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED.
184      */
185     bool isTrustedOverlay() const;
186 
187     bool supportsSplitTouch() const;
188 
189     bool overlaps(const InputWindowInfo* other) const;
190 
191     status_t write(Parcel& output) const;
192     static InputWindowInfo read(const Parcel& from);
193 };
194 
195 
196 /*
197  * Handle for a window that can receive input.
198  *
199  * Used by the native input dispatcher to indirectly refer to the window manager objects
200  * that describe a window.
201  */
202 class InputWindowHandle : public RefBase {
203 public:
204 
getInfo()205     inline const InputWindowInfo* getInfo() const {
206         return &mInfo;
207     }
208 
209     sp<IBinder> getToken() const;
210 
getId()211     int32_t getId() const { return mInfo.id; }
212 
getApplicationToken()213     sp<IBinder> getApplicationToken() {
214         return mInfo.applicationInfo.token;
215     }
216 
getName()217     inline std::string getName() const {
218         return !mInfo.name.empty() ? mInfo.name : "<invalid>";
219     }
220 
getDispatchingTimeout(nsecs_t defaultValue)221     inline nsecs_t getDispatchingTimeout(nsecs_t defaultValue) const {
222         return mInfo.token ? mInfo.dispatchingTimeout : defaultValue;
223     }
224 
getDispatchingTimeout(std::chrono::nanoseconds defaultValue)225     inline std::chrono::nanoseconds getDispatchingTimeout(
226             std::chrono::nanoseconds defaultValue) const {
227         return mInfo.token ? std::chrono::nanoseconds(mInfo.dispatchingTimeout) : defaultValue;
228     }
229 
230     /**
231      * Requests that the state of this object be updated to reflect
232      * the most current available information about the application.
233      *
234      * This method should only be called from within the input dispatcher's
235      * critical section.
236      *
237      * Returns true on success, or false if the handle is no longer valid.
238      */
239     virtual bool updateInfo() = 0;
240 
241     /**
242      * Updates from another input window handle.
243      */
244     void updateFrom(const sp<InputWindowHandle> handle);
245 
246     /**
247      * Releases the channel used by the associated information when it is
248      * no longer needed.
249      */
250     void releaseChannel();
251 
252 protected:
253     explicit InputWindowHandle();
254     virtual ~InputWindowHandle();
255 
256     InputWindowInfo mInfo;
257 };
258 
259 } // namespace android
260 
261 #endif // _UI_INPUT_WINDOW_H
262