~mir-team/mir/in-process-egl+input-conglomeration

« back to all changes in this revision

Viewing changes to 3rd_party/android-input/android_pristine/frameworks/base/include/androidfw/Input.h

Merged trunk and fixed issues

Show diffs side-by-side

added added

removed removed

Lines of Context:
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 _ANDROIDFW_INPUT_H
18
 
#define _ANDROIDFW_INPUT_H
19
 
 
20
 
/**
21
 
 * Native input event structures.
22
 
 */
23
 
 
24
 
#include <android/input.h>
25
 
#include <utils/Vector.h>
26
 
#include <utils/KeyedVector.h>
27
 
#include <utils/Timers.h>
28
 
#include <utils/RefBase.h>
29
 
#include <utils/String8.h>
30
 
 
31
 
#ifdef HAVE_ANDROID_OS
32
 
class SkMatrix;
33
 
#endif
34
 
 
35
 
/*
36
 
 * Additional private constants not defined in ndk/ui/input.h.
37
 
 */
38
 
enum {
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
 
    /*
53
 
     * Indicates that an input device has switches.
54
 
     * This input source flag is hidden from the API because switches are only used by the system
55
 
     * and applications have no way to interact with them.
56
 
     */
57
 
    AINPUT_SOURCE_SWITCH = 0x80000000,
58
 
};
59
 
 
60
 
/*
61
 
 * SystemUiVisibility constants from View.
62
 
 */
63
 
enum {
64
 
    ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE = 0,
65
 
    ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN = 0x00000001,
66
 
};
67
 
 
68
 
/*
69
 
 * Maximum number of pointers supported per motion event.
70
 
 * Smallest number of pointers is 1.
71
 
 * (We want at least 10 but some touch controllers obstensibly configured for 10 pointers
72
 
 * will occasionally emit 11.  There is not much harm making this constant bigger.)
73
 
 */
74
 
#define MAX_POINTERS 16
75
 
 
76
 
/*
77
 
 * Maximum pointer id value supported in a motion event.
78
 
 * Smallest pointer id is 0.
79
 
 * (This is limited by our use of BitSet32 to track pointer assignments.)
80
 
 */
81
 
#define MAX_POINTER_ID 31
82
 
 
83
 
/*
84
 
 * Declare a concrete type for the NDK's input event forward declaration.
85
 
 */
86
 
struct AInputEvent {
87
 
    virtual ~AInputEvent() { }
88
 
};
89
 
 
90
 
/*
91
 
 * Declare a concrete type for the NDK's input device forward declaration.
92
 
 */
93
 
struct AInputDevice {
94
 
    virtual ~AInputDevice() { }
95
 
};
96
 
 
97
 
 
98
 
namespace android {
99
 
 
100
 
#ifdef HAVE_ANDROID_OS
101
 
class Parcel;
102
 
#endif
103
 
 
104
 
/*
105
 
 * Flags that flow alongside events in the input dispatch system to help with certain
106
 
 * policy decisions such as waking from device sleep.
107
 
 *
108
 
 * These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java.
109
 
 */
110
 
enum {
111
 
    /* These flags originate in RawEvents and are generally set in the key map.
112
 
     * NOTE: If you edit these flags, also edit labels in KeycodeLabels.h. */
113
 
 
114
 
    POLICY_FLAG_WAKE = 0x00000001,
115
 
    POLICY_FLAG_WAKE_DROPPED = 0x00000002,
116
 
    POLICY_FLAG_SHIFT = 0x00000004,
117
 
    POLICY_FLAG_CAPS_LOCK = 0x00000008,
118
 
    POLICY_FLAG_ALT = 0x00000010,
119
 
    POLICY_FLAG_ALT_GR = 0x00000020,
120
 
    POLICY_FLAG_MENU = 0x00000040,
121
 
    POLICY_FLAG_LAUNCHER = 0x00000080,
122
 
    POLICY_FLAG_VIRTUAL = 0x00000100,
123
 
    POLICY_FLAG_FUNCTION = 0x00000200,
124
 
 
125
 
    POLICY_FLAG_RAW_MASK = 0x0000ffff,
126
 
 
127
 
    /* These flags are set by the input dispatcher. */
128
 
 
129
 
    // Indicates that the input event was injected.
130
 
    POLICY_FLAG_INJECTED = 0x01000000,
131
 
 
132
 
    // Indicates that the input event is from a trusted source such as a directly attached
133
 
    // input device or an application with system-wide event injection permission.
134
 
    POLICY_FLAG_TRUSTED = 0x02000000,
135
 
 
136
 
    // Indicates that the input event has passed through an input filter.
137
 
    POLICY_FLAG_FILTERED = 0x04000000,
138
 
 
139
 
    // Disables automatic key repeating behavior.
140
 
    POLICY_FLAG_DISABLE_KEY_REPEAT = 0x08000000,
141
 
 
142
 
    /* These flags are set by the input reader policy as it intercepts each event. */
143
 
 
144
 
    // Indicates that the screen was off when the event was received and the event
145
 
    // should wake the device.
146
 
    POLICY_FLAG_WOKE_HERE = 0x10000000,
147
 
 
148
 
    // Indicates that the screen was dim when the event was received and the event
149
 
    // should brighten the device.
150
 
    POLICY_FLAG_BRIGHT_HERE = 0x20000000,
151
 
 
152
 
    // Indicates that the event should be dispatched to applications.
153
 
    // The input event should still be sent to the InputDispatcher so that it can see all
154
 
    // input events received include those that it will not deliver.
155
 
    POLICY_FLAG_PASS_TO_USER = 0x40000000,
156
 
};
157
 
 
158
 
/*
159
 
 * Pointer coordinate data.
160
 
 */
161
 
struct PointerCoords {
162
 
    enum { MAX_AXES = 14 }; // 14 so that sizeof(PointerCoords) == 64
163
 
 
164
 
    // Bitfield of axes that are present in this structure.
165
 
    uint64_t bits;
166
 
 
167
 
    // Values of axes that are stored in this structure packed in order by axis id
168
 
    // for each axis that is present in the structure according to 'bits'.
169
 
    float values[MAX_AXES];
170
 
 
171
 
    inline void clear() {
172
 
        bits = 0;
173
 
    }
174
 
 
175
 
    float getAxisValue(int32_t axis) const;
176
 
    status_t setAxisValue(int32_t axis, float value);
177
 
 
178
 
    void scale(float scale);
179
 
 
180
 
    inline float getX() const {
181
 
        return getAxisValue(AMOTION_EVENT_AXIS_X);
182
 
    }
183
 
 
184
 
    inline float getY() const {
185
 
        return getAxisValue(AMOTION_EVENT_AXIS_Y);
186
 
    }
187
 
 
188
 
#ifdef HAVE_ANDROID_OS
189
 
    status_t readFromParcel(Parcel* parcel);
190
 
    status_t writeToParcel(Parcel* parcel) const;
191
 
#endif
192
 
 
193
 
    bool operator==(const PointerCoords& other) const;
194
 
    inline bool operator!=(const PointerCoords& other) const {
195
 
        return !(*this == other);
196
 
    }
197
 
 
198
 
    void copyFrom(const PointerCoords& other);
199
 
 
200
 
private:
201
 
    void tooManyAxes(int axis);
202
 
};
203
 
 
204
 
/*
205
 
 * Pointer property data.
206
 
 */
207
 
struct PointerProperties {
208
 
    // The id of the pointer.
209
 
    int32_t id;
210
 
 
211
 
    // The pointer tool type.
212
 
    int32_t toolType;
213
 
 
214
 
    inline void clear() {
215
 
        id = -1;
216
 
        toolType = 0;
217
 
    }
218
 
 
219
 
    bool operator==(const PointerProperties& other) const;
220
 
    inline bool operator!=(const PointerProperties& other) const {
221
 
        return !(*this == other);
222
 
    }
223
 
 
224
 
    void copyFrom(const PointerProperties& other);
225
 
};
226
 
 
227
 
/*
228
 
 * Input events.
229
 
 */
230
 
class InputEvent : public AInputEvent {
231
 
public:
232
 
    virtual ~InputEvent() { }
233
 
 
234
 
    virtual int32_t getType() const = 0;
235
 
 
236
 
    inline int32_t getDeviceId() const { return mDeviceId; }
237
 
 
238
 
    inline int32_t getSource() const { return mSource; }
239
 
 
240
 
    inline void setSource(int32_t source) { mSource = source; }
241
 
 
242
 
protected:
243
 
    void initialize(int32_t deviceId, int32_t source);
244
 
    void initialize(const InputEvent& from);
245
 
 
246
 
    int32_t mDeviceId;
247
 
    int32_t mSource;
248
 
};
249
 
 
250
 
/*
251
 
 * Key events.
252
 
 */
253
 
class KeyEvent : public InputEvent {
254
 
public:
255
 
    virtual ~KeyEvent() { }
256
 
 
257
 
    virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; }
258
 
 
259
 
    inline int32_t getAction() const { return mAction; }
260
 
 
261
 
    inline int32_t getFlags() const { return mFlags; }
262
 
 
263
 
    inline void setFlags(int32_t flags) { mFlags = flags; }
264
 
 
265
 
    inline int32_t getKeyCode() const { return mKeyCode; }
266
 
 
267
 
    inline int32_t getScanCode() const { return mScanCode; }
268
 
 
269
 
    inline int32_t getMetaState() const { return mMetaState; }
270
 
 
271
 
    inline int32_t getRepeatCount() const { return mRepeatCount; }
272
 
 
273
 
    inline nsecs_t getDownTime() const { return mDownTime; }
274
 
 
275
 
    inline nsecs_t getEventTime() const { return mEventTime; }
276
 
 
277
 
    // Return true if this event may have a default action implementation.
278
 
    static bool hasDefaultAction(int32_t keyCode);
279
 
    bool hasDefaultAction() const;
280
 
 
281
 
    // Return true if this event represents a system key.
282
 
    static bool isSystemKey(int32_t keyCode);
283
 
    bool isSystemKey() const;
284
 
    
285
 
    void initialize(
286
 
            int32_t deviceId,
287
 
            int32_t source,
288
 
            int32_t action,
289
 
            int32_t flags,
290
 
            int32_t keyCode,
291
 
            int32_t scanCode,
292
 
            int32_t metaState,
293
 
            int32_t repeatCount,
294
 
            nsecs_t downTime,
295
 
            nsecs_t eventTime);
296
 
    void initialize(const KeyEvent& from);
297
 
 
298
 
protected:
299
 
    int32_t mAction;
300
 
    int32_t mFlags;
301
 
    int32_t mKeyCode;
302
 
    int32_t mScanCode;
303
 
    int32_t mMetaState;
304
 
    int32_t mRepeatCount;
305
 
    nsecs_t mDownTime;
306
 
    nsecs_t mEventTime;
307
 
};
308
 
 
309
 
/*
310
 
 * Motion events.
311
 
 */
312
 
class MotionEvent : public InputEvent {
313
 
public:
314
 
    virtual ~MotionEvent() { }
315
 
 
316
 
    virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; }
317
 
 
318
 
    inline int32_t getAction() const { return mAction; }
319
 
 
320
 
    inline int32_t getActionMasked() const { return mAction & AMOTION_EVENT_ACTION_MASK; }
321
 
 
322
 
    inline int32_t getActionIndex() const {
323
 
        return (mAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
324
 
                >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
325
 
    }
326
 
 
327
 
    inline void setAction(int32_t action) { mAction = action; }
328
 
 
329
 
    inline int32_t getFlags() const { return mFlags; }
330
 
 
331
 
    inline void setFlags(int32_t flags) { mFlags = flags; }
332
 
 
333
 
    inline int32_t getEdgeFlags() const { return mEdgeFlags; }
334
 
 
335
 
    inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; }
336
 
 
337
 
    inline int32_t getMetaState() const { return mMetaState; }
338
 
 
339
 
    inline void setMetaState(int32_t metaState) { mMetaState = metaState; }
340
 
 
341
 
    inline int32_t getButtonState() const { return mButtonState; }
342
 
 
343
 
    inline float getXOffset() const { return mXOffset; }
344
 
 
345
 
    inline float getYOffset() const { return mYOffset; }
346
 
 
347
 
    inline float getXPrecision() const { return mXPrecision; }
348
 
 
349
 
    inline float getYPrecision() const { return mYPrecision; }
350
 
 
351
 
    inline nsecs_t getDownTime() const { return mDownTime; }
352
 
 
353
 
    inline void setDownTime(nsecs_t downTime) { mDownTime = downTime; }
354
 
 
355
 
    inline size_t getPointerCount() const { return mPointerProperties.size(); }
356
 
 
357
 
    inline const PointerProperties* getPointerProperties(size_t pointerIndex) const {
358
 
        return &mPointerProperties[pointerIndex];
359
 
    }
360
 
 
361
 
    inline int32_t getPointerId(size_t pointerIndex) const {
362
 
        return mPointerProperties[pointerIndex].id;
363
 
    }
364
 
 
365
 
    inline int32_t getToolType(size_t pointerIndex) const {
366
 
        return mPointerProperties[pointerIndex].toolType;
367
 
    }
368
 
 
369
 
    inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; }
370
 
 
371
 
    const PointerCoords* getRawPointerCoords(size_t pointerIndex) const;
372
 
 
373
 
    float getRawAxisValue(int32_t axis, size_t pointerIndex) const;
374
 
 
375
 
    inline float getRawX(size_t pointerIndex) const {
376
 
        return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
377
 
    }
378
 
 
379
 
    inline float getRawY(size_t pointerIndex) const {
380
 
        return getRawAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
381
 
    }
382
 
 
383
 
    float getAxisValue(int32_t axis, size_t pointerIndex) const;
384
 
 
385
 
    inline float getX(size_t pointerIndex) const {
386
 
        return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
387
 
    }
388
 
 
389
 
    inline float getY(size_t pointerIndex) const {
390
 
        return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
391
 
    }
392
 
 
393
 
    inline float getPressure(size_t pointerIndex) const {
394
 
        return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex);
395
 
    }
396
 
 
397
 
    inline float getSize(size_t pointerIndex) const {
398
 
        return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex);
399
 
    }
400
 
 
401
 
    inline float getTouchMajor(size_t pointerIndex) const {
402
 
        return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex);
403
 
    }
404
 
 
405
 
    inline float getTouchMinor(size_t pointerIndex) const {
406
 
        return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex);
407
 
    }
408
 
 
409
 
    inline float getToolMajor(size_t pointerIndex) const {
410
 
        return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex);
411
 
    }
412
 
 
413
 
    inline float getToolMinor(size_t pointerIndex) const {
414
 
        return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex);
415
 
    }
416
 
 
417
 
    inline float getOrientation(size_t pointerIndex) const {
418
 
        return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex);
419
 
    }
420
 
 
421
 
    inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; }
422
 
 
423
 
    inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const {
424
 
        return mSampleEventTimes[historicalIndex];
425
 
    }
426
 
 
427
 
    const PointerCoords* getHistoricalRawPointerCoords(
428
 
            size_t pointerIndex, size_t historicalIndex) const;
429
 
 
430
 
    float getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex,
431
 
            size_t historicalIndex) const;
432
 
 
433
 
    inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const {
434
 
        return getHistoricalRawAxisValue(
435
 
                AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
436
 
    }
437
 
 
438
 
    inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const {
439
 
        return getHistoricalRawAxisValue(
440
 
                AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
441
 
    }
442
 
 
443
 
    float getHistoricalAxisValue(int32_t axis, size_t pointerIndex, size_t historicalIndex) const;
444
 
 
445
 
    inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const {
446
 
        return getHistoricalAxisValue(
447
 
                AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
448
 
    }
449
 
 
450
 
    inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const {
451
 
        return getHistoricalAxisValue(
452
 
                AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
453
 
    }
454
 
 
455
 
    inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const {
456
 
        return getHistoricalAxisValue(
457
 
                AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex);
458
 
    }
459
 
 
460
 
    inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const {
461
 
        return getHistoricalAxisValue(
462
 
                AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex);
463
 
    }
464
 
 
465
 
    inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const {
466
 
        return getHistoricalAxisValue(
467
 
                AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex);
468
 
    }
469
 
 
470
 
    inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const {
471
 
        return getHistoricalAxisValue(
472
 
                AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex);
473
 
    }
474
 
 
475
 
    inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const {
476
 
        return getHistoricalAxisValue(
477
 
                AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex);
478
 
    }
479
 
 
480
 
    inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const {
481
 
        return getHistoricalAxisValue(
482
 
                AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex);
483
 
    }
484
 
 
485
 
    inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const {
486
 
        return getHistoricalAxisValue(
487
 
                AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex, historicalIndex);
488
 
    }
489
 
 
490
 
    ssize_t findPointerIndex(int32_t pointerId) const;
491
 
 
492
 
    void initialize(
493
 
            int32_t deviceId,
494
 
            int32_t source,
495
 
            int32_t action,
496
 
            int32_t flags,
497
 
            int32_t edgeFlags,
498
 
            int32_t metaState,
499
 
            int32_t buttonState,
500
 
            float xOffset,
501
 
            float yOffset,
502
 
            float xPrecision,
503
 
            float yPrecision,
504
 
            nsecs_t downTime,
505
 
            nsecs_t eventTime,
506
 
            size_t pointerCount,
507
 
            const PointerProperties* pointerProperties,
508
 
            const PointerCoords* pointerCoords);
509
 
 
510
 
    void copyFrom(const MotionEvent* other, bool keepHistory);
511
 
 
512
 
    void addSample(
513
 
            nsecs_t eventTime,
514
 
            const PointerCoords* pointerCoords);
515
 
 
516
 
    void offsetLocation(float xOffset, float yOffset);
517
 
 
518
 
    void scale(float scaleFactor);
519
 
 
520
 
#ifdef HAVE_ANDROID_OS
521
 
    void transform(const SkMatrix* matrix);
522
 
 
523
 
    status_t readFromParcel(Parcel* parcel);
524
 
    status_t writeToParcel(Parcel* parcel) const;
525
 
#endif
526
 
 
527
 
    static bool isTouchEvent(int32_t source, int32_t action);
528
 
    inline bool isTouchEvent() const {
529
 
        return isTouchEvent(mSource, mAction);
530
 
    }
531
 
 
532
 
    // Low-level accessors.
533
 
    inline const PointerProperties* getPointerProperties() const {
534
 
        return mPointerProperties.array();
535
 
    }
536
 
    inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); }
537
 
    inline const PointerCoords* getSamplePointerCoords() const {
538
 
            return mSamplePointerCoords.array();
539
 
    }
540
 
 
541
 
protected:
542
 
    int32_t mAction;
543
 
    int32_t mFlags;
544
 
    int32_t mEdgeFlags;
545
 
    int32_t mMetaState;
546
 
    int32_t mButtonState;
547
 
    float mXOffset;
548
 
    float mYOffset;
549
 
    float mXPrecision;
550
 
    float mYPrecision;
551
 
    nsecs_t mDownTime;
552
 
    Vector<PointerProperties> mPointerProperties;
553
 
    Vector<nsecs_t> mSampleEventTimes;
554
 
    Vector<PointerCoords> mSamplePointerCoords;
555
 
};
556
 
 
557
 
/*
558
 
 * Input event factory.
559
 
 */
560
 
class InputEventFactoryInterface {
561
 
protected:
562
 
    virtual ~InputEventFactoryInterface() { }
563
 
 
564
 
public:
565
 
    InputEventFactoryInterface() { }
566
 
 
567
 
    virtual KeyEvent* createKeyEvent() = 0;
568
 
    virtual MotionEvent* createMotionEvent() = 0;
569
 
};
570
 
 
571
 
/*
572
 
 * A simple input event factory implementation that uses a single preallocated instance
573
 
 * of each type of input event that are reused for each request.
574
 
 */
575
 
class PreallocatedInputEventFactory : public InputEventFactoryInterface {
576
 
public:
577
 
    PreallocatedInputEventFactory() { }
578
 
    virtual ~PreallocatedInputEventFactory() { }
579
 
 
580
 
    virtual KeyEvent* createKeyEvent() { return & mKeyEvent; }
581
 
    virtual MotionEvent* createMotionEvent() { return & mMotionEvent; }
582
 
 
583
 
private:
584
 
    KeyEvent mKeyEvent;
585
 
    MotionEvent mMotionEvent;
586
 
};
587
 
 
588
 
/*
589
 
 * An input event factory implementation that maintains a pool of input events.
590
 
 */
591
 
class PooledInputEventFactory : public InputEventFactoryInterface {
592
 
public:
593
 
    PooledInputEventFactory(size_t maxPoolSize = 20);
594
 
    virtual ~PooledInputEventFactory();
595
 
 
596
 
    virtual KeyEvent* createKeyEvent();
597
 
    virtual MotionEvent* createMotionEvent();
598
 
 
599
 
    void recycle(InputEvent* event);
600
 
 
601
 
private:
602
 
    const size_t mMaxPoolSize;
603
 
 
604
 
    Vector<KeyEvent*> mKeyEventPool;
605
 
    Vector<MotionEvent*> mMotionEventPool;
606
 
};
607
 
 
608
 
} // namespace android
609
 
 
610
 
#endif // _ANDROIDFW_INPUT_H