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#ifndef _LIBINPUT_INPUT_H
185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define _LIBINPUT_INPUT_H
195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Native input event structures.
225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <android/input.h>
25d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright#include <utils/BitSet.h>
265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/KeyedVector.h>
275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/RefBase.h>
285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/String8.h>
29d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright#include <utils/Timers.h>
30d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright#include <utils/Vector.h>
31834ac204ce52d874cdd7ae921e5a4d85c5e42c52Nick Kralevich#include <stdint.h>
325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Additional private constants not defined in ndk/ui/input.h.
355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownenum {
375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Signifies that the key is being predispatched */
385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    AKEY_EVENT_FLAG_PREDISPATCH = 0x20000000,
395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Private control to determine when an app is tracking a key sequence. */
415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    AKEY_EVENT_FLAG_START_TRACKING = 0x40000000,
425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Key event is inconsistent with previously sent key events. */
445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    AKEY_EVENT_FLAG_TAINTED = 0x80000000,
455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownenum {
48cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright
49cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright    /**
50cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright     * This flag indicates that the window that received this motion event is partly
51cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright     * or wholly obscured by another visible window above it.  This flag is set to true
52cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright     * even if the event did not directly pass through the obscured area.
53cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright     * A security sensitive application can check this flag to identify situations in which
54cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright     * a malicious application may have covered up part of its content for the purpose
55cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright     * of misleading the user or hijacking touches.  An appropriate response might be
56cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright     * to drop the suspect touches or to take additional precautions to confirm the user's
57cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright     * actual intent.
58cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright     */
59cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright    AMOTION_EVENT_FLAG_WINDOW_IS_PARTIALLY_OBSCURED = 0x2,
60cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright
615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Motion event is inconsistent with previously sent motion events. */
625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    AMOTION_EVENT_FLAG_TAINTED = 0x80000000,
635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownenum {
665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Used when a motion event is not associated with any display.
675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * Typically used for non-pointer events. */
685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ADISPLAY_ID_NONE = -1,
695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* The default display id. */
715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ADISPLAY_ID_DEFAULT = 0,
725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownenum {
755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /*
765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * Indicates that an input device has switches.
775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * This input source flag is hidden from the API because switches are only used by the system
785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * and applications have no way to interact with them.
795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     */
805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    AINPUT_SOURCE_SWITCH = 0x80000000,
815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
83962a108856767d6f5c17cf2854b13fef0315f8caMichael Wrightenum {
84962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    /**
85962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright     * Constants for LEDs. Hidden from the API since we don't actually expose a way to interact
86962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright     * with LEDs to developers
87962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright     *
88872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright     * NOTE: If you add LEDs here, you must also add them to InputEventLabels.h
89962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright     */
90962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright
91962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_NUM_LOCK = 0x00,
92962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_CAPS_LOCK = 0x01,
93962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_SCROLL_LOCK = 0x02,
94962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_COMPOSE = 0x03,
95962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_KANA = 0x04,
96962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_SLEEP = 0x05,
97962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_SUSPEND = 0x06,
98962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_MUTE = 0x07,
99962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_MISC = 0x08,
100962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_MAIL = 0x09,
101962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_CHARGING = 0x0a,
102962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_CONTROLLER_1 = 0x10,
103962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_CONTROLLER_2 = 0x11,
104962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_CONTROLLER_3 = 0x12,
105962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    ALED_CONTROLLER_4 = 0x13,
106962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright};
107962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright
1089b04f860f23481d39c3b45379a324d3630966825Michael Wright/* Maximum number of controller LEDs we support */
1099b04f860f23481d39c3b45379a324d3630966825Michael Wright#define MAX_CONTROLLER_LEDS 4
1109b04f860f23481d39c3b45379a324d3630966825Michael Wright
1115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * SystemUiVisibility constants from View.
1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
1145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownenum {
1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE = 0,
1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN = 0x00000001,
1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
1205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Maximum number of pointers supported per motion event.
1215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Smallest number of pointers is 1.
1225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * (We want at least 10 but some touch controllers obstensibly configured for 10 pointers
1235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * will occasionally emit 11.  There is not much harm making this constant bigger.)
1245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
1255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define MAX_POINTERS 16
1265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
128552a8a5d8df32f659b8d11311a244cdc6d3b7733Flanker * Maximum number of samples supported per motion event.
129552a8a5d8df32f659b8d11311a244cdc6d3b7733Flanker */
130552a8a5d8df32f659b8d11311a244cdc6d3b7733Flanker#define MAX_SAMPLES UINT16_MAX
131552a8a5d8df32f659b8d11311a244cdc6d3b7733Flanker
132552a8a5d8df32f659b8d11311a244cdc6d3b7733Flanker/*
1335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Maximum pointer id value supported in a motion event.
1345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Smallest pointer id is 0.
1355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * (This is limited by our use of BitSet32 to track pointer assignments.)
1365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
1375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define MAX_POINTER_ID 31
1385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
1405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Declare a concrete type for the NDK's input event forward declaration.
1415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
1425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct AInputEvent {
1435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual ~AInputEvent() { }
1445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
1475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Declare a concrete type for the NDK's input device forward declaration.
1485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
1495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct AInputDevice {
1505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual ~AInputDevice() { }
1515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android {
1555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1566071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifdef __ANDROID__
1575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass Parcel;
1585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif
1595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
1615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Flags that flow alongside events in the input dispatch system to help with certain
1625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * policy decisions such as waking from device sleep.
1635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
1645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java.
1655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
1665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownenum {
1675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* These flags originate in RawEvents and are generally set in the key map.
168872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright     * NOTE: If you want a flag to be able to set in a keylayout file, then you must add it to
169872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright     * InputEventLabels.h as well. */
1705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
171c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    // Indicates that the event should wake the device.
1725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    POLICY_FLAG_WAKE = 0x00000001,
173c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown
174c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    // Indicates that the key is virtual, such as a capacitive button, and should
175c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    // generate haptic feedback.  Virtual keys may be suppressed for some time
176c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    // after a recent touch to prevent accidental activation of virtual keys adjacent
177c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    // to the touch screen during an edge swipe.
178872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright    POLICY_FLAG_VIRTUAL = 0x00000002,
179c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown
180c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    // Indicates that the key is the special function modifier.
181872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright    POLICY_FLAG_FUNCTION = 0x00000004,
1825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
183c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    // Indicates that the key represents a special gesture that has been detected by
184c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    // the touch firmware or driver.  Causes touch events from the same device to be canceled.
185c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    POLICY_FLAG_GESTURE = 0x00000008,
186c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown
1875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    POLICY_FLAG_RAW_MASK = 0x0000ffff,
1885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* These flags are set by the input dispatcher. */
1905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Indicates that the input event was injected.
1925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    POLICY_FLAG_INJECTED = 0x01000000,
1935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Indicates that the input event is from a trusted source such as a directly attached
1955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // input device or an application with system-wide event injection permission.
1965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    POLICY_FLAG_TRUSTED = 0x02000000,
1975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Indicates that the input event has passed through an input filter.
1995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    POLICY_FLAG_FILTERED = 0x04000000,
2005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Disables automatic key repeating behavior.
2025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    POLICY_FLAG_DISABLE_KEY_REPEAT = 0x08000000,
2035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* These flags are set by the input reader policy as it intercepts each event. */
2055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
206db19e463fe5a4e00a0214c564527ba67f31e1afbJeff Brown    // Indicates that the device was in an interactive state when the
207db19e463fe5a4e00a0214c564527ba67f31e1afbJeff Brown    // event was intercepted.
208db19e463fe5a4e00a0214c564527ba67f31e1afbJeff Brown    POLICY_FLAG_INTERACTIVE = 0x20000000,
2095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Indicates that the event should be dispatched to applications.
2115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The input event should still be sent to the InputDispatcher so that it can see all
2125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // input events received include those that it will not deliver.
2135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    POLICY_FLAG_PASS_TO_USER = 0x40000000,
2145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
2175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Pointer coordinate data.
2185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
2195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct PointerCoords {
2208f6710fdeb96a3482adf1a6a2d46d67b0ce8e9dbMichael Wright    enum { MAX_AXES = 30 }; // 30 so that sizeof(PointerCoords) == 128
2215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Bitfield of axes that are present in this structure.
22383e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin    uint64_t bits __attribute__((aligned(8)));
2245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Values of axes that are stored in this structure packed in order by axis id
2265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // for each axis that is present in the structure according to 'bits'.
2275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float values[MAX_AXES];
2285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline void clear() {
230d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright        BitSet64::clear(bits);
231d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright    }
232d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright
233d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright    bool isEmpty() const {
234d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright        return BitSet64::isEmpty(bits);
2355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float getAxisValue(int32_t axis) const;
2385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t setAxisValue(int32_t axis, float value);
2395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void scale(float scale);
241ed4d28dd70448b13eb74a3166ec8d1c1a530e2d4Jeff Brown    void applyOffset(float xOffset, float yOffset);
2425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getX() const {
2445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_X);
2455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getY() const {
2485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_Y);
2495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2516071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifdef __ANDROID__
2525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t readFromParcel(Parcel* parcel);
2535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t writeToParcel(Parcel* parcel) const;
2545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif
2555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool operator==(const PointerCoords& other) const;
2575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline bool operator!=(const PointerCoords& other) const {
2585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return !(*this == other);
2595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void copyFrom(const PointerCoords& other);
2625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate:
2645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void tooManyAxes(int axis);
2655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
2685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Pointer property data.
2695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
2705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct PointerProperties {
2715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The id of the pointer.
2725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t id;
2735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The pointer tool type.
2755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t toolType;
2765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline void clear() {
2785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        id = -1;
2795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        toolType = 0;
2805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool operator==(const PointerProperties& other) const;
2835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline bool operator!=(const PointerProperties& other) const {
2845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return !(*this == other);
2855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void copyFrom(const PointerProperties& other);
2885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
2915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Input events.
2925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
2935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass InputEvent : public AInputEvent {
2945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
2955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual ~InputEvent() { }
2965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual int32_t getType() const = 0;
2985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getDeviceId() const { return mDeviceId; }
3005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getSource() const { return mSource; }
3025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline void setSource(int32_t source) { mSource = source; }
3045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected:
3065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void initialize(int32_t deviceId, int32_t source);
3075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void initialize(const InputEvent& from);
3085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mDeviceId;
3105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mSource;
3115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
3125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
3145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Key events.
3155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
3165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyEvent : public InputEvent {
3175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
3185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual ~KeyEvent() { }
3195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; }
3215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getAction() const { return mAction; }
3235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getFlags() const { return mFlags; }
3255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline void setFlags(int32_t flags) { mFlags = flags; }
3275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getKeyCode() const { return mKeyCode; }
3295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getScanCode() const { return mScanCode; }
3315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getMetaState() const { return mMetaState; }
3335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getRepeatCount() const { return mRepeatCount; }
3355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline nsecs_t getDownTime() const { return mDownTime; }
3375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline nsecs_t getEventTime() const { return mEventTime; }
3395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
340872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright    static const char* getLabel(int32_t keyCode);
341872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright    static int32_t getKeyCodeFromLabel(const char* label);
3425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void initialize(
3445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t deviceId,
3455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t source,
3465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t action,
3475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t flags,
3485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t keyCode,
3495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t scanCode,
3505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t metaState,
3515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t repeatCount,
3525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            nsecs_t downTime,
3535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            nsecs_t eventTime);
3545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void initialize(const KeyEvent& from);
3555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected:
3575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mAction;
3585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mFlags;
3595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mKeyCode;
3605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mScanCode;
3615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mMetaState;
3625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mRepeatCount;
3635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    nsecs_t mDownTime;
3645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    nsecs_t mEventTime;
3655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
3665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
3685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Motion events.
3695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
3705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass MotionEvent : public InputEvent {
3715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
3725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual ~MotionEvent() { }
3735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; }
3755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getAction() const { return mAction; }
3775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getActionMasked() const { return mAction & AMOTION_EVENT_ACTION_MASK; }
3795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getActionIndex() const {
3815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return (mAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
3825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
3835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
3845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline void setAction(int32_t action) { mAction = action; }
3865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getFlags() const { return mFlags; }
3885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline void setFlags(int32_t flags) { mFlags = flags; }
3905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getEdgeFlags() const { return mEdgeFlags; }
3925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; }
3945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getMetaState() const { return mMetaState; }
3965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline void setMetaState(int32_t metaState) { mMetaState = metaState; }
3985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getButtonState() const { return mButtonState; }
4005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4017b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright    inline int32_t setButtonState(int32_t buttonState) { mButtonState = buttonState; }
4027b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright
4037b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright    inline int32_t getActionButton() const { return mActionButton; }
4047b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright
40521957b9c6d731dc67067e702c644dc7f4c4ff48dMichael Wright    inline void setActionButton(int32_t button) { mActionButton = button; }
40621957b9c6d731dc67067e702c644dc7f4c4ff48dMichael Wright
4075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getXOffset() const { return mXOffset; }
4085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getYOffset() const { return mYOffset; }
4105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getXPrecision() const { return mXPrecision; }
4125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getYPrecision() const { return mYPrecision; }
4145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline nsecs_t getDownTime() const { return mDownTime; }
4165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline void setDownTime(nsecs_t downTime) { mDownTime = downTime; }
4185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline size_t getPointerCount() const { return mPointerProperties.size(); }
4205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline const PointerProperties* getPointerProperties(size_t pointerIndex) const {
4225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return &mPointerProperties[pointerIndex];
4235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getPointerId(size_t pointerIndex) const {
4265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return mPointerProperties[pointerIndex].id;
4275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline int32_t getToolType(size_t pointerIndex) const {
4305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return mPointerProperties[pointerIndex].toolType;
4315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; }
4345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const PointerCoords* getRawPointerCoords(size_t pointerIndex) const;
4365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float getRawAxisValue(int32_t axis, size_t pointerIndex) const;
4385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getRawX(size_t pointerIndex) const {
4405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
4415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getRawY(size_t pointerIndex) const {
4445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getRawAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
4455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float getAxisValue(int32_t axis, size_t pointerIndex) const;
4485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getX(size_t pointerIndex) const {
4505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
4515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getY(size_t pointerIndex) const {
4545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
4555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getPressure(size_t pointerIndex) const {
4585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex);
4595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getSize(size_t pointerIndex) const {
4625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex);
4635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getTouchMajor(size_t pointerIndex) const {
4665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex);
4675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getTouchMinor(size_t pointerIndex) const {
4705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex);
4715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getToolMajor(size_t pointerIndex) const {
4745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex);
4755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getToolMinor(size_t pointerIndex) const {
4785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex);
4795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getOrientation(size_t pointerIndex) const {
4825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex);
4835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; }
4865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const {
4885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return mSampleEventTimes[historicalIndex];
4895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
4905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const PointerCoords* getHistoricalRawPointerCoords(
4925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            size_t pointerIndex, size_t historicalIndex) const;
4935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex,
4955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            size_t historicalIndex) const;
4965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const {
4985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalRawAxisValue(
4995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
5005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const {
5035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalRawAxisValue(
5045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
5055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float getHistoricalAxisValue(int32_t axis, size_t pointerIndex, size_t historicalIndex) const;
5085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const {
5105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalAxisValue(
5115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
5125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const {
5155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalAxisValue(
5165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
5175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const {
5205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalAxisValue(
5215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex);
5225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const {
5255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalAxisValue(
5265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex);
5275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const {
5305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalAxisValue(
5315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex);
5325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const {
5355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalAxisValue(
5365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex);
5375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const {
5405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalAxisValue(
5415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex);
5425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const {
5455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalAxisValue(
5465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex);
5475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const {
5505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return getHistoricalAxisValue(
5515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex, historicalIndex);
5525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ssize_t findPointerIndex(int32_t pointerId) const;
5555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void initialize(
5575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t deviceId,
5585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t source,
5595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t action,
5607b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            int32_t actionButton,
5615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t flags,
5625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t edgeFlags,
5635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t metaState,
5645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t buttonState,
5655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            float xOffset,
5665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            float yOffset,
5675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            float xPrecision,
5685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            float yPrecision,
5695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            nsecs_t downTime,
5705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            nsecs_t eventTime,
5715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            size_t pointerCount,
5725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const PointerProperties* pointerProperties,
5735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const PointerCoords* pointerCoords);
5745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void copyFrom(const MotionEvent* other, bool keepHistory);
5765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void addSample(
5785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            nsecs_t eventTime,
5795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const PointerCoords* pointerCoords);
5805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void offsetLocation(float xOffset, float yOffset);
5825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void scale(float scaleFactor);
5845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5855a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    // Apply 3x3 perspective matrix transformation.
5865a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    // Matrix is in row-major form and compatible with SkMatrix.
5875a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown    void transform(const float matrix[9]);
5885a2f68e5a5526ba80b5192776e2f0e349626777dJeff Brown
5896071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifdef __ANDROID__
5905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t readFromParcel(Parcel* parcel);
5915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t writeToParcel(Parcel* parcel) const;
5925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif
5935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static bool isTouchEvent(int32_t source, int32_t action);
5955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline bool isTouchEvent() const {
5965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return isTouchEvent(mSource, mAction);
5975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Low-level accessors.
6005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline const PointerProperties* getPointerProperties() const {
6015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return mPointerProperties.array();
6025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
6035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); }
6045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline const PointerCoords* getSamplePointerCoords() const {
6055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            return mSamplePointerCoords.array();
6065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
6075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
608872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright    static const char* getLabel(int32_t axis);
609872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright    static int32_t getAxisFromLabel(const char* label);
610872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright
6115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected:
6125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mAction;
6137b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright    int32_t mActionButton;
6145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mFlags;
6155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mEdgeFlags;
6165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mMetaState;
6175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t mButtonState;
6185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float mXOffset;
6195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float mYOffset;
6205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float mXPrecision;
6215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float mYPrecision;
6225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    nsecs_t mDownTime;
6235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Vector<PointerProperties> mPointerProperties;
6245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Vector<nsecs_t> mSampleEventTimes;
6255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Vector<PointerCoords> mSamplePointerCoords;
6265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
6275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
6295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Input event factory.
6305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
6315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass InputEventFactoryInterface {
6325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected:
6335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual ~InputEventFactoryInterface() { }
6345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
6365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    InputEventFactoryInterface() { }
6375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual KeyEvent* createKeyEvent() = 0;
6395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual MotionEvent* createMotionEvent() = 0;
6405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
6415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
6435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * A simple input event factory implementation that uses a single preallocated instance
6445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * of each type of input event that are reused for each request.
6455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
6465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass PreallocatedInputEventFactory : public InputEventFactoryInterface {
6475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
6485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PreallocatedInputEventFactory() { }
6495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual ~PreallocatedInputEventFactory() { }
6505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual KeyEvent* createKeyEvent() { return & mKeyEvent; }
6525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual MotionEvent* createMotionEvent() { return & mMotionEvent; }
6535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate:
6555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyEvent mKeyEvent;
6565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent mMotionEvent;
6575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
6585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
6605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * An input event factory implementation that maintains a pool of input events.
6615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
6625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass PooledInputEventFactory : public InputEventFactoryInterface {
6635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
6645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PooledInputEventFactory(size_t maxPoolSize = 20);
6655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual ~PooledInputEventFactory();
6665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual KeyEvent* createKeyEvent();
6685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual MotionEvent* createMotionEvent();
6695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void recycle(InputEvent* event);
6715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate:
6735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const size_t mMaxPoolSize;
6745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Vector<KeyEvent*> mKeyEventPool;
6765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Vector<MotionEvent*> mMotionEventPool;
6775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
6785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android
6805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
6815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif // _LIBINPUT_INPUT_H
682