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)32void InputWindowInfo::addTouchableRegion(const Rect& region) { 33 touchableRegion.orSelf(region); 34 } 35 touchableRegionContainsPoint(int32_t x,int32_t y) const36bool InputWindowInfo::touchableRegionContainsPoint(int32_t x, int32_t y) const { 37 return touchableRegion.contains(x,y); 38 } 39 frameContainsPoint(int32_t x,int32_t y) const40bool InputWindowInfo::frameContainsPoint(int32_t x, int32_t y) const { 41 return x >= frameLeft && x < frameRight 42 && y >= frameTop && y < frameBottom; 43 } 44 isTrustedOverlay() const45bool 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() const58bool InputWindowInfo::supportsSplitTouch() const { 59 return layoutParamsFlags & FLAG_SPLIT_TOUCH; 60 } 61 overlaps(const InputWindowInfo * other) const62bool 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) const67status_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)106InputWindowInfo 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)150InputWindowInfo::InputWindowInfo(const Parcel& from) { 151 *this = read(from); 152 } 153 154 // --- InputWindowHandle --- 155 InputWindowHandle()156InputWindowHandle::InputWindowHandle() { 157 } 158 ~InputWindowHandle()159InputWindowHandle::~InputWindowHandle() { 160 } 161 releaseChannel()162void InputWindowHandle::releaseChannel() { 163 mInfo.token.clear(); 164 } 165 getToken() const166sp<IBinder> InputWindowHandle::getToken() const { 167 return mInfo.token; 168 } 169 updateFrom(sp<InputWindowHandle> handle)170void InputWindowHandle::updateFrom(sp<InputWindowHandle> handle) { 171 mInfo = handle->mInfo; 172 } 173 174 } // namespace android 175