Input.cpp revision 5a2f68e5a5526ba80b5192776e2f0e349626777d
15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2010 The Android Open Source Project
35912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
45912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
55912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * you may not use this file except in compliance with the License.
65912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * You may obtain a copy of the License at
75912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
85912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
95912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Unless required by applicable law or agreed to in writing, software
115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * See the License for the specific language governing permissions and
145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * limitations under the License.
155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define LOG_TAG "Input"
185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown//#define LOG_NDEBUG 0
195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <math.h>
215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <limits.h>
225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <input/Input.h>
245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#ifdef HAVE_ANDROID_OS
265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <binder/Parcel.h>
275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif
285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android {
305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// --- InputEvent ---
325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid InputEvent::initialize(int32_t deviceId, int32_t source) {
345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mDeviceId = deviceId;
355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSource = source;
365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid InputEvent::initialize(const InputEvent& from) {
395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mDeviceId = from.mDeviceId;
405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSource = from.mSource;
415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// --- KeyEvent ---
445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownbool KeyEvent::hasDefaultAction(int32_t keyCode) {
465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    switch (keyCode) {
475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_HOME:
485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_BACK:
495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_CALL:
505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_ENDCALL:
515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_VOLUME_UP:
525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_VOLUME_DOWN:
535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_VOLUME_MUTE:
545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_POWER:
555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_CAMERA:
565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_HEADSETHOOK:
575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MENU:
585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_NOTIFICATION:
595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_FOCUS:
605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_SEARCH:
615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_PLAY:
625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_PAUSE:
635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_PLAY_PAUSE:
645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_STOP:
655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_NEXT:
665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_PREVIOUS:
675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_REWIND:
685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_RECORD:
695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_FAST_FORWARD:
705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MUTE:
715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_BRIGHTNESS_DOWN:
725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_BRIGHTNESS_UP:
735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            return true;
745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return false;
775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownbool KeyEvent::hasDefaultAction() const {
805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return hasDefaultAction(getKeyCode());
815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownbool KeyEvent::isSystemKey(int32_t keyCode) {
845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    switch (keyCode) {
855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MENU:
865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_SOFT_RIGHT:
875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_HOME:
885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_BACK:
895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_CALL:
905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_ENDCALL:
915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_VOLUME_UP:
925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_VOLUME_DOWN:
935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_VOLUME_MUTE:
945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MUTE:
955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_POWER:
965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_HEADSETHOOK:
975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_PLAY:
985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_PAUSE:
995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_PLAY_PAUSE:
1005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_STOP:
1015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_NEXT:
1025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_PREVIOUS:
1035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_REWIND:
1045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_RECORD:
1055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_MEDIA_FAST_FORWARD:
1065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_CAMERA:
1075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_FOCUS:
1085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_SEARCH:
1095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_BRIGHTNESS_DOWN:
1105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AKEYCODE_BRIGHTNESS_UP:
1115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            return true;
1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return false;
1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownbool KeyEvent::isSystemKey() const {
1185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return isSystemKey(getKeyCode());
1195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
1205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid KeyEvent::initialize(
1225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t deviceId,
1235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t source,
1245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t action,
1255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t flags,
1265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t keyCode,
1275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t scanCode,
1285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t metaState,
1295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t repeatCount,
1305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        nsecs_t downTime,
1315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        nsecs_t eventTime) {
1325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    InputEvent::initialize(deviceId, source);
1335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mAction = action;
1345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mFlags = flags;
1355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mKeyCode = keyCode;
1365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mScanCode = scanCode;
1375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mMetaState = metaState;
1385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mRepeatCount = repeatCount;
1395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mDownTime = downTime;
1405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mEventTime = eventTime;
1415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
1425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid KeyEvent::initialize(const KeyEvent& from) {
1445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    InputEvent::initialize(from);
1455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mAction = from.mAction;
1465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mFlags = from.mFlags;
1475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mKeyCode = from.mKeyCode;
1485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mScanCode = from.mScanCode;
1495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mMetaState = from.mMetaState;
1505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mRepeatCount = from.mRepeatCount;
1515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mDownTime = from.mDownTime;
1525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mEventTime = from.mEventTime;
1535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
1545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// --- PointerCoords ---
1575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownfloat PointerCoords::getAxisValue(int32_t axis) const {
1595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (axis < 0 || axis > 63) {
1605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return 0;
1615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
1625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint64_t axisBit = 1LL << axis;
1645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (!(bits & axisBit)) {
1655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return 0;
1665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
1675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint32_t index = __builtin_popcountll(bits & (axisBit - 1LL));
1685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return values[index];
1695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
1705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstatus_t PointerCoords::setAxisValue(int32_t axis, float value) {
1725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (axis < 0 || axis > 63) {
1735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return NAME_NOT_FOUND;
1745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
1755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint64_t axisBit = 1LL << axis;
1775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint32_t index = __builtin_popcountll(bits & (axisBit - 1LL));
1785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (!(bits & axisBit)) {
1795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        if (value == 0) {
1805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            return OK; // axes with value 0 do not need to be stored
1815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
1825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        uint32_t count = __builtin_popcountll(bits);
1835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        if (count >= MAX_AXES) {
1845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            tooManyAxes(axis);
1855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            return NO_MEMORY;
1865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
1875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        bits |= axisBit;
1885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        for (uint32_t i = count; i > index; i--) {
1895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            values[i] = values[i - 1];
1905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
1915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
1925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    values[index] = value;
1935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return OK;
1945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
1955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstatic inline void scaleAxisValue(PointerCoords& c, int axis, float scaleFactor) {
1975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float value = c.getAxisValue(axis);
1985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (value != 0) {
1995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        c.setAxisValue(axis, value * scaleFactor);
2005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid PointerCoords::scale(float scaleFactor) {
2045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // No need to scale pressure or size since they are normalized.
2055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // No need to scale orientation since it is meaningless to do so.
2065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    scaleAxisValue(*this, AMOTION_EVENT_AXIS_X, scaleFactor);
2075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    scaleAxisValue(*this, AMOTION_EVENT_AXIS_Y, scaleFactor);
2085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOUCH_MAJOR, scaleFactor);
2095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOUCH_MINOR, scaleFactor);
2105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOOL_MAJOR, scaleFactor);
2115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOOL_MINOR, scaleFactor);
2125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#ifdef HAVE_ANDROID_OS
2155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstatus_t PointerCoords::readFromParcel(Parcel* parcel) {
2165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bits = parcel->readInt64();
2175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint32_t count = __builtin_popcountll(bits);
2195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (count > MAX_AXES) {
2205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return BAD_VALUE;
2215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (uint32_t i = 0; i < count; i++) {
2245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        values[i] = parcel->readFloat();
2255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return OK;
2275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstatus_t PointerCoords::writeToParcel(Parcel* parcel) const {
2305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt64(bits);
2315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint32_t count = __builtin_popcountll(bits);
2335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (uint32_t i = 0; i < count; i++) {
2345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        parcel->writeFloat(values[i]);
2355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return OK;
2375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif
2395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid PointerCoords::tooManyAxes(int axis) {
2415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ALOGW("Could not set value for axis %d because the PointerCoords structure is full and "
2425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            "cannot contain more than %d axis values.", axis, int(MAX_AXES));
2435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownbool PointerCoords::operator==(const PointerCoords& other) const {
2465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (bits != other.bits) {
2475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return false;
2485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint32_t count = __builtin_popcountll(bits);
2505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (uint32_t i = 0; i < count; i++) {
2515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        if (values[i] != other.values[i]) {
2525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            return false;
2535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
2545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return true;
2565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid PointerCoords::copyFrom(const PointerCoords& other) {
2595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bits = other.bits;
2605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint32_t count = __builtin_popcountll(bits);
2615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (uint32_t i = 0; i < count; i++) {
2625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        values[i] = other.values[i];
2635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// --- PointerProperties ---
2685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownbool PointerProperties::operator==(const PointerProperties& other) const {
2705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return id == other.id
2715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            && toolType == other.toolType;
2725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid PointerProperties::copyFrom(const PointerProperties& other) {
2755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    id = other.id;
2765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    toolType = other.toolType;
2775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// --- MotionEvent ---
2815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid MotionEvent::initialize(
2835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t deviceId,
2845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t source,
2855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t action,
2865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t flags,
2875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t edgeFlags,
2885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t metaState,
2895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t buttonState,
2905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        float xOffset,
2915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        float yOffset,
2925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        float xPrecision,
2935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        float yPrecision,
2945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        nsecs_t downTime,
2955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        nsecs_t eventTime,
2965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        size_t pointerCount,
2975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        const PointerProperties* pointerProperties,
2985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        const PointerCoords* pointerCoords) {
2995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    InputEvent::initialize(deviceId, source);
3005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mAction = action;
3015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mFlags = flags;
3025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mEdgeFlags = edgeFlags;
3035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mMetaState = metaState;
3045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mButtonState = buttonState;
3055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mXOffset = xOffset;
3065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mYOffset = yOffset;
3075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mXPrecision = xPrecision;
3085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mYPrecision = yPrecision;
3095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mDownTime = downTime;
3105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mPointerProperties.clear();
3115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mPointerProperties.appendArray(pointerProperties, pointerCount);
3125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSampleEventTimes.clear();
3135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSamplePointerCoords.clear();
3145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    addSample(eventTime, pointerCoords);
3155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
3165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid MotionEvent::copyFrom(const MotionEvent* other, bool keepHistory) {
3185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    InputEvent::initialize(other->mDeviceId, other->mSource);
3195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mAction = other->mAction;
3205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mFlags = other->mFlags;
3215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mEdgeFlags = other->mEdgeFlags;
3225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mMetaState = other->mMetaState;
3235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mButtonState = other->mButtonState;
3245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mXOffset = other->mXOffset;
3255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mYOffset = other->mYOffset;
3265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mXPrecision = other->mXPrecision;
3275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mYPrecision = other->mYPrecision;
3285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mDownTime = other->mDownTime;
3295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mPointerProperties = other->mPointerProperties;
3305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (keepHistory) {
3325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mSampleEventTimes = other->mSampleEventTimes;
3335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mSamplePointerCoords = other->mSamplePointerCoords;
3345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    } else {
3355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mSampleEventTimes.clear();
3365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mSampleEventTimes.push(other->getEventTime());
3375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mSamplePointerCoords.clear();
3385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        size_t pointerCount = other->getPointerCount();
3395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        size_t historySize = other->getHistorySize();
3405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mSamplePointerCoords.appendArray(other->mSamplePointerCoords.array()
3415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                + (historySize * pointerCount), pointerCount);
3425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
3435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
3445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid MotionEvent::addSample(
3465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int64_t eventTime,
3475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        const PointerCoords* pointerCoords) {
3485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSampleEventTimes.push(eventTime);
3495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSamplePointerCoords.appendArray(pointerCoords, getPointerCount());
3505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
3515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownconst PointerCoords* MotionEvent::getRawPointerCoords(size_t pointerIndex) const {
3535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return &mSamplePointerCoords[getHistorySize() * getPointerCount() + pointerIndex];
3545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
3555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownfloat MotionEvent::getRawAxisValue(int32_t axis, size_t pointerIndex) const {
3575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return getRawPointerCoords(pointerIndex)->getAxisValue(axis);
3585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
3595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownfloat MotionEvent::getAxisValue(int32_t axis, size_t pointerIndex) const {
3615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float value = getRawPointerCoords(pointerIndex)->getAxisValue(axis);
3625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    switch (axis) {
3635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    case AMOTION_EVENT_AXIS_X:
3645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return value + mXOffset;
3655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    case AMOTION_EVENT_AXIS_Y:
3665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return value + mYOffset;
3675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
3685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return value;
3695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
3705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownconst PointerCoords* MotionEvent::getHistoricalRawPointerCoords(
3725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        size_t pointerIndex, size_t historicalIndex) const {
3735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return &mSamplePointerCoords[historicalIndex * getPointerCount() + pointerIndex];
3745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
3755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownfloat MotionEvent::getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex,
3775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        size_t historicalIndex) const {
3785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return getHistoricalRawPointerCoords(pointerIndex, historicalIndex)->getAxisValue(axis);
3795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
3805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownfloat MotionEvent::getHistoricalAxisValue(int32_t axis, size_t pointerIndex,
3825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        size_t historicalIndex) const {
3835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float value = getHistoricalRawPointerCoords(pointerIndex, historicalIndex)->getAxisValue(axis);
3845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    switch (axis) {
3855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    case AMOTION_EVENT_AXIS_X:
3865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return value + mXOffset;
3875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    case AMOTION_EVENT_AXIS_Y:
3885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return value + mYOffset;
3895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
3905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return value;
3915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
3925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownssize_t MotionEvent::findPointerIndex(int32_t pointerId) const {
3945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    size_t pointerCount = mPointerProperties.size();
3955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < pointerCount; i++) {
3965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        if (mPointerProperties.itemAt(i).id == pointerId) {
3975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            return i;
3985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
3995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return -1;
4015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
4025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid MotionEvent::offsetLocation(float xOffset, float yOffset) {
4045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mXOffset += xOffset;
4055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mYOffset += yOffset;
4065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
4075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid MotionEvent::scale(float scaleFactor) {
4095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mXOffset *= scaleFactor;
4105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mYOffset *= scaleFactor;
4115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mXPrecision *= scaleFactor;
4125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mYPrecision *= scaleFactor;
4135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    size_t numSamples = mSamplePointerCoords.size();
4155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < numSamples; i++) {
4165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mSamplePointerCoords.editItemAt(i).scale(scaleFactor);
4175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
4195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4205a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brownstatic void transformPoint(const float matrix[9], float x, float y, float *outX, float *outY) {
4215a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    // Apply perspective transform like Skia.
4225a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    float newX = matrix[0] * x + matrix[1] * y + matrix[2];
4235a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    float newY = matrix[3] * x + matrix[4] * y + matrix[5];
4245a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    float newZ = matrix[6] * x + matrix[7] * y + matrix[8];
4255a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    if (newZ) {
4265a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown        newZ = 1.0f / newZ;
4275a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    }
4285a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    *outX = newX * newZ;
4295a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    *outY = newY * newZ;
4305a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown}
4315a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown
4325a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brownstatic float transformAngle(const float matrix[9], float angleRadians,
4335a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown        float originX, float originY) {
4345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Construct and transform a vector oriented at the specified clockwise angle from vertical.
4355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Coordinate system: down is increasing Y, right is increasing X.
4365a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    float x = sinf(angleRadians);
4375a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    float y = -cosf(angleRadians);
4385a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    transformPoint(matrix, x, y, &x, &y);
4395a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    x -= originX;
4405a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    y -= originY;
4415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Derive the transformed vector's clockwise angle from vertical.
4435a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    float result = atan2f(x, -y);
4445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (result < - M_PI_2) {
4455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        result += M_PI;
4465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    } else if (result > M_PI_2) {
4475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        result -= M_PI;
4485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return result;
4505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
4515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4525a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brownvoid MotionEvent::transform(const float matrix[9]) {
4535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The tricky part of this implementation is to preserve the value of
4545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // rawX and rawY.  So we apply the transformation to the first point
4555a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    // then derive an appropriate new X/Y offset that will preserve rawX
4565a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown     // and rawY for that point.
4575a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    float oldXOffset = mXOffset;
4585a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    float oldYOffset = mYOffset;
4595a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    float newX, newY;
4605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float rawX = getRawX(0);
4615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float rawY = getRawY(0);
4625a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    transformPoint(matrix, rawX + oldXOffset, rawY + oldYOffset, &newX, &newY);
4635a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    mXOffset = newX - rawX;
4645a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    mYOffset = newY - rawY;
4655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4665a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    // Determine how the origin is transformed by the matrix so that we
4675a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    // can transform orientation vectors.
4685a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    float originX, originY;
4695a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    transformPoint(matrix, 0, 0, &originX, &originY);
4705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Apply the transformation to all samples.
4725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    size_t numSamples = mSamplePointerCoords.size();
4735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < numSamples; i++) {
4745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        PointerCoords& c = mSamplePointerCoords.editItemAt(i);
4755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        float x = c.getAxisValue(AMOTION_EVENT_AXIS_X) + oldXOffset;
4765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        float y = c.getAxisValue(AMOTION_EVENT_AXIS_Y) + oldYOffset;
4775a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown        transformPoint(matrix, x, y, &x, &y);
4785a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown        c.setAxisValue(AMOTION_EVENT_AXIS_X, x - mXOffset);
4795a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown        c.setAxisValue(AMOTION_EVENT_AXIS_Y, y - mYOffset);
4805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        float orientation = c.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION);
4825a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown        c.setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION,
4835a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown                transformAngle(matrix, orientation, originX, originY));
4845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
4865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4875a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown#ifdef HAVE_ANDROID_OS
4885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstatus_t MotionEvent::readFromParcel(Parcel* parcel) {
4895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    size_t pointerCount = parcel->readInt32();
4905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    size_t sampleCount = parcel->readInt32();
4915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (pointerCount == 0 || pointerCount > MAX_POINTERS || sampleCount == 0) {
4925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return BAD_VALUE;
4935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mDeviceId = parcel->readInt32();
4965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSource = parcel->readInt32();
4975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mAction = parcel->readInt32();
4985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mFlags = parcel->readInt32();
4995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mEdgeFlags = parcel->readInt32();
5005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mMetaState = parcel->readInt32();
5015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mButtonState = parcel->readInt32();
5025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mXOffset = parcel->readFloat();
5035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mYOffset = parcel->readFloat();
5045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mXPrecision = parcel->readFloat();
5055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mYPrecision = parcel->readFloat();
5065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mDownTime = parcel->readInt64();
5075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mPointerProperties.clear();
5095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mPointerProperties.setCapacity(pointerCount);
5105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSampleEventTimes.clear();
5115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSampleEventTimes.setCapacity(sampleCount);
5125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSamplePointerCoords.clear();
5135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    mSamplePointerCoords.setCapacity(sampleCount * pointerCount);
5145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < pointerCount; i++) {
5165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mPointerProperties.push();
5175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        PointerProperties& properties = mPointerProperties.editTop();
5185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        properties.id = parcel->readInt32();
5195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        properties.toolType = parcel->readInt32();
5205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    while (sampleCount-- > 0) {
5235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mSampleEventTimes.push(parcel->readInt64());
5245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        for (size_t i = 0; i < pointerCount; i++) {
5255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            mSamplePointerCoords.push();
5265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            status_t status = mSamplePointerCoords.editTop().readFromParcel(parcel);
5275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            if (status) {
5285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                return status;
5295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            }
5305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
5315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return OK;
5335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
5345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstatus_t MotionEvent::writeToParcel(Parcel* parcel) const {
5365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    size_t pointerCount = mPointerProperties.size();
5375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    size_t sampleCount = mSampleEventTimes.size();
5385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt32(pointerCount);
5405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt32(sampleCount);
5415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt32(mDeviceId);
5435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt32(mSource);
5445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt32(mAction);
5455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt32(mFlags);
5465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt32(mEdgeFlags);
5475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt32(mMetaState);
5485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt32(mButtonState);
5495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeFloat(mXOffset);
5505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeFloat(mYOffset);
5515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeFloat(mXPrecision);
5525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeFloat(mYPrecision);
5535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel->writeInt64(mDownTime);
5545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < pointerCount; i++) {
5565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        const PointerProperties& properties = mPointerProperties.itemAt(i);
5575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        parcel->writeInt32(properties.id);
5585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        parcel->writeInt32(properties.toolType);
5595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const PointerCoords* pc = mSamplePointerCoords.array();
5625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t h = 0; h < sampleCount; h++) {
5635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        parcel->writeInt64(mSampleEventTimes.itemAt(h));
5645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        for (size_t i = 0; i < pointerCount; i++) {
5655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            status_t status = (pc++)->writeToParcel(parcel);
5665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            if (status) {
5675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                return status;
5685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            }
5695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
5705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return OK;
5725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
5735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif
5745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownbool MotionEvent::isTouchEvent(int32_t source, int32_t action) {
5765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (source & AINPUT_SOURCE_CLASS_POINTER) {
5775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        // Specifically excludes HOVER_MOVE and SCROLL.
5785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        switch (action & AMOTION_EVENT_ACTION_MASK) {
5795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AMOTION_EVENT_ACTION_DOWN:
5805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AMOTION_EVENT_ACTION_MOVE:
5815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AMOTION_EVENT_ACTION_UP:
5825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AMOTION_EVENT_ACTION_POINTER_DOWN:
5835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AMOTION_EVENT_ACTION_POINTER_UP:
5845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AMOTION_EVENT_ACTION_CANCEL:
5855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        case AMOTION_EVENT_ACTION_OUTSIDE:
5865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            return true;
5875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
5885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return false;
5905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
5915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// --- PooledInputEventFactory ---
5945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownPooledInputEventFactory::PooledInputEventFactory(size_t maxPoolSize) :
5965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mMaxPoolSize(maxPoolSize) {
5975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
5985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownPooledInputEventFactory::~PooledInputEventFactory() {
6005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < mKeyEventPool.size(); i++) {
6015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        delete mKeyEventPool.itemAt(i);
6025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
6035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < mMotionEventPool.size(); i++) {
6045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        delete mMotionEventPool.itemAt(i);
6055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
6065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
6075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownKeyEvent* PooledInputEventFactory::createKeyEvent() {
6095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (!mKeyEventPool.isEmpty()) {
6105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        KeyEvent* event = mKeyEventPool.top();
6115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mKeyEventPool.pop();
6125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return event;
6135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
6145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return new KeyEvent();
6155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
6165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownMotionEvent* PooledInputEventFactory::createMotionEvent() {
6185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    if (!mMotionEventPool.isEmpty()) {
6195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        MotionEvent* event = mMotionEventPool.top();
6205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mMotionEventPool.pop();
6215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return event;
6225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
6235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    return new MotionEvent();
6245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
6255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid PooledInputEventFactory::recycle(InputEvent* event) {
6275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    switch (event->getType()) {
6285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    case AINPUT_EVENT_TYPE_KEY:
6295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        if (mKeyEventPool.size() < mMaxPoolSize) {
6305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            mKeyEventPool.push(static_cast<KeyEvent*>(event));
6315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            return;
6325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
6335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        break;
6345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    case AINPUT_EVENT_TYPE_MOTION:
6355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        if (mMotionEventPool.size() < mMaxPoolSize) {
6365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            mMotionEventPool.push(static_cast<MotionEvent*>(event));
6375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            return;
6385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
6395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        break;
6405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
6415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    delete event;
6425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
6435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android
645