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 #define LOG_TAG "InputWindow"
18 #define LOG_NDEBUG 0
19 
20 #include <binder/Parcel.h>
21 #include <input/InputWindow.h>
22 #include <input/InputTransport.h>
23 
24 #include <log/log.h>
25 
26 #include <ui/Rect.h>
27 #include <ui/Region.h>
28 
29 namespace android {
30 
31 // --- InputWindowInfo ---
addTouchableRegion(const Rect & region)32 void InputWindowInfo::addTouchableRegion(const Rect& region) {
33     touchableRegion.orSelf(region);
34 }
35 
touchableRegionContainsPoint(int32_t x,int32_t y) const36 bool InputWindowInfo::touchableRegionContainsPoint(int32_t x, int32_t y) const {
37     return touchableRegion.contains(x,y);
38 }
39 
frameContainsPoint(int32_t x,int32_t y) const40 bool InputWindowInfo::frameContainsPoint(int32_t x, int32_t y) const {
41     return x >= frameLeft && x < frameRight
42             && y >= frameTop && y < frameBottom;
43 }
44 
isTrustedOverlay() const45 bool InputWindowInfo::isTrustedOverlay() const {
46     return layoutParamsType == TYPE_INPUT_METHOD
47             || layoutParamsType == TYPE_INPUT_METHOD_DIALOG
48             || layoutParamsType == TYPE_MAGNIFICATION_OVERLAY
49             || layoutParamsType == TYPE_STATUS_BAR
50             || layoutParamsType == TYPE_NAVIGATION_BAR
51             || layoutParamsType == TYPE_NAVIGATION_BAR_PANEL
52             || layoutParamsType == TYPE_SECURE_SYSTEM_OVERLAY
53             || layoutParamsType == TYPE_DOCK_DIVIDER
54             || layoutParamsType == TYPE_ACCESSIBILITY_OVERLAY
55             || layoutParamsType == TYPE_INPUT_CONSUMER;
56 }
57 
supportsSplitTouch() const58 bool InputWindowInfo::supportsSplitTouch() const {
59     return layoutParamsFlags & FLAG_SPLIT_TOUCH;
60 }
61 
overlaps(const InputWindowInfo * other) const62 bool InputWindowInfo::overlaps(const InputWindowInfo* other) const {
63     return frameLeft < other->frameRight && frameRight > other->frameLeft
64             && frameTop < other->frameBottom && frameBottom > other->frameTop;
65 }
66 
write(Parcel & output) const67 status_t InputWindowInfo::write(Parcel& output) const {
68     if (token == nullptr) {
69         output.writeInt32(0);
70         return OK;
71     }
72     output.writeInt32(1);
73     status_t s = output.writeStrongBinder(token);
74     if (s != OK) return s;
75 
76     output.writeString8(String8(name.c_str()));
77     output.writeInt32(layoutParamsFlags);
78     output.writeInt32(layoutParamsType);
79     output.writeInt64(dispatchingTimeout);
80     output.writeInt32(frameLeft);
81     output.writeInt32(frameTop);
82     output.writeInt32(frameRight);
83     output.writeInt32(frameBottom);
84     output.writeInt32(surfaceInset);
85     output.writeFloat(globalScaleFactor);
86     output.writeFloat(windowXScale);
87     output.writeFloat(windowYScale);
88     output.writeBool(visible);
89     output.writeBool(canReceiveKeys);
90     output.writeBool(hasFocus);
91     output.writeBool(hasWallpaper);
92     output.writeBool(paused);
93     output.writeInt32(layer);
94     output.writeInt32(ownerPid);
95     output.writeInt32(ownerUid);
96     output.writeInt32(inputFeatures);
97     output.writeInt32(displayId);
98     output.writeInt32(portalToDisplayId);
99     applicationInfo.write(output);
100     output.write(touchableRegion);
101     output.writeBool(replaceTouchableRegionWithCrop);
102     output.writeStrongBinder(touchableRegionCropHandle.promote());
103     return OK;
104 }
105 
read(const Parcel & from)106 InputWindowInfo InputWindowInfo::read(const Parcel& from) {
107     InputWindowInfo ret;
108 
109     if (from.readInt32() == 0) {
110         return ret;
111     }
112 
113     sp<IBinder> token = from.readStrongBinder();
114     if (token == nullptr) {
115         return ret;
116     }
117 
118     ret.token = token;
119     ret.name = from.readString8().c_str();
120     ret.layoutParamsFlags = from.readInt32();
121     ret.layoutParamsType = from.readInt32();
122     ret.dispatchingTimeout = from.readInt64();
123     ret.frameLeft = from.readInt32();
124     ret.frameTop = from.readInt32();
125     ret.frameRight = from.readInt32();
126     ret.frameBottom = from.readInt32();
127     ret.surfaceInset = from.readInt32();
128     ret.globalScaleFactor = from.readFloat();
129     ret.windowXScale = from.readFloat();
130     ret.windowYScale = from.readFloat();
131     ret.visible = from.readBool();
132     ret.canReceiveKeys = from.readBool();
133     ret.hasFocus = from.readBool();
134     ret.hasWallpaper = from.readBool();
135     ret.paused = from.readBool();
136     ret.layer = from.readInt32();
137     ret.ownerPid = from.readInt32();
138     ret.ownerUid = from.readInt32();
139     ret.inputFeatures = from.readInt32();
140     ret.displayId = from.readInt32();
141     ret.portalToDisplayId = from.readInt32();
142     ret.applicationInfo = InputApplicationInfo::read(from);
143     from.read(ret.touchableRegion);
144     ret.replaceTouchableRegionWithCrop = from.readBool();
145     ret.touchableRegionCropHandle = from.readStrongBinder();
146 
147     return ret;
148 }
149 
InputWindowInfo(const Parcel & from)150 InputWindowInfo::InputWindowInfo(const Parcel& from) {
151     *this = read(from);
152 }
153 
154 // --- InputWindowHandle ---
155 
InputWindowHandle()156 InputWindowHandle::InputWindowHandle() {
157 }
158 
~InputWindowHandle()159 InputWindowHandle::~InputWindowHandle() {
160 }
161 
releaseChannel()162 void InputWindowHandle::releaseChannel() {
163     mInfo.token.clear();
164 }
165 
getToken() const166 sp<IBinder> InputWindowHandle::getToken() const {
167     return mInfo.token;
168 }
169 
updateFrom(sp<InputWindowHandle> handle)170 void InputWindowHandle::updateFrom(sp<InputWindowHandle> handle) {
171     mInfo = handle->mInfo;
172 }
173 
174 } // namespace android
175