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