1d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/*
2d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Copyright (C) 2011 The Android Open Source Project
3d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *
4d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Licensed under the Apache License, Version 2.0 (the "License");
5d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * you may not use this file except in compliance with the License.
6d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * You may obtain a copy of the License at
7d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *
8d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *      http://www.apache.org/licenses/LICENSE-2.0
9d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *
10d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Unless required by applicable law or agreed to in writing, software
11d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * distributed under the License is distributed on an "AS IS" BASIS,
12d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * See the License for the specific language governing permissions and
14d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * limitations under the License.
15d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */
16d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
17d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#define LOG_TAG "InputListener"
18d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
19d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright//#define LOG_NDEBUG 0
20d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
21d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include "InputListener.h"
22d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
23a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <android/log.h>
24d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
25d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightnamespace android {
26d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
27d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- NotifyConfigurationChangedArgs ---
28d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
29d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightNotifyConfigurationChangedArgs::NotifyConfigurationChangedArgs(nsecs_t eventTime) :
30d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        eventTime(eventTime) {
31d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
32d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
33d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightNotifyConfigurationChangedArgs::NotifyConfigurationChangedArgs(
34d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        const NotifyConfigurationChangedArgs& other) :
35d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        eventTime(other.eventTime) {
36d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
37d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
38d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid NotifyConfigurationChangedArgs::notify(const sp<InputListenerInterface>& listener) const {
39d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    listener->notifyConfigurationChanged(this);
40d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
41d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
42d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
43d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- NotifyKeyArgs ---
44d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
45d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightNotifyKeyArgs::NotifyKeyArgs(nsecs_t eventTime, int32_t deviceId, uint32_t source,
46d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        uint32_t policyFlags,
47d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        int32_t action, int32_t flags, int32_t keyCode, int32_t scanCode,
48d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        int32_t metaState, nsecs_t downTime) :
49d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        eventTime(eventTime), deviceId(deviceId), source(source), policyFlags(policyFlags),
50d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        action(action), flags(flags), keyCode(keyCode), scanCode(scanCode),
51d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        metaState(metaState), downTime(downTime) {
52d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
53d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
54d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightNotifyKeyArgs::NotifyKeyArgs(const NotifyKeyArgs& other) :
55d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        eventTime(other.eventTime), deviceId(other.deviceId), source(other.source),
56d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        policyFlags(other.policyFlags),
57d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        action(other.action), flags(other.flags),
58d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        keyCode(other.keyCode), scanCode(other.scanCode),
59d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        metaState(other.metaState), downTime(other.downTime) {
60d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
61d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
62d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid NotifyKeyArgs::notify(const sp<InputListenerInterface>& listener) const {
63d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    listener->notifyKey(this);
64d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
65d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
66d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
67d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- NotifyMotionArgs ---
68d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
69d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightNotifyMotionArgs::NotifyMotionArgs(nsecs_t eventTime, int32_t deviceId, uint32_t source,
70d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        uint32_t policyFlags,
717b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright        int32_t action, int32_t actionButton, int32_t flags, int32_t metaState,
727b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright        int32_t buttonState, int32_t edgeFlags, int32_t displayId, uint32_t pointerCount,
73d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
74d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        float xPrecision, float yPrecision, nsecs_t downTime) :
75d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        eventTime(eventTime), deviceId(deviceId), source(source), policyFlags(policyFlags),
767b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright        action(action), actionButton(actionButton),
777b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright        flags(flags), metaState(metaState), buttonState(buttonState),
78d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        edgeFlags(edgeFlags), displayId(displayId), pointerCount(pointerCount),
79d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        xPrecision(xPrecision), yPrecision(yPrecision), downTime(downTime) {
80d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    for (uint32_t i = 0; i < pointerCount; i++) {
81d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        this->pointerProperties[i].copyFrom(pointerProperties[i]);
82d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        this->pointerCoords[i].copyFrom(pointerCoords[i]);
83d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
84d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
85d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
86d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightNotifyMotionArgs::NotifyMotionArgs(const NotifyMotionArgs& other) :
87d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        eventTime(other.eventTime), deviceId(other.deviceId), source(other.source),
88d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        policyFlags(other.policyFlags),
897b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright        action(other.action), actionButton(other.actionButton), flags(other.flags),
90d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        metaState(other.metaState), buttonState(other.buttonState),
917b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright        edgeFlags(other.edgeFlags), displayId(other.displayId), pointerCount(other.pointerCount),
92d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        xPrecision(other.xPrecision), yPrecision(other.yPrecision), downTime(other.downTime) {
93d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    for (uint32_t i = 0; i < pointerCount; i++) {
94d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        pointerProperties[i].copyFrom(other.pointerProperties[i]);
95d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        pointerCoords[i].copyFrom(other.pointerCoords[i]);
96d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
97d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
98d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
99d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid NotifyMotionArgs::notify(const sp<InputListenerInterface>& listener) const {
100d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    listener->notifyMotion(this);
101d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
102d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
103d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
104d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- NotifySwitchArgs ---
105d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
106d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightNotifySwitchArgs::NotifySwitchArgs(nsecs_t eventTime, uint32_t policyFlags,
107d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        uint32_t switchValues, uint32_t switchMask) :
108d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        eventTime(eventTime), policyFlags(policyFlags),
109d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        switchValues(switchValues), switchMask(switchMask) {
110d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
111d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
112d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightNotifySwitchArgs::NotifySwitchArgs(const NotifySwitchArgs& other) :
113d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        eventTime(other.eventTime), policyFlags(other.policyFlags),
114d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        switchValues(other.switchValues), switchMask(other.switchMask) {
115d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
116d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
117d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid NotifySwitchArgs::notify(const sp<InputListenerInterface>& listener) const {
118d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    listener->notifySwitch(this);
119d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
120d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
121d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
122d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- NotifyDeviceResetArgs ---
123d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
124d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightNotifyDeviceResetArgs::NotifyDeviceResetArgs(nsecs_t eventTime, int32_t deviceId) :
125d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        eventTime(eventTime), deviceId(deviceId) {
126d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
127d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
128d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightNotifyDeviceResetArgs::NotifyDeviceResetArgs(const NotifyDeviceResetArgs& other) :
129d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        eventTime(other.eventTime), deviceId(other.deviceId) {
130d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
131d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
132d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid NotifyDeviceResetArgs::notify(const sp<InputListenerInterface>& listener) const {
133d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    listener->notifyDeviceReset(this);
134d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
135d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
136d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
137d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- QueuedInputListener ---
138d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
139d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightQueuedInputListener::QueuedInputListener(const sp<InputListenerInterface>& innerListener) :
140d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mInnerListener(innerListener) {
141d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
142d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
143d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightQueuedInputListener::~QueuedInputListener() {
144d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    size_t count = mArgsQueue.size();
145d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    for (size_t i = 0; i < count; i++) {
146d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        delete mArgsQueue[i];
147d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
148d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
149d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
150d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid QueuedInputListener::notifyConfigurationChanged(
151d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        const NotifyConfigurationChangedArgs* args) {
152d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    mArgsQueue.push(new NotifyConfigurationChangedArgs(*args));
153d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
154d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
155d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid QueuedInputListener::notifyKey(const NotifyKeyArgs* args) {
156d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    mArgsQueue.push(new NotifyKeyArgs(*args));
157d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
158d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
159d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid QueuedInputListener::notifyMotion(const NotifyMotionArgs* args) {
160d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    mArgsQueue.push(new NotifyMotionArgs(*args));
161d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
162d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
163d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid QueuedInputListener::notifySwitch(const NotifySwitchArgs* args) {
164d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    mArgsQueue.push(new NotifySwitchArgs(*args));
165d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
166d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
167d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid QueuedInputListener::notifyDeviceReset(const NotifyDeviceResetArgs* args) {
168d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    mArgsQueue.push(new NotifyDeviceResetArgs(*args));
169d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
170d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
171d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid QueuedInputListener::flush() {
172d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    size_t count = mArgsQueue.size();
173d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    for (size_t i = 0; i < count; i++) {
174d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        NotifyArgs* args = mArgsQueue[i];
175d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        args->notify(mInnerListener);
176d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        delete args;
177d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
178d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    mArgsQueue.clear();
179d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
180d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
181d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
182d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} // namespace android
183