1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _LIBINPUT_INPUT_H
18 #define _LIBINPUT_INPUT_H
19 
20 /**
21  * Native input event structures.
22  */
23 
24 #include <android/input.h>
25 #include <utils/BitSet.h>
26 #include <utils/KeyedVector.h>
27 #include <utils/RefBase.h>
28 #include <utils/String8.h>
29 #include <utils/Timers.h>
30 #include <utils/Vector.h>
31 
32 /*
33  * Additional private constants not defined in ndk/ui/input.h.
34  */
35 enum {
36     /* Signifies that the key is being predispatched */
37     AKEY_EVENT_FLAG_PREDISPATCH = 0x20000000,
38 
39     /* Private control to determine when an app is tracking a key sequence. */
40     AKEY_EVENT_FLAG_START_TRACKING = 0x40000000,
41 
42     /* Key event is inconsistent with previously sent key events. */
43     AKEY_EVENT_FLAG_TAINTED = 0x80000000,
44 };
45 
46 enum {
47     /* Motion event is inconsistent with previously sent motion events. */
48     AMOTION_EVENT_FLAG_TAINTED = 0x80000000,
49 };
50 
51 enum {
52     /* Used when a motion event is not associated with any display.
53      * Typically used for non-pointer events. */
54     ADISPLAY_ID_NONE = -1,
55 
56     /* The default display id. */
57     ADISPLAY_ID_DEFAULT = 0,
58 };
59 
60 enum {
61     /*
62      * Indicates that an input device has switches.
63      * This input source flag is hidden from the API because switches are only used by the system
64      * and applications have no way to interact with them.
65      */
66     AINPUT_SOURCE_SWITCH = 0x80000000,
67 };
68 
69 enum {
70     /**
71      * Constants for LEDs. Hidden from the API since we don't actually expose a way to interact
72      * with LEDs to developers
73      *
74      * NOTE: If you add LEDs here, you must also add them to InputEventLabels.h
75      */
76 
77     ALED_NUM_LOCK = 0x00,
78     ALED_CAPS_LOCK = 0x01,
79     ALED_SCROLL_LOCK = 0x02,
80     ALED_COMPOSE = 0x03,
81     ALED_KANA = 0x04,
82     ALED_SLEEP = 0x05,
83     ALED_SUSPEND = 0x06,
84     ALED_MUTE = 0x07,
85     ALED_MISC = 0x08,
86     ALED_MAIL = 0x09,
87     ALED_CHARGING = 0x0a,
88     ALED_CONTROLLER_1 = 0x10,
89     ALED_CONTROLLER_2 = 0x11,
90     ALED_CONTROLLER_3 = 0x12,
91     ALED_CONTROLLER_4 = 0x13,
92 };
93 
94 /* Maximum number of controller LEDs we support */
95 #define MAX_CONTROLLER_LEDS 4
96 
97 /*
98  * SystemUiVisibility constants from View.
99  */
100 enum {
101     ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE = 0,
102     ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN = 0x00000001,
103 };
104 
105 /*
106  * Maximum number of pointers supported per motion event.
107  * Smallest number of pointers is 1.
108  * (We want at least 10 but some touch controllers obstensibly configured for 10 pointers
109  * will occasionally emit 11.  There is not much harm making this constant bigger.)
110  */
111 #define MAX_POINTERS 16
112 
113 /*
114  * Maximum pointer id value supported in a motion event.
115  * Smallest pointer id is 0.
116  * (This is limited by our use of BitSet32 to track pointer assignments.)
117  */
118 #define MAX_POINTER_ID 31
119 
120 /*
121  * Declare a concrete type for the NDK's input event forward declaration.
122  */
123 struct AInputEvent {
~AInputEventAInputEvent124     virtual ~AInputEvent() { }
125 };
126 
127 /*
128  * Declare a concrete type for the NDK's input device forward declaration.
129  */
130 struct AInputDevice {
~AInputDeviceAInputDevice131     virtual ~AInputDevice() { }
132 };
133 
134 
135 namespace android {
136 
137 #ifdef HAVE_ANDROID_OS
138 class Parcel;
139 #endif
140 
141 /*
142  * Flags that flow alongside events in the input dispatch system to help with certain
143  * policy decisions such as waking from device sleep.
144  *
145  * These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java.
146  */
147 enum {
148     /* These flags originate in RawEvents and are generally set in the key map.
149      * NOTE: If you want a flag to be able to set in a keylayout file, then you must add it to
150      * InputEventLabels.h as well. */
151 
152     // Indicates that the event should wake the device.
153     POLICY_FLAG_WAKE = 0x00000001,
154 
155     // Indicates that the key is virtual, such as a capacitive button, and should
156     // generate haptic feedback.  Virtual keys may be suppressed for some time
157     // after a recent touch to prevent accidental activation of virtual keys adjacent
158     // to the touch screen during an edge swipe.
159     POLICY_FLAG_VIRTUAL = 0x00000002,
160 
161     // Indicates that the key is the special function modifier.
162     POLICY_FLAG_FUNCTION = 0x00000004,
163 
164     // Indicates that the key represents a special gesture that has been detected by
165     // the touch firmware or driver.  Causes touch events from the same device to be canceled.
166     POLICY_FLAG_GESTURE = 0x00000008,
167 
168     POLICY_FLAG_RAW_MASK = 0x0000ffff,
169 
170     /* These flags are set by the input dispatcher. */
171 
172     // Indicates that the input event was injected.
173     POLICY_FLAG_INJECTED = 0x01000000,
174 
175     // Indicates that the input event is from a trusted source such as a directly attached
176     // input device or an application with system-wide event injection permission.
177     POLICY_FLAG_TRUSTED = 0x02000000,
178 
179     // Indicates that the input event has passed through an input filter.
180     POLICY_FLAG_FILTERED = 0x04000000,
181 
182     // Disables automatic key repeating behavior.
183     POLICY_FLAG_DISABLE_KEY_REPEAT = 0x08000000,
184 
185     /* These flags are set by the input reader policy as it intercepts each event. */
186 
187     // Indicates that the device was in an interactive state when the
188     // event was intercepted.
189     POLICY_FLAG_INTERACTIVE = 0x20000000,
190 
191     // Indicates that the event should be dispatched to applications.
192     // The input event should still be sent to the InputDispatcher so that it can see all
193     // input events received include those that it will not deliver.
194     POLICY_FLAG_PASS_TO_USER = 0x40000000,
195 };
196 
197 /*
198  * Pointer coordinate data.
199  */
200 struct PointerCoords {
201     enum { MAX_AXES = 30 }; // 30 so that sizeof(PointerCoords) == 128
202 
203     // Bitfield of axes that are present in this structure.
204     uint64_t bits __attribute__((aligned(8)));
205 
206     // Values of axes that are stored in this structure packed in order by axis id
207     // for each axis that is present in the structure according to 'bits'.
208     float values[MAX_AXES];
209 
clearPointerCoords210     inline void clear() {
211         BitSet64::clear(bits);
212     }
213 
isEmptyPointerCoords214     bool isEmpty() const {
215         return BitSet64::isEmpty(bits);
216     }
217 
218     float getAxisValue(int32_t axis) const;
219     status_t setAxisValue(int32_t axis, float value);
220 
221     void scale(float scale);
222     void applyOffset(float xOffset, float yOffset);
223 
getXPointerCoords224     inline float getX() const {
225         return getAxisValue(AMOTION_EVENT_AXIS_X);
226     }
227 
getYPointerCoords228     inline float getY() const {
229         return getAxisValue(AMOTION_EVENT_AXIS_Y);
230     }
231 
232 #ifdef HAVE_ANDROID_OS
233     status_t readFromParcel(Parcel* parcel);
234     status_t writeToParcel(Parcel* parcel) const;
235 #endif
236 
237     bool operator==(const PointerCoords& other) const;
238     inline bool operator!=(const PointerCoords& other) const {
239         return !(*this == other);
240     }
241 
242     void copyFrom(const PointerCoords& other);
243 
244 private:
245     void tooManyAxes(int axis);
246 };
247 
248 /*
249  * Pointer property data.
250  */
251 struct PointerProperties {
252     // The id of the pointer.
253     int32_t id;
254 
255     // The pointer tool type.
256     int32_t toolType;
257 
clearPointerProperties258     inline void clear() {
259         id = -1;
260         toolType = 0;
261     }
262 
263     bool operator==(const PointerProperties& other) const;
264     inline bool operator!=(const PointerProperties& other) const {
265         return !(*this == other);
266     }
267 
268     void copyFrom(const PointerProperties& other);
269 };
270 
271 /*
272  * Input events.
273  */
274 class InputEvent : public AInputEvent {
275 public:
~InputEvent()276     virtual ~InputEvent() { }
277 
278     virtual int32_t getType() const = 0;
279 
getDeviceId()280     inline int32_t getDeviceId() const { return mDeviceId; }
281 
getSource()282     inline int32_t getSource() const { return mSource; }
283 
setSource(int32_t source)284     inline void setSource(int32_t source) { mSource = source; }
285 
286 protected:
287     void initialize(int32_t deviceId, int32_t source);
288     void initialize(const InputEvent& from);
289 
290     int32_t mDeviceId;
291     int32_t mSource;
292 };
293 
294 /*
295  * Key events.
296  */
297 class KeyEvent : public InputEvent {
298 public:
~KeyEvent()299     virtual ~KeyEvent() { }
300 
getType()301     virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; }
302 
getAction()303     inline int32_t getAction() const { return mAction; }
304 
getFlags()305     inline int32_t getFlags() const { return mFlags; }
306 
setFlags(int32_t flags)307     inline void setFlags(int32_t flags) { mFlags = flags; }
308 
getKeyCode()309     inline int32_t getKeyCode() const { return mKeyCode; }
310 
getScanCode()311     inline int32_t getScanCode() const { return mScanCode; }
312 
getMetaState()313     inline int32_t getMetaState() const { return mMetaState; }
314 
getRepeatCount()315     inline int32_t getRepeatCount() const { return mRepeatCount; }
316 
getDownTime()317     inline nsecs_t getDownTime() const { return mDownTime; }
318 
getEventTime()319     inline nsecs_t getEventTime() const { return mEventTime; }
320 
321     static const char* getLabel(int32_t keyCode);
322     static int32_t getKeyCodeFromLabel(const char* label);
323 
324     void initialize(
325             int32_t deviceId,
326             int32_t source,
327             int32_t action,
328             int32_t flags,
329             int32_t keyCode,
330             int32_t scanCode,
331             int32_t metaState,
332             int32_t repeatCount,
333             nsecs_t downTime,
334             nsecs_t eventTime);
335     void initialize(const KeyEvent& from);
336 
337 protected:
338     int32_t mAction;
339     int32_t mFlags;
340     int32_t mKeyCode;
341     int32_t mScanCode;
342     int32_t mMetaState;
343     int32_t mRepeatCount;
344     nsecs_t mDownTime;
345     nsecs_t mEventTime;
346 };
347 
348 /*
349  * Motion events.
350  */
351 class MotionEvent : public InputEvent {
352 public:
~MotionEvent()353     virtual ~MotionEvent() { }
354 
getType()355     virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; }
356 
getAction()357     inline int32_t getAction() const { return mAction; }
358 
getActionMasked()359     inline int32_t getActionMasked() const { return mAction & AMOTION_EVENT_ACTION_MASK; }
360 
getActionIndex()361     inline int32_t getActionIndex() const {
362         return (mAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
363                 >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
364     }
365 
setAction(int32_t action)366     inline void setAction(int32_t action) { mAction = action; }
367 
getFlags()368     inline int32_t getFlags() const { return mFlags; }
369 
setFlags(int32_t flags)370     inline void setFlags(int32_t flags) { mFlags = flags; }
371 
getEdgeFlags()372     inline int32_t getEdgeFlags() const { return mEdgeFlags; }
373 
setEdgeFlags(int32_t edgeFlags)374     inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; }
375 
getMetaState()376     inline int32_t getMetaState() const { return mMetaState; }
377 
setMetaState(int32_t metaState)378     inline void setMetaState(int32_t metaState) { mMetaState = metaState; }
379 
getButtonState()380     inline int32_t getButtonState() const { return mButtonState; }
381 
setButtonState(int32_t buttonState)382     inline int32_t setButtonState(int32_t buttonState) { mButtonState = buttonState; }
383 
getActionButton()384     inline int32_t getActionButton() const { return mActionButton; }
385 
setActionButton(int32_t button)386     inline void setActionButton(int32_t button) { mActionButton = button; }
387 
getXOffset()388     inline float getXOffset() const { return mXOffset; }
389 
getYOffset()390     inline float getYOffset() const { return mYOffset; }
391 
getXPrecision()392     inline float getXPrecision() const { return mXPrecision; }
393 
getYPrecision()394     inline float getYPrecision() const { return mYPrecision; }
395 
getDownTime()396     inline nsecs_t getDownTime() const { return mDownTime; }
397 
setDownTime(nsecs_t downTime)398     inline void setDownTime(nsecs_t downTime) { mDownTime = downTime; }
399 
getPointerCount()400     inline size_t getPointerCount() const { return mPointerProperties.size(); }
401 
getPointerProperties(size_t pointerIndex)402     inline const PointerProperties* getPointerProperties(size_t pointerIndex) const {
403         return &mPointerProperties[pointerIndex];
404     }
405 
getPointerId(size_t pointerIndex)406     inline int32_t getPointerId(size_t pointerIndex) const {
407         return mPointerProperties[pointerIndex].id;
408     }
409 
getToolType(size_t pointerIndex)410     inline int32_t getToolType(size_t pointerIndex) const {
411         return mPointerProperties[pointerIndex].toolType;
412     }
413 
getEventTime()414     inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; }
415 
416     const PointerCoords* getRawPointerCoords(size_t pointerIndex) const;
417 
418     float getRawAxisValue(int32_t axis, size_t pointerIndex) const;
419 
getRawX(size_t pointerIndex)420     inline float getRawX(size_t pointerIndex) const {
421         return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
422     }
423 
getRawY(size_t pointerIndex)424     inline float getRawY(size_t pointerIndex) const {
425         return getRawAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
426     }
427 
428     float getAxisValue(int32_t axis, size_t pointerIndex) const;
429 
getX(size_t pointerIndex)430     inline float getX(size_t pointerIndex) const {
431         return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
432     }
433 
getY(size_t pointerIndex)434     inline float getY(size_t pointerIndex) const {
435         return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
436     }
437 
getPressure(size_t pointerIndex)438     inline float getPressure(size_t pointerIndex) const {
439         return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex);
440     }
441 
getSize(size_t pointerIndex)442     inline float getSize(size_t pointerIndex) const {
443         return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex);
444     }
445 
getTouchMajor(size_t pointerIndex)446     inline float getTouchMajor(size_t pointerIndex) const {
447         return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex);
448     }
449 
getTouchMinor(size_t pointerIndex)450     inline float getTouchMinor(size_t pointerIndex) const {
451         return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex);
452     }
453 
getToolMajor(size_t pointerIndex)454     inline float getToolMajor(size_t pointerIndex) const {
455         return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex);
456     }
457 
getToolMinor(size_t pointerIndex)458     inline float getToolMinor(size_t pointerIndex) const {
459         return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex);
460     }
461 
getOrientation(size_t pointerIndex)462     inline float getOrientation(size_t pointerIndex) const {
463         return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex);
464     }
465 
getHistorySize()466     inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; }
467 
getHistoricalEventTime(size_t historicalIndex)468     inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const {
469         return mSampleEventTimes[historicalIndex];
470     }
471 
472     const PointerCoords* getHistoricalRawPointerCoords(
473             size_t pointerIndex, size_t historicalIndex) const;
474 
475     float getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex,
476             size_t historicalIndex) const;
477 
getHistoricalRawX(size_t pointerIndex,size_t historicalIndex)478     inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const {
479         return getHistoricalRawAxisValue(
480                 AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
481     }
482 
getHistoricalRawY(size_t pointerIndex,size_t historicalIndex)483     inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const {
484         return getHistoricalRawAxisValue(
485                 AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
486     }
487 
488     float getHistoricalAxisValue(int32_t axis, size_t pointerIndex, size_t historicalIndex) const;
489 
getHistoricalX(size_t pointerIndex,size_t historicalIndex)490     inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const {
491         return getHistoricalAxisValue(
492                 AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
493     }
494 
getHistoricalY(size_t pointerIndex,size_t historicalIndex)495     inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const {
496         return getHistoricalAxisValue(
497                 AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
498     }
499 
getHistoricalPressure(size_t pointerIndex,size_t historicalIndex)500     inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const {
501         return getHistoricalAxisValue(
502                 AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex);
503     }
504 
getHistoricalSize(size_t pointerIndex,size_t historicalIndex)505     inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const {
506         return getHistoricalAxisValue(
507                 AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex);
508     }
509 
getHistoricalTouchMajor(size_t pointerIndex,size_t historicalIndex)510     inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const {
511         return getHistoricalAxisValue(
512                 AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex);
513     }
514 
getHistoricalTouchMinor(size_t pointerIndex,size_t historicalIndex)515     inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const {
516         return getHistoricalAxisValue(
517                 AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex);
518     }
519 
getHistoricalToolMajor(size_t pointerIndex,size_t historicalIndex)520     inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const {
521         return getHistoricalAxisValue(
522                 AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex);
523     }
524 
getHistoricalToolMinor(size_t pointerIndex,size_t historicalIndex)525     inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const {
526         return getHistoricalAxisValue(
527                 AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex);
528     }
529 
getHistoricalOrientation(size_t pointerIndex,size_t historicalIndex)530     inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const {
531         return getHistoricalAxisValue(
532                 AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex, historicalIndex);
533     }
534 
535     ssize_t findPointerIndex(int32_t pointerId) const;
536 
537     void initialize(
538             int32_t deviceId,
539             int32_t source,
540             int32_t action,
541             int32_t actionButton,
542             int32_t flags,
543             int32_t edgeFlags,
544             int32_t metaState,
545             int32_t buttonState,
546             float xOffset,
547             float yOffset,
548             float xPrecision,
549             float yPrecision,
550             nsecs_t downTime,
551             nsecs_t eventTime,
552             size_t pointerCount,
553             const PointerProperties* pointerProperties,
554             const PointerCoords* pointerCoords);
555 
556     void copyFrom(const MotionEvent* other, bool keepHistory);
557 
558     void addSample(
559             nsecs_t eventTime,
560             const PointerCoords* pointerCoords);
561 
562     void offsetLocation(float xOffset, float yOffset);
563 
564     void scale(float scaleFactor);
565 
566     // Apply 3x3 perspective matrix transformation.
567     // Matrix is in row-major form and compatible with SkMatrix.
568     void transform(const float matrix[9]);
569 
570 #ifdef HAVE_ANDROID_OS
571     status_t readFromParcel(Parcel* parcel);
572     status_t writeToParcel(Parcel* parcel) const;
573 #endif
574 
575     static bool isTouchEvent(int32_t source, int32_t action);
isTouchEvent()576     inline bool isTouchEvent() const {
577         return isTouchEvent(mSource, mAction);
578     }
579 
580     // Low-level accessors.
getPointerProperties()581     inline const PointerProperties* getPointerProperties() const {
582         return mPointerProperties.array();
583     }
getSampleEventTimes()584     inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); }
getSamplePointerCoords()585     inline const PointerCoords* getSamplePointerCoords() const {
586             return mSamplePointerCoords.array();
587     }
588 
589     static const char* getLabel(int32_t axis);
590     static int32_t getAxisFromLabel(const char* label);
591 
592 protected:
593     int32_t mAction;
594     int32_t mActionButton;
595     int32_t mFlags;
596     int32_t mEdgeFlags;
597     int32_t mMetaState;
598     int32_t mButtonState;
599     float mXOffset;
600     float mYOffset;
601     float mXPrecision;
602     float mYPrecision;
603     nsecs_t mDownTime;
604     Vector<PointerProperties> mPointerProperties;
605     Vector<nsecs_t> mSampleEventTimes;
606     Vector<PointerCoords> mSamplePointerCoords;
607 };
608 
609 /*
610  * Input event factory.
611  */
612 class InputEventFactoryInterface {
613 protected:
~InputEventFactoryInterface()614     virtual ~InputEventFactoryInterface() { }
615 
616 public:
InputEventFactoryInterface()617     InputEventFactoryInterface() { }
618 
619     virtual KeyEvent* createKeyEvent() = 0;
620     virtual MotionEvent* createMotionEvent() = 0;
621 };
622 
623 /*
624  * A simple input event factory implementation that uses a single preallocated instance
625  * of each type of input event that are reused for each request.
626  */
627 class PreallocatedInputEventFactory : public InputEventFactoryInterface {
628 public:
PreallocatedInputEventFactory()629     PreallocatedInputEventFactory() { }
~PreallocatedInputEventFactory()630     virtual ~PreallocatedInputEventFactory() { }
631 
createKeyEvent()632     virtual KeyEvent* createKeyEvent() { return & mKeyEvent; }
createMotionEvent()633     virtual MotionEvent* createMotionEvent() { return & mMotionEvent; }
634 
635 private:
636     KeyEvent mKeyEvent;
637     MotionEvent mMotionEvent;
638 };
639 
640 /*
641  * An input event factory implementation that maintains a pool of input events.
642  */
643 class PooledInputEventFactory : public InputEventFactoryInterface {
644 public:
645     PooledInputEventFactory(size_t maxPoolSize = 20);
646     virtual ~PooledInputEventFactory();
647 
648     virtual KeyEvent* createKeyEvent();
649     virtual MotionEvent* createMotionEvent();
650 
651     void recycle(InputEvent* event);
652 
653 private:
654     const size_t mMaxPoolSize;
655 
656     Vector<KeyEvent*> mKeyEventPool;
657     Vector<MotionEvent*> mMotionEventPool;
658 };
659 
660 } // namespace android
661 
662 #endif // _LIBINPUT_INPUT_H
663