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