Input.cpp revision e2515eebf42c763c0a2d9f873a153711778cfc17
146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// 246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// Copyright 2010 The Android Open Source Project 346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// 446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// Provides a pipe-based transport for native events in the NDK. 546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// 646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define LOG_TAG "Input" 746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown//#define LOG_NDEBUG 0 946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#define DEBUG_PROBE 0 1147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 1247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#include <stdlib.h> 1347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#include <unistd.h> 149065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown#include <ctype.h> 1547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <ui/Input.h> 1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#include <math.h> 1991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 2091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#ifdef HAVE_ANDROID_OS 2191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#include <binder/Parcel.h> 2291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 2391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#include "SkPoint.h" 2491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#include "SkMatrix.h" 2591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#include "SkScalar.h" 2691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#endif 2791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android { 2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brownstatic const char* CONFIGURATION_FILE_DIR[] = { 3147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown "idc/", 3247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown "keylayout/", 3347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown "keychars/", 3447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown}; 3547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 3647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brownstatic const char* CONFIGURATION_FILE_EXTENSION[] = { 3747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown ".idc", 3847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown ".kl", 3947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown ".kcm", 4047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown}; 4147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 429065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brownstatic bool isValidNameChar(char ch) { 439065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown return isascii(ch) && (isdigit(ch) || isalpha(ch) || ch == '-' || ch == '_'); 449065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown} 459065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 4647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brownstatic void appendInputDeviceConfigurationFileRelativePath(String8& path, 4747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown const String8& name, InputDeviceConfigurationFileType type) { 4847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown path.append(CONFIGURATION_FILE_DIR[type]); 4947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown for (size_t i = 0; i < name.length(); i++) { 5047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown char ch = name[i]; 519065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown if (!isValidNameChar(ch)) { 5247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown ch = '_'; 5347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 5447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown path.append(&ch, 1); 5547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 5647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown path.append(CONFIGURATION_FILE_EXTENSION[type]); 5747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown} 5847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 599065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff BrownString8 getInputDeviceConfigurationFilePathByDeviceIdentifier( 609065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown const InputDeviceIdentifier& deviceIdentifier, 619065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown InputDeviceConfigurationFileType type) { 629065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown if (deviceIdentifier.vendor !=0 && deviceIdentifier.product != 0) { 639065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown if (deviceIdentifier.version != 0) { 649065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown // Try vendor product version. 659065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown String8 versionPath(getInputDeviceConfigurationFilePathByName( 669065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown String8::format("Vendor_%04x_Product_%04x_Version_%04x", 679065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown deviceIdentifier.vendor, deviceIdentifier.product, 689065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown deviceIdentifier.version), 699065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown type)); 709065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown if (!versionPath.isEmpty()) { 719065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown return versionPath; 729065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown } 739065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown } 749065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 759065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown // Try vendor product. 769065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown String8 productPath(getInputDeviceConfigurationFilePathByName( 779065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown String8::format("Vendor_%04x_Product_%04x", 789065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown deviceIdentifier.vendor, deviceIdentifier.product), 799065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown type)); 809065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown if (!productPath.isEmpty()) { 819065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown return productPath; 829065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown } 839065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown } 849065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 859065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown // Try device name. 869065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown return getInputDeviceConfigurationFilePathByName(deviceIdentifier.name, type); 879065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown} 889065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 899065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff BrownString8 getInputDeviceConfigurationFilePathByName( 9047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown const String8& name, InputDeviceConfigurationFileType type) { 9147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown // Search system repository. 9247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown String8 path; 9347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown path.setTo(getenv("ANDROID_ROOT")); 9447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown path.append("/usr/"); 9547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown appendInputDeviceConfigurationFileRelativePath(path, name, type); 9647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#if DEBUG_PROBE 9747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown LOGD("Probing for system provided input device configuration file: path='%s'", path.string()); 9847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#endif 9947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown if (!access(path.string(), R_OK)) { 10047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#if DEBUG_PROBE 10147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown LOGD("Found"); 10247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#endif 10347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown return path; 10447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 10547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 10647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown // Search user repository. 10747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown // TODO Should only look here if not in safe mode. 10847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown path.setTo(getenv("ANDROID_DATA")); 10947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown path.append("/system/devices/"); 11047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown appendInputDeviceConfigurationFileRelativePath(path, name, type); 11147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#if DEBUG_PROBE 11247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown LOGD("Probing for system user input device configuration file: path='%s'", path.string()); 11347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#endif 11447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown if (!access(path.string(), R_OK)) { 11547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#if DEBUG_PROBE 11647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown LOGD("Found"); 11747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#endif 11847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown return path; 11947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 12047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 12147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown // Not found. 12247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#if DEBUG_PROBE 12347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown LOGD("Probe failed to find input device configuration file: name='%s', type=%d", 12447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown name.string(), type); 12547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown#endif 12647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown return String8(); 12747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown} 12847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 12947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 13047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown// --- InputEvent --- 13146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 132c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownvoid InputEvent::initialize(int32_t deviceId, int32_t source) { 13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mDeviceId = deviceId; 134c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown mSource = source; 13546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 13646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1372c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornvoid InputEvent::initialize(const InputEvent& from) { 1382c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mDeviceId = from.mDeviceId; 1392c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mSource = from.mSource; 1402c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn} 1412c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 14247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown// --- KeyEvent --- 14346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1443c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::hasDefaultAction(int32_t keyCode) { 1453c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn switch (keyCode) { 146fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_HOME: 147fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_BACK: 148fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_CALL: 149fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_ENDCALL: 150fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_VOLUME_UP: 151fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_VOLUME_DOWN: 152b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown case AKEYCODE_VOLUME_MUTE: 153fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_POWER: 154fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_CAMERA: 155fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_HEADSETHOOK: 156fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MENU: 157fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_NOTIFICATION: 158fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_FOCUS: 159fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_SEARCH: 160b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown case AKEYCODE_MEDIA_PLAY: 161b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown case AKEYCODE_MEDIA_PAUSE: 162fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_PLAY_PAUSE: 163fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_STOP: 164fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_NEXT: 165fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_PREVIOUS: 166fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_REWIND: 167b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown case AKEYCODE_MEDIA_RECORD: 168fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_FAST_FORWARD: 169fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MUTE: 1703c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return true; 1713c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 1723c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 1733c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return false; 1743c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 1753c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 1763c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::hasDefaultAction() const { 1773c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return hasDefaultAction(getKeyCode()); 1783c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 1793c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 1803c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::isSystemKey(int32_t keyCode) { 1813c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn switch (keyCode) { 182fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MENU: 183fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_SOFT_RIGHT: 184fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_HOME: 185fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_BACK: 186fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_CALL: 187fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_ENDCALL: 188fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_VOLUME_UP: 189fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_VOLUME_DOWN: 190b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown case AKEYCODE_VOLUME_MUTE: 191fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MUTE: 192fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_POWER: 193fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_HEADSETHOOK: 194b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown case AKEYCODE_MEDIA_PLAY: 195b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown case AKEYCODE_MEDIA_PAUSE: 196fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_PLAY_PAUSE: 197fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_STOP: 198fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_NEXT: 199fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_PREVIOUS: 200fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_REWIND: 201b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown case AKEYCODE_MEDIA_RECORD: 202fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_MEDIA_FAST_FORWARD: 203fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_CAMERA: 204fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_FOCUS: 205fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown case AKEYCODE_SEARCH: 2063c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return true; 2073c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2083c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 2093c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return false; 2103c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 2113c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 2123c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornbool KeyEvent::isSystemKey() const { 2133c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return isSystemKey(getKeyCode()); 2143c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 2153c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 21646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid KeyEvent::initialize( 21746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t deviceId, 218c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown int32_t source, 21946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t action, 22046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t flags, 22146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t keyCode, 22246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t scanCode, 22346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t metaState, 22446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t repeatCount, 22546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nsecs_t downTime, 22646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nsecs_t eventTime) { 227c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown InputEvent::initialize(deviceId, source); 22846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mAction = action; 22946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mFlags = flags; 23046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mKeyCode = keyCode; 23146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mScanCode = scanCode; 23246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mMetaState = metaState; 23346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mRepeatCount = repeatCount; 23446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mDownTime = downTime; 23546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mEventTime = eventTime; 23646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 23746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2382c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornvoid KeyEvent::initialize(const KeyEvent& from) { 2392c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn InputEvent::initialize(from); 2402c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mAction = from.mAction; 2412c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mFlags = from.mFlags; 2422c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mKeyCode = from.mKeyCode; 2432c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mScanCode = from.mScanCode; 2442c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mMetaState = from.mMetaState; 2452c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mRepeatCount = from.mRepeatCount; 2462c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mDownTime = from.mDownTime; 2472c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mEventTime = from.mEventTime; 2482c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn} 2492c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 25091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 25191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown// --- PointerCoords --- 25291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 2536f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brownfloat PointerCoords::getAxisValue(int32_t axis) const { 2546f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown if (axis < 0 || axis > 63) { 2556f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return 0; 2566f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown } 2576f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 2586f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown uint64_t axisBit = 1LL << axis; 2596f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown if (!(bits & axisBit)) { 2606f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return 0; 2616f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown } 2626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown uint32_t index = __builtin_popcountll(bits & (axisBit - 1LL)); 2636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return values[index]; 2646f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown} 2656f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 2666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brownstatus_t PointerCoords::setAxisValue(int32_t axis, float value) { 2676f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown if (axis < 0 || axis > 63) { 2686f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return NAME_NOT_FOUND; 2696f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown } 2706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 2716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown uint64_t axisBit = 1LL << axis; 2726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown uint32_t index = __builtin_popcountll(bits & (axisBit - 1LL)); 2736f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown if (!(bits & axisBit)) { 2746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown uint32_t count = __builtin_popcountll(bits); 2756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown if (count >= MAX_AXES) { 2766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown tooManyAxes(axis); 2776f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return NO_MEMORY; 2786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown } 2796f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown bits |= axisBit; 2806f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown for (uint32_t i = count; i > index; i--) { 2816f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown values[i] = values[i - 1]; 2826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown } 2836f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown } 2846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown values[index] = value; 2856f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return OK; 2866f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown} 2876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 2886f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brownfloat* PointerCoords::editAxisValue(int32_t axis) { 2896f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown if (axis < 0 || axis > 63) { 2906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return NULL; 2916f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown } 2926f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 2936f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown uint64_t axisBit = 1LL << axis; 2946f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown if (!(bits & axisBit)) { 2956f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return NULL; 2966f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown } 2976f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown uint32_t index = __builtin_popcountll(bits & (axisBit - 1LL)); 2986f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return &values[index]; 2996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown} 3006f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 301e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackbornstatic inline void scaleAxisValue(PointerCoords& c, int axis, float scaleFactor) { 302e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn float* value = c.editAxisValue(axis); 303e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (value) { 304e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn *value *= scaleFactor; 305e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 306e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn} 307e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 308e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackbornvoid PointerCoords::scale(float scaleFactor) { 309e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn // No need to scale pressure or size since they are normalized. 310e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn // No need to scale orientation since it is meaningless to do so. 311e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn scaleAxisValue(*this, AMOTION_EVENT_AXIS_X, scaleFactor); 312e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn scaleAxisValue(*this, AMOTION_EVENT_AXIS_Y, scaleFactor); 313e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOUCH_MAJOR, scaleFactor); 314e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOUCH_MINOR, scaleFactor); 315e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOOL_MAJOR, scaleFactor); 316e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOOL_MINOR, scaleFactor); 317e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn} 318e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 31991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#ifdef HAVE_ANDROID_OS 32091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatus_t PointerCoords::readFromParcel(Parcel* parcel) { 3216f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown bits = parcel->readInt64(); 32291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 3236f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown uint32_t count = __builtin_popcountll(bits); 32491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown if (count > MAX_AXES) { 32591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return BAD_VALUE; 32691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 32791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 32891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown for (uint32_t i = 0; i < count; i++) { 32991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown values[i] = parcel->readInt32(); 33091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 33191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return OK; 33291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 33391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 33491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatus_t PointerCoords::writeToParcel(Parcel* parcel) const { 3356f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown parcel->writeInt64(bits); 33691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 3376f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown uint32_t count = __builtin_popcountll(bits); 33891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown for (uint32_t i = 0; i < count; i++) { 33991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt32(values[i]); 34091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 34191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return OK; 34291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 34391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#endif 34491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 34591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownvoid PointerCoords::tooManyAxes(int axis) { 34691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown LOGW("Could not set value for axis %d because the PointerCoords structure is full and " 34791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown "cannot contain more than %d axis values.", axis, int(MAX_AXES)); 34891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 34991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 35091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 35147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown// --- MotionEvent --- 35246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 35346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid MotionEvent::initialize( 35446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t deviceId, 355c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown int32_t source, 35646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t action, 35785a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown int32_t flags, 35846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t edgeFlags, 35946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t metaState, 3605c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown float xOffset, 3615c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown float yOffset, 36246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown float xPrecision, 36346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown float yPrecision, 36446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nsecs_t downTime, 36546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nsecs_t eventTime, 36646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown size_t pointerCount, 36746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown const int32_t* pointerIds, 36846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown const PointerCoords* pointerCoords) { 369c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown InputEvent::initialize(deviceId, source); 37046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mAction = action; 37185a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown mFlags = flags; 37246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mEdgeFlags = edgeFlags; 37346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mMetaState = metaState; 3745c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown mXOffset = xOffset; 3755c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown mYOffset = yOffset; 37646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mXPrecision = xPrecision; 37746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mYPrecision = yPrecision; 37846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mDownTime = downTime; 37946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mPointerIds.clear(); 38046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mPointerIds.appendArray(pointerIds, pointerCount); 38146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mSampleEventTimes.clear(); 38246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mSamplePointerCoords.clear(); 38346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown addSample(eventTime, pointerCoords); 38446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 38546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 38691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownvoid MotionEvent::copyFrom(const MotionEvent* other, bool keepHistory) { 38791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown InputEvent::initialize(other->mDeviceId, other->mSource); 38891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mAction = other->mAction; 38991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mFlags = other->mFlags; 39091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mEdgeFlags = other->mEdgeFlags; 39191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mMetaState = other->mMetaState; 39291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mXOffset = other->mXOffset; 39391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mYOffset = other->mYOffset; 39491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mXPrecision = other->mXPrecision; 39591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mYPrecision = other->mYPrecision; 39691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mDownTime = other->mDownTime; 39791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mPointerIds = other->mPointerIds; 39891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 39991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown if (keepHistory) { 40091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSampleEventTimes = other->mSampleEventTimes; 40191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSamplePointerCoords = other->mSamplePointerCoords; 40291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } else { 40391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSampleEventTimes.clear(); 40491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSampleEventTimes.push(other->getEventTime()); 40591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSamplePointerCoords.clear(); 40691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t pointerCount = other->getPointerCount(); 40791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t historySize = other->getHistorySize(); 40891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSamplePointerCoords.appendArray(other->mSamplePointerCoords.array() 40991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown + (historySize * pointerCount), pointerCount); 41091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 41191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 41291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 41346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid MotionEvent::addSample( 41446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int64_t eventTime, 41546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown const PointerCoords* pointerCoords) { 41646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mSampleEventTimes.push(eventTime); 41746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mSamplePointerCoords.appendArray(pointerCoords, getPointerCount()); 41846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 41946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 42091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownconst PointerCoords* MotionEvent::getRawPointerCoords(size_t pointerIndex) const { 42191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return &mSamplePointerCoords[getHistorySize() * getPointerCount() + pointerIndex]; 42291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 42391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 42491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownfloat MotionEvent::getRawAxisValue(int32_t axis, size_t pointerIndex) const { 42591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return getRawPointerCoords(pointerIndex)->getAxisValue(axis); 42691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 42791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 42891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownfloat MotionEvent::getAxisValue(int32_t axis, size_t pointerIndex) const { 42991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float value = getRawPointerCoords(pointerIndex)->getAxisValue(axis); 43091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown switch (axis) { 431ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown case AMOTION_EVENT_AXIS_X: 432e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return value + mXOffset; 433ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown case AMOTION_EVENT_AXIS_Y: 434e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return value + mYOffset; 43591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 43691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return value; 43791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 43891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 43991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownconst PointerCoords* MotionEvent::getHistoricalRawPointerCoords( 44091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t pointerIndex, size_t historicalIndex) const { 44191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return &mSamplePointerCoords[historicalIndex * getPointerCount() + pointerIndex]; 44291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 44391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 44491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownfloat MotionEvent::getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex, 44591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t historicalIndex) const { 44691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return getHistoricalRawPointerCoords(pointerIndex, historicalIndex)->getAxisValue(axis); 44791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 44891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 44991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownfloat MotionEvent::getHistoricalAxisValue(int32_t axis, size_t pointerIndex, 45091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t historicalIndex) const { 45191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float value = getHistoricalRawPointerCoords(pointerIndex, historicalIndex)->getAxisValue(axis); 45291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown switch (axis) { 453ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown case AMOTION_EVENT_AXIS_X: 454e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return value + mXOffset; 455ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown case AMOTION_EVENT_AXIS_Y: 456e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return value + mYOffset; 45791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 45891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return value; 45991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 46091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 46146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid MotionEvent::offsetLocation(float xOffset, float yOffset) { 4625c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown mXOffset += xOffset; 4635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown mYOffset += yOffset; 46446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 46546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 46691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownvoid MotionEvent::scale(float scaleFactor) { 46791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mXOffset *= scaleFactor; 46891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mYOffset *= scaleFactor; 46991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mXPrecision *= scaleFactor; 47091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mYPrecision *= scaleFactor; 47191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 47291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t numSamples = mSamplePointerCoords.size(); 47391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown for (size_t i = 0; i < numSamples; i++) { 474e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mSamplePointerCoords.editItemAt(i).scale(scaleFactor); 47591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 47691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 47791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 47891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#ifdef HAVE_ANDROID_OS 47991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatic inline float transformAngle(const SkMatrix* matrix, float angleRadians) { 48091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown // Construct and transform a vector oriented at the specified clockwise angle from vertical. 48191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown // Coordinate system: down is increasing Y, right is increasing X. 48291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown SkPoint vector; 48391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown vector.fX = SkFloatToScalar(sinf(angleRadians)); 48491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown vector.fY = SkFloatToScalar(-cosf(angleRadians)); 48591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown matrix->mapVectors(& vector, 1); 48691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 48791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown // Derive the transformed vector's clockwise angle from vertical. 48891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float result = atan2f(SkScalarToFloat(vector.fX), SkScalarToFloat(-vector.fY)); 48991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown if (result < - M_PI_2) { 49091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown result += M_PI; 49191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } else if (result > M_PI_2) { 49291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown result -= M_PI; 49391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 49491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return result; 49591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 49691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 49791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownvoid MotionEvent::transform(const SkMatrix* matrix) { 49891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float oldXOffset = mXOffset; 49991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float oldYOffset = mYOffset; 50091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 50191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown // The tricky part of this implementation is to preserve the value of 50291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown // rawX and rawY. So we apply the transformation to the first point 50391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown // then derive an appropriate new X/Y offset that will preserve rawX and rawY. 50491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown SkPoint point; 50591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float rawX = getRawX(0); 50691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float rawY = getRawY(0); 50791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown matrix->mapXY(SkFloatToScalar(rawX + oldXOffset), SkFloatToScalar(rawY + oldYOffset), 50891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown & point); 50991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float newX = SkScalarToFloat(point.fX); 51091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float newY = SkScalarToFloat(point.fY); 51191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float newXOffset = newX - rawX; 51291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float newYOffset = newY - rawY; 51391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 51491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mXOffset = newXOffset; 51591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mYOffset = newYOffset; 51691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 51791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown // Apply the transformation to all samples. 51891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t numSamples = mSamplePointerCoords.size(); 51991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown for (size_t i = 0; i < numSamples; i++) { 52091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown PointerCoords& c = mSamplePointerCoords.editItemAt(i); 521ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown float* xPtr = c.editAxisValue(AMOTION_EVENT_AXIS_X); 522ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown float* yPtr = c.editAxisValue(AMOTION_EVENT_AXIS_Y); 52391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown if (xPtr && yPtr) { 52491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float x = *xPtr + oldXOffset; 52591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown float y = *yPtr + oldYOffset; 52691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown matrix->mapXY(SkFloatToScalar(x), SkFloatToScalar(y), & point); 52791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown *xPtr = SkScalarToFloat(point.fX) - newXOffset; 52891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown *yPtr = SkScalarToFloat(point.fY) - newYOffset; 52991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 53091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 531ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown float* orientationPtr = c.editAxisValue(AMOTION_EVENT_AXIS_ORIENTATION); 53291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown if (orientationPtr) { 53391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown *orientationPtr = transformAngle(matrix, *orientationPtr); 53491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 53591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 53691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 53791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 53891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatus_t MotionEvent::readFromParcel(Parcel* parcel) { 53991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t pointerCount = parcel->readInt32(); 54091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t sampleCount = parcel->readInt32(); 54191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown if (pointerCount == 0 || pointerCount > MAX_POINTERS || sampleCount == 0) { 54291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return BAD_VALUE; 54391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 54491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 54591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mDeviceId = parcel->readInt32(); 54691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSource = parcel->readInt32(); 54791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mAction = parcel->readInt32(); 54891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mFlags = parcel->readInt32(); 54991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mEdgeFlags = parcel->readInt32(); 55091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mMetaState = parcel->readInt32(); 55191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mXOffset = parcel->readFloat(); 55291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mYOffset = parcel->readFloat(); 55391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mXPrecision = parcel->readFloat(); 55491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mYPrecision = parcel->readFloat(); 55591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mDownTime = parcel->readInt64(); 55691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 55791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mPointerIds.clear(); 55891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mPointerIds.setCapacity(pointerCount); 55991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSampleEventTimes.clear(); 56091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSampleEventTimes.setCapacity(sampleCount); 56191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSamplePointerCoords.clear(); 56291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSamplePointerCoords.setCapacity(sampleCount * pointerCount); 56391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 56491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown for (size_t i = 0; i < pointerCount; i++) { 56591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mPointerIds.push(parcel->readInt32()); 56691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 56791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 56891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown while (sampleCount-- > 0) { 56991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSampleEventTimes.push(parcel->readInt64()); 57091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown for (size_t i = 0; i < pointerCount; i++) { 57191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown mSamplePointerCoords.push(); 57291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown status_t status = mSamplePointerCoords.editTop().readFromParcel(parcel); 573ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown if (status) { 57491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return status; 57591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 57691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 57791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 57891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return OK; 57991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 58091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 58191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownstatus_t MotionEvent::writeToParcel(Parcel* parcel) const { 58291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t pointerCount = mPointerIds.size(); 58391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown size_t sampleCount = mSampleEventTimes.size(); 58491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 58591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt32(pointerCount); 58691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt32(sampleCount); 58791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 58891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt32(mDeviceId); 58991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt32(mSource); 59091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt32(mAction); 59191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt32(mFlags); 59291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt32(mEdgeFlags); 59391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt32(mMetaState); 59491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeFloat(mXOffset); 59591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeFloat(mYOffset); 59691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeFloat(mXPrecision); 59791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeFloat(mYPrecision); 59891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt64(mDownTime); 59991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 60091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown for (size_t i = 0; i < pointerCount; i++) { 60191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt32(mPointerIds.itemAt(i)); 60291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 60391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 60491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown const PointerCoords* pc = mSamplePointerCoords.array(); 60591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown for (size_t h = 0; h < sampleCount; h++) { 60691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown parcel->writeInt64(mSampleEventTimes.itemAt(h)); 60791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown for (size_t i = 0; i < pointerCount; i++) { 60891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown status_t status = (pc++)->writeToParcel(parcel); 609ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown if (status) { 61091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return status; 61191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 61291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 61391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown } 61491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown return OK; 61591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown} 61691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#endif 61791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 61856194ebec6212e229f4ccdaa4b187166d20013efJeff Brownbool MotionEvent::isTouchEvent(int32_t source, int32_t action) { 61956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown if (source & AINPUT_SOURCE_CLASS_POINTER) { 62056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown // Specifically excludes HOVER_MOVE and SCROLL. 62156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown switch (action & AMOTION_EVENT_ACTION_MASK) { 62256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown case AMOTION_EVENT_ACTION_DOWN: 62356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown case AMOTION_EVENT_ACTION_MOVE: 62456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown case AMOTION_EVENT_ACTION_UP: 62556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown case AMOTION_EVENT_ACTION_POINTER_DOWN: 62656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown case AMOTION_EVENT_ACTION_POINTER_UP: 62756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown case AMOTION_EVENT_ACTION_CANCEL: 62856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown case AMOTION_EVENT_ACTION_OUTSIDE: 62956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown return true; 63056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 63156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 63256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown return false; 63356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown} 63456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 63591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown 63647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown// --- InputDeviceInfo --- 6376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 6386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff BrownInputDeviceInfo::InputDeviceInfo() { 6396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown initialize(-1, String8("uninitialized device info")); 6406d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 6416d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 6426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff BrownInputDeviceInfo::InputDeviceInfo(const InputDeviceInfo& other) : 6436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown mId(other.mId), mName(other.mName), mSources(other.mSources), 6446d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown mKeyboardType(other.mKeyboardType), 6456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown mMotionRanges(other.mMotionRanges) { 6466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 6476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 6486d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff BrownInputDeviceInfo::~InputDeviceInfo() { 6496d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 6506d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 6516d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownvoid InputDeviceInfo::initialize(int32_t id, const String8& name) { 6526d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown mId = id; 6536d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown mName = name; 6546d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown mSources = 0; 6556d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown mKeyboardType = AINPUT_KEYBOARD_TYPE_NONE; 6566d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown mMotionRanges.clear(); 6576d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 6586d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 659efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownconst InputDeviceInfo::MotionRange* InputDeviceInfo::getMotionRange( 660efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown int32_t axis, uint32_t source) const { 661efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown size_t numRanges = mMotionRanges.size(); 662efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown for (size_t i = 0; i < numRanges; i++) { 663efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown const MotionRange& range = mMotionRanges.itemAt(i); 664efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown if (range.axis == axis && range.source == source) { 665efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown return ⦥ 666efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown } 667efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown } 668efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown return NULL; 6696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 6706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 6716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownvoid InputDeviceInfo::addSource(uint32_t source) { 6726d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown mSources |= source; 6736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 6746d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 675efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownvoid InputDeviceInfo::addMotionRange(int32_t axis, uint32_t source, float min, float max, 6766d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown float flat, float fuzz) { 677efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown MotionRange range = { axis, source, min, max, flat, fuzz }; 678efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown mMotionRanges.add(range); 6796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 6806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 681efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownvoid InputDeviceInfo::addMotionRange(const MotionRange& range) { 682efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown mMotionRanges.add(range); 6836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown} 6846d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown 68546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android 686