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 &range;
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