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