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 "InputListener"
18 
19 //#define LOG_NDEBUG 0
20 
21 #include "InputListener.h"
22 
23 #include <android/log.h>
24 
25 namespace android {
26 
27 // --- NotifyConfigurationChangedArgs ---
28 
NotifyConfigurationChangedArgs(uint32_t sequenceNum,nsecs_t eventTime)29 NotifyConfigurationChangedArgs::NotifyConfigurationChangedArgs(
30         uint32_t sequenceNum, nsecs_t eventTime) :
31         NotifyArgs(sequenceNum, eventTime) {
32 }
33 
NotifyConfigurationChangedArgs(const NotifyConfigurationChangedArgs & other)34 NotifyConfigurationChangedArgs::NotifyConfigurationChangedArgs(
35         const NotifyConfigurationChangedArgs& other) :
36         NotifyArgs(other.sequenceNum, other.eventTime) {
37 }
38 
operator ==(const NotifyConfigurationChangedArgs & rhs) const39 bool NotifyConfigurationChangedArgs::operator==(const NotifyConfigurationChangedArgs& rhs) const {
40     return sequenceNum == rhs.sequenceNum && eventTime == rhs.eventTime;
41 }
42 
notify(const sp<InputListenerInterface> & listener) const43 void NotifyConfigurationChangedArgs::notify(const sp<InputListenerInterface>& listener) const {
44     listener->notifyConfigurationChanged(this);
45 }
46 
47 
48 // --- NotifyKeyArgs ---
49 
NotifyKeyArgs(uint32_t sequenceNum,nsecs_t eventTime,int32_t deviceId,uint32_t source,int32_t displayId,uint32_t policyFlags,int32_t action,int32_t flags,int32_t keyCode,int32_t scanCode,int32_t metaState,nsecs_t downTime)50 NotifyKeyArgs::NotifyKeyArgs(uint32_t sequenceNum, nsecs_t eventTime, int32_t deviceId,
51         uint32_t source, int32_t displayId, uint32_t policyFlags,
52         int32_t action, int32_t flags, int32_t keyCode, int32_t scanCode,
53         int32_t metaState, nsecs_t downTime) :
54         NotifyArgs(sequenceNum, eventTime), deviceId(deviceId), source(source),
55         displayId(displayId), policyFlags(policyFlags),
56         action(action), flags(flags), keyCode(keyCode), scanCode(scanCode),
57         metaState(metaState), downTime(downTime) {
58 }
59 
NotifyKeyArgs(const NotifyKeyArgs & other)60 NotifyKeyArgs::NotifyKeyArgs(const NotifyKeyArgs& other) :
61         NotifyArgs(other.sequenceNum, other.eventTime), deviceId(other.deviceId),
62         source(other.source), displayId(other.displayId), policyFlags(other.policyFlags),
63         action(other.action), flags(other.flags),
64         keyCode(other.keyCode), scanCode(other.scanCode),
65         metaState(other.metaState), downTime(other.downTime) {
66 }
67 
operator ==(const NotifyKeyArgs & rhs) const68 bool NotifyKeyArgs::operator==(const NotifyKeyArgs& rhs) const {
69     return sequenceNum == rhs.sequenceNum
70             && eventTime == rhs.eventTime
71             && deviceId == rhs.deviceId
72             && source == rhs.source
73             && displayId == rhs.displayId
74             && policyFlags == rhs.policyFlags
75             && action == rhs.action
76             && flags == rhs.flags
77             && keyCode == rhs.keyCode
78             && scanCode == rhs.scanCode
79             && metaState == rhs.metaState
80             && downTime == rhs.downTime;
81 }
82 
notify(const sp<InputListenerInterface> & listener) const83 void NotifyKeyArgs::notify(const sp<InputListenerInterface>& listener) const {
84     listener->notifyKey(this);
85 }
86 
87 
88 // --- NotifyMotionArgs ---
89 
NotifyMotionArgs(uint32_t sequenceNum,nsecs_t eventTime,int32_t deviceId,uint32_t source,int32_t displayId,uint32_t policyFlags,int32_t action,int32_t actionButton,int32_t flags,int32_t metaState,int32_t buttonState,MotionClassification classification,int32_t edgeFlags,uint32_t deviceTimestamp,uint32_t pointerCount,const PointerProperties * pointerProperties,const PointerCoords * pointerCoords,float xPrecision,float yPrecision,nsecs_t downTime,const std::vector<TouchVideoFrame> & videoFrames)90 NotifyMotionArgs::NotifyMotionArgs(uint32_t sequenceNum, nsecs_t eventTime, int32_t deviceId,
91         uint32_t source, int32_t displayId, uint32_t policyFlags,
92         int32_t action, int32_t actionButton, int32_t flags, int32_t metaState,
93         int32_t buttonState, MotionClassification classification,
94         int32_t edgeFlags, uint32_t deviceTimestamp, uint32_t pointerCount,
95         const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
96         float xPrecision, float yPrecision, nsecs_t downTime,
97         const std::vector<TouchVideoFrame>& videoFrames) :
98         NotifyArgs(sequenceNum, eventTime), deviceId(deviceId), source(source),
99         displayId(displayId), policyFlags(policyFlags),
100         action(action), actionButton(actionButton),
101         flags(flags), metaState(metaState), buttonState(buttonState),
102         classification(classification), edgeFlags(edgeFlags), deviceTimestamp(deviceTimestamp),
103         pointerCount(pointerCount),
104         xPrecision(xPrecision), yPrecision(yPrecision), downTime(downTime),
105         videoFrames(videoFrames) {
106     for (uint32_t i = 0; i < pointerCount; i++) {
107         this->pointerProperties[i].copyFrom(pointerProperties[i]);
108         this->pointerCoords[i].copyFrom(pointerCoords[i]);
109     }
110 }
111 
NotifyMotionArgs(const NotifyMotionArgs & other)112 NotifyMotionArgs::NotifyMotionArgs(const NotifyMotionArgs& other) :
113         NotifyArgs(other.sequenceNum, other.eventTime), deviceId(other.deviceId),
114         source(other.source), displayId(other.displayId), policyFlags(other.policyFlags),
115         action(other.action), actionButton(other.actionButton), flags(other.flags),
116         metaState(other.metaState), buttonState(other.buttonState),
117         classification(other.classification), edgeFlags(other.edgeFlags),
118         deviceTimestamp(other.deviceTimestamp), pointerCount(other.pointerCount),
119         xPrecision(other.xPrecision), yPrecision(other.yPrecision), downTime(other.downTime),
120         videoFrames(other.videoFrames) {
121     for (uint32_t i = 0; i < pointerCount; i++) {
122         pointerProperties[i].copyFrom(other.pointerProperties[i]);
123         pointerCoords[i].copyFrom(other.pointerCoords[i]);
124     }
125 }
126 
operator ==(const NotifyMotionArgs & rhs) const127 bool NotifyMotionArgs::operator==(const NotifyMotionArgs& rhs) const {
128     bool equal =
129             sequenceNum == rhs.sequenceNum
130             && eventTime == rhs.eventTime
131             && deviceId == rhs.deviceId
132             && source == rhs.source
133             && displayId == rhs.displayId
134             && policyFlags == rhs.policyFlags
135             && action == rhs.action
136             && actionButton == rhs.actionButton
137             && flags == rhs.flags
138             && metaState == rhs.metaState
139             && buttonState == rhs.buttonState
140             && classification == rhs.classification
141             && edgeFlags == rhs.edgeFlags
142             && deviceTimestamp == rhs.deviceTimestamp
143             && pointerCount == rhs.pointerCount
144             // PointerProperties and PointerCoords are compared separately below
145             && xPrecision == rhs.xPrecision
146             && yPrecision == rhs.yPrecision
147             && downTime == rhs.downTime
148             && videoFrames == rhs.videoFrames;
149     if (!equal) {
150         return false;
151     }
152 
153     for (size_t i = 0; i < pointerCount; i++) {
154         equal =
155                 pointerProperties[i] == rhs.pointerProperties[i]
156                 && pointerCoords[i] == rhs.pointerCoords[i];
157         if (!equal) {
158             return false;
159         }
160     }
161     return true;
162 }
163 
notify(const sp<InputListenerInterface> & listener) const164 void NotifyMotionArgs::notify(const sp<InputListenerInterface>& listener) const {
165     listener->notifyMotion(this);
166 }
167 
168 
169 // --- NotifySwitchArgs ---
170 
NotifySwitchArgs(uint32_t sequenceNum,nsecs_t eventTime,uint32_t policyFlags,uint32_t switchValues,uint32_t switchMask)171 NotifySwitchArgs::NotifySwitchArgs(uint32_t sequenceNum, nsecs_t eventTime, uint32_t policyFlags,
172         uint32_t switchValues, uint32_t switchMask) :
173         NotifyArgs(sequenceNum, eventTime), policyFlags(policyFlags),
174         switchValues(switchValues), switchMask(switchMask) {
175 }
176 
NotifySwitchArgs(const NotifySwitchArgs & other)177 NotifySwitchArgs::NotifySwitchArgs(const NotifySwitchArgs& other) :
178         NotifyArgs(other.sequenceNum, other.eventTime), policyFlags(other.policyFlags),
179         switchValues(other.switchValues), switchMask(other.switchMask) {
180 }
181 
operator ==(const NotifySwitchArgs rhs) const182 bool NotifySwitchArgs::operator==(const NotifySwitchArgs rhs) const {
183     return sequenceNum == rhs.sequenceNum
184             && eventTime == rhs.eventTime
185             && policyFlags == rhs.policyFlags
186             && switchValues == rhs.switchValues
187             && switchMask == rhs.switchMask;
188 }
189 
notify(const sp<InputListenerInterface> & listener) const190 void NotifySwitchArgs::notify(const sp<InputListenerInterface>& listener) const {
191     listener->notifySwitch(this);
192 }
193 
194 
195 // --- NotifyDeviceResetArgs ---
196 
NotifyDeviceResetArgs(uint32_t sequenceNum,nsecs_t eventTime,int32_t deviceId)197 NotifyDeviceResetArgs::NotifyDeviceResetArgs(
198         uint32_t sequenceNum, nsecs_t eventTime, int32_t deviceId) :
199         NotifyArgs(sequenceNum, eventTime), deviceId(deviceId) {
200 }
201 
NotifyDeviceResetArgs(const NotifyDeviceResetArgs & other)202 NotifyDeviceResetArgs::NotifyDeviceResetArgs(const NotifyDeviceResetArgs& other) :
203         NotifyArgs(other.sequenceNum, other.eventTime), deviceId(other.deviceId) {
204 }
205 
operator ==(const NotifyDeviceResetArgs & rhs) const206 bool NotifyDeviceResetArgs::operator==(const NotifyDeviceResetArgs& rhs) const {
207     return sequenceNum == rhs.sequenceNum
208             && eventTime == rhs.eventTime
209             && deviceId == rhs.deviceId;
210 }
211 
notify(const sp<InputListenerInterface> & listener) const212 void NotifyDeviceResetArgs::notify(const sp<InputListenerInterface>& listener) const {
213     listener->notifyDeviceReset(this);
214 }
215 
216 
217 // --- QueuedInputListener ---
218 
QueuedInputListener(const sp<InputListenerInterface> & innerListener)219 QueuedInputListener::QueuedInputListener(const sp<InputListenerInterface>& innerListener) :
220         mInnerListener(innerListener) {
221 }
222 
~QueuedInputListener()223 QueuedInputListener::~QueuedInputListener() {
224     size_t count = mArgsQueue.size();
225     for (size_t i = 0; i < count; i++) {
226         delete mArgsQueue[i];
227     }
228 }
229 
notifyConfigurationChanged(const NotifyConfigurationChangedArgs * args)230 void QueuedInputListener::notifyConfigurationChanged(
231         const NotifyConfigurationChangedArgs* args) {
232     mArgsQueue.push_back(new NotifyConfigurationChangedArgs(*args));
233 }
234 
notifyKey(const NotifyKeyArgs * args)235 void QueuedInputListener::notifyKey(const NotifyKeyArgs* args) {
236     mArgsQueue.push_back(new NotifyKeyArgs(*args));
237 }
238 
notifyMotion(const NotifyMotionArgs * args)239 void QueuedInputListener::notifyMotion(const NotifyMotionArgs* args) {
240     mArgsQueue.push_back(new NotifyMotionArgs(*args));
241 }
242 
notifySwitch(const NotifySwitchArgs * args)243 void QueuedInputListener::notifySwitch(const NotifySwitchArgs* args) {
244     mArgsQueue.push_back(new NotifySwitchArgs(*args));
245 }
246 
notifyDeviceReset(const NotifyDeviceResetArgs * args)247 void QueuedInputListener::notifyDeviceReset(const NotifyDeviceResetArgs* args) {
248     mArgsQueue.push_back(new NotifyDeviceResetArgs(*args));
249 }
250 
flush()251 void QueuedInputListener::flush() {
252     size_t count = mArgsQueue.size();
253     for (size_t i = 0; i < count; i++) {
254         NotifyArgs* args = mArgsQueue[i];
255         args->notify(mInnerListener);
256         delete args;
257     }
258     mArgsQueue.clear();
259 }
260 
261 
262 } // namespace android
263