Mir

Merge lp:~dandrader/mir/InputReader_tests into lp:~mir-team/mir/trunk

Proposed by Daniel d'Andrada
Status: Superseded
Proposed branch: lp:~dandrader/mir/InputReader_tests
Merge into: lp:~mir-team/mir/trunk
Diff against target: 5237 lines (+5153/-27)
6 files modified
3rd_party/android-deps/android/input.h (+0/-21)
3rd_party/android-deps/std/PropertyMap.h (+14/-4)
3rd_party/android-deps/std/Vector.h (+1/-1)
3rd_party/android-input/android/frameworks/base/services/input/InputReader.cpp (+2/-1)
tests/unit-tests/android_input/CMakeLists.txt (+1/-0)
tests/unit-tests/android_input/input_reader.cpp (+5135/-0)
To merge this branch: bzr merge lp:~dandrader/mir/InputReader_tests
Reviewer Review Type Date Requested Status
Alexandros Frantzis (community) Approve
Kevin DuBois (community) test run on mako Approve
PS Jenkins bot (community) continuous-integration Approve
Robert Carr (community) Approve
Review via email: mp+186654@code.launchpad.net

This proposal has been superseded by a proposal from 2013-09-25.

Commit message

Add tests for Android's InputReader & friends

To help detecting regressions once we start making more intrusive (or deeper)
modifications to this code.

Interestingly enough, one of the tests is failing already and was disabled.

Taken from https://android.googlesource.com/platform/frameworks/base with head
at commit 4fd42e5a90e88e34d2e870852a4d26457a712d16

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Robert Carr (robertcarr) wrote :

Looks good to me! Didn't go through all the tests line by line obviously though :)

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Robert Carr (robertcarr) wrote :

Running jenkins again.

Revision history for this message
Daniel d'Andrada (dandrader) wrote :

> Running jenkins again.

Jenkins seems to fail because valgrind shows some possible memory leaks in those tests. Which is actually quite possible. I gonna check then myself after I'm done with my current task. So if jenkins fail again I should probably set this MP to "work in progress" in the meantime.

Revision history for this message
Robert Carr (robertcarr) wrote :

I think the failure is only here:
[ RUN ] DisplayConfigurationTest.display_configuration_reaches_client
unknown file: Failure
C++ exception with description "Failed to find server" thrown in the test body.

which was due to some intermittent CI issues we were having (amd64 CI was running slow slow slowww).

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Kevin DuBois (kdub) wrote :

I'm okay with adding the android tests. I don't understand at a low level what is going on in all these tests, but then again i'm not sure what's going on in the android input stack, so I'd feel better with the tests than without.

Revision history for this message
Kevin DuBois (kdub) :
review: Approve (test run on mako)
Revision history for this message
Alexandros Frantzis (afrantzis) wrote :

Looks good.

review: Approve
Revision history for this message
Alexandros Frantzis (afrantzis) wrote :

... but it would probably be better to retarget this at lp:~mir-team/mir/development-branch, to help keep devel and trunk in sync.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '3rd_party/android-deps/android/input.h'
--- 3rd_party/android-deps/android/input.h 2013-05-03 16:38:07 +0000
+++ 3rd_party/android-deps/android/input.h 2013-09-24 17:50:10 +0000
@@ -460,27 +460,6 @@
460 AINPUT_KEYBOARD_TYPE_ALPHABETIC = 2460 AINPUT_KEYBOARD_TYPE_ALPHABETIC = 2
461};461};
462462
463/*
464 * Constants used to retrieve information about the range of motion for a particular
465 * coordinate of a motion event.
466 *
467 * Refer to the documentation on android.view.InputDevice for more details about input sources
468 * and their correct interpretation.
469 *
470 * DEPRECATION NOTICE: These constants are deprecated. Use AMOTION_EVENT_AXIS_* constants instead.
471 */
472enum {
473 AINPUT_MOTION_RANGE_X = AMOTION_EVENT_AXIS_X,
474 AINPUT_MOTION_RANGE_Y = AMOTION_EVENT_AXIS_Y,
475 AINPUT_MOTION_RANGE_PRESSURE = AMOTION_EVENT_AXIS_PRESSURE,
476 AINPUT_MOTION_RANGE_SIZE = AMOTION_EVENT_AXIS_SIZE,
477 AINPUT_MOTION_RANGE_TOUCH_MAJOR = AMOTION_EVENT_AXIS_TOUCH_MAJOR,
478 AINPUT_MOTION_RANGE_TOUCH_MINOR = AMOTION_EVENT_AXIS_TOUCH_MINOR,
479 AINPUT_MOTION_RANGE_TOOL_MAJOR = AMOTION_EVENT_AXIS_TOOL_MAJOR,
480 AINPUT_MOTION_RANGE_TOOL_MINOR = AMOTION_EVENT_AXIS_TOOL_MINOR,
481 AINPUT_MOTION_RANGE_ORIENTATION = AMOTION_EVENT_AXIS_ORIENTATION
482} __attribute__ ((deprecated));
483
484#ifdef __cplusplus463#ifdef __cplusplus
485}464}
486#endif465#endif
487466
=== modified file '3rd_party/android-deps/std/PropertyMap.h'
--- 3rd_party/android-deps/std/PropertyMap.h 2013-05-03 16:38:07 +0000
+++ 3rd_party/android-deps/std/PropertyMap.h 2013-09-24 17:50:10 +0000
@@ -62,10 +62,20 @@
62 /* Clears the property map. */62 /* Clears the property map. */
63 void clear() { options = boost::program_options::variables_map(); }63 void clear() { options = boost::program_options::variables_map(); }
6464
65// /* Adds a property.65 /* Adds a property.
66// * Replaces the property with the same key if it is already present.66 * Replaces the property with the same key if it is already present.
67// */67 */
68// void addProperty(const String8& key, const String8& value);68 void addProperty(const String8& key, const String8& value)
69 {
70 namespace po = boost::program_options;
71 options.insert(std::make_pair(key, po::variable_value(value, false)));
72 }
73
74 void addAll(const PropertyMap* other)
75 {
76 options.insert(other->options.begin(), other->options.end());
77 }
78
69//79//
70// /* Returns true if the property map contains the specified key. */80// /* Returns true if the property map contains the specified key. */
71// bool hasProperty(const String8& key) const;81// bool hasProperty(const String8& key) const;
7282
=== modified file '3rd_party/android-deps/std/Vector.h'
--- 3rd_party/android-deps/std/Vector.h 2013-03-13 04:54:15 +0000
+++ 3rd_party/android-deps/std/Vector.h 2013-09-24 17:50:10 +0000
@@ -62,7 +62,7 @@
6262
63 /*! copy operator */63 /*! copy operator */
64// const Vector<ValueType>& operator = (const Vector<ValueType>& rhs) const;64// const Vector<ValueType>& operator = (const Vector<ValueType>& rhs) const;
65 Vector<ValueType>& operator=(const Vector<ValueType>& rhs) = default;65 Vector<ValueType>& operator=(const Vector<ValueType>& /* rhs */) = default;
6666
67// const Vector<ValueType>& operator = (const SortedVector<ValueType>& rhs) const;67// const Vector<ValueType>& operator = (const SortedVector<ValueType>& rhs) const;
68// Vector<ValueType>& operator = (const SortedVector<ValueType>& rhs);68// Vector<ValueType>& operator = (const SortedVector<ValueType>& rhs);
6969
=== modified file '3rd_party/android-input/android/frameworks/base/services/input/InputReader.cpp'
--- 3rd_party/android-input/android/frameworks/base/services/input/InputReader.cpp 2013-03-13 04:54:15 +0000
+++ 3rd_party/android-input/android/frameworks/base/services/input/InputReader.cpp 2013-09-24 17:50:10 +0000
@@ -2553,7 +2553,8 @@
2553TouchInputMapper::TouchInputMapper(InputDevice* device) :2553TouchInputMapper::TouchInputMapper(InputDevice* device) :
2554 InputMapper(device),2554 InputMapper(device),
2555 mSource(0), mDeviceMode(DEVICE_MODE_DISABLED),2555 mSource(0), mDeviceMode(DEVICE_MODE_DISABLED),
2556 mSurfaceOrientation(-1), mSurfaceWidth(-1), mSurfaceHeight(-1) {2556 mSurfaceOrientation(-1), mSurfaceWidth(-1), mSurfaceHeight(-1),
2557 mPointerUsage(POINTER_USAGE_NONE) {
2557}2558}
25582559
2559TouchInputMapper::~TouchInputMapper() {2560TouchInputMapper::~TouchInputMapper() {
25602561
=== modified file 'tests/unit-tests/android_input/CMakeLists.txt'
--- tests/unit-tests/android_input/CMakeLists.txt 2013-03-13 04:54:15 +0000
+++ tests/unit-tests/android_input/CMakeLists.txt 2013-09-24 17:50:10 +0000
@@ -1,4 +1,5 @@
1list(APPEND UNIT_TEST_SOURCES1list(APPEND UNIT_TEST_SOURCES
2 ${CMAKE_CURRENT_SOURCE_DIR}/input_reader.cpp
2 ${CMAKE_CURRENT_SOURCE_DIR}/sorted_vector.cpp3 ${CMAKE_CURRENT_SOURCE_DIR}/sorted_vector.cpp
3 ${CMAKE_CURRENT_SOURCE_DIR}/property_map.cpp4 ${CMAKE_CURRENT_SOURCE_DIR}/property_map.cpp
4 ${CMAKE_CURRENT_SOURCE_DIR}/string8.cpp5 ${CMAKE_CURRENT_SOURCE_DIR}/string8.cpp
56
=== added file 'tests/unit-tests/android_input/input_reader.cpp'
--- tests/unit-tests/android_input/input_reader.cpp 1970-01-01 00:00:00 +0000
+++ tests/unit-tests/android_input/input_reader.cpp 2013-09-24 17:50:10 +0000
@@ -0,0 +1,5135 @@
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#include <InputReader.h>
18
19#include <android/keycodes.h>
20
21#include <utils/List.h>
22#include <gtest/gtest.h>
23#include <gmock/gmock.h>
24#include <math.h>
25
26#include <mir/logging/logger.h>
27#include <mir/logging/input_report.h>
28
29namespace ml = mir::logging;
30
31using std::string;
32
33namespace
34{
35class TestLogger : public ml::Logger
36{
37public:
38 void log(Severity severity, const string& message, const string& component) override {
39 (void)severity;
40 (void)message;
41 (void)component;
42 }
43};
44}
45
46
47namespace android {
48
49// An arbitrary time value.
50static const nsecs_t ARBITRARY_TIME = 1234;
51
52// Arbitrary display properties.
53static const int32_t DISPLAY_ID = 0;
54static const int32_t DISPLAY_WIDTH = 480;
55static const int32_t DISPLAY_HEIGHT = 800;
56
57// Error tolerance for floating point assertions.
58static const float EPSILON = 0.001f;
59
60template<typename T>
61static inline T min(T a, T b) {
62 return a < b ? a : b;
63}
64
65static inline float avg(float x, float y) {
66 return (x + y) / 2;
67}
68
69
70// --- FakePointerController ---
71
72class FakePointerController : public PointerControllerInterface {
73 bool mHaveBounds;
74 float mMinX, mMinY, mMaxX, mMaxY;
75 float mX, mY;
76 int32_t mButtonState;
77
78protected:
79 virtual ~FakePointerController() { }
80
81public:
82 FakePointerController() :
83 mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0),
84 mButtonState(0) {
85 }
86
87 void setBounds(float minX, float minY, float maxX, float maxY) {
88 mHaveBounds = true;
89 mMinX = minX;
90 mMinY = minY;
91 mMaxX = maxX;
92 mMaxY = maxY;
93 }
94
95 virtual void setPosition(float x, float y) {
96 mX = x;
97 mY = y;
98 }
99
100 virtual void setButtonState(int32_t buttonState) {
101 mButtonState = buttonState;
102 }
103
104 virtual int32_t getButtonState() const {
105 return mButtonState;
106 }
107
108 virtual void getPosition(float* outX, float* outY) const {
109 *outX = mX;
110 *outY = mY;
111 }
112
113private:
114 virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
115 *outMinX = mMinX;
116 *outMinY = mMinY;
117 *outMaxX = mMaxX;
118 *outMaxY = mMaxY;
119 return mHaveBounds;
120 }
121
122 virtual void move(float deltaX, float deltaY) {
123 mX += deltaX;
124 if (mX < mMinX) mX = mMinX;
125 if (mX > mMaxX) mX = mMaxX;
126 mY += deltaY;
127 if (mY < mMinY) mY = mMinY;
128 if (mY > mMaxY) mY = mMaxY;
129 }
130
131 void fade(Transition /*transition*/) override {}
132
133 void unfade(Transition /*transition*/) override {}
134
135 void setPresentation(Presentation /*presentation*/) override {}
136
137 void setSpots(const PointerCoords* /*spotCoords*/, const uint32_t* /*spotIdToIndex*/,
138 BitSet32 /*spotIdBits*/) override {}
139
140 void clearSpots() override {}
141};
142
143
144// --- FakeInputReaderPolicy ---
145
146class FakeInputReaderPolicy : public InputReaderPolicyInterface {
147 InputReaderConfiguration mConfig;
148 KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
149 Vector<InputDeviceInfo> mInputDevices;
150
151protected:
152 virtual ~FakeInputReaderPolicy() { }
153
154public:
155 FakeInputReaderPolicy() {
156 }
157
158 void setDisplayInfo(int32_t displayId, int32_t width, int32_t height, int32_t orientation) {
159 // Set the size of both the internal and external display at the same time.
160 mConfig.setDisplayInfo(displayId, false /*external*/, width, height, orientation);
161 mConfig.setDisplayInfo(displayId, true /*external*/, width, height, orientation);
162 }
163
164 void addExcludedDeviceName(const String8& deviceName) {
165 mConfig.excludedDeviceNames.push(deviceName);
166 }
167
168 void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
169 mPointerControllers.add(deviceId, controller);
170 }
171
172 const InputReaderConfiguration* getReaderConfiguration() const {
173 return &mConfig;
174 }
175
176 const Vector<InputDeviceInfo>& getInputDevices() const {
177 return mInputDevices;
178 }
179
180private:
181 virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) {
182 *outConfig = mConfig;
183 }
184
185 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
186 return mPointerControllers.valueFor(deviceId);
187 }
188
189 virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) {
190 mInputDevices = inputDevices;
191 }
192
193 sp<KeyCharacterMap> getKeyboardLayoutOverlay(const String8& inputDeviceDescriptor) override {
194 (void) inputDeviceDescriptor;
195 return NULL;
196 }
197
198 String8 getDeviceAlias(const InputDeviceIdentifier& identifier) override {
199 (void)identifier;
200 return String8();
201 }
202};
203
204
205// --- FakeInputListener ---
206
207class FakeInputListener : public InputListenerInterface {
208private:
209 List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue;
210 List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue;
211 List<NotifyKeyArgs> mNotifyKeyArgsQueue;
212 List<NotifyMotionArgs> mNotifyMotionArgsQueue;
213 List<NotifySwitchArgs> mNotifySwitchArgsQueue;
214
215protected:
216 virtual ~FakeInputListener() { }
217
218public:
219 FakeInputListener() {
220 }
221
222 void assertNotifyConfigurationChangedWasCalled(
223 NotifyConfigurationChangedArgs* outEventArgs = NULL) {
224 ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty())
225 << "Expected notifyConfigurationChanged() to have been called.";
226 if (outEventArgs) {
227 *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin();
228 }
229 mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin());
230 }
231
232 void assertNotifyDeviceResetWasCalled(
233 NotifyDeviceResetArgs* outEventArgs = NULL) {
234 ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty())
235 << "Expected notifyDeviceReset() to have been called.";
236 if (outEventArgs) {
237 *outEventArgs = *mNotifyDeviceResetArgsQueue.begin();
238 }
239 mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin());
240 }
241
242 void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = NULL) {
243 ASSERT_FALSE(mNotifyKeyArgsQueue.empty())
244 << "Expected notifyKey() to have been called.";
245 if (outEventArgs) {
246 *outEventArgs = *mNotifyKeyArgsQueue.begin();
247 }
248 mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin());
249 }
250
251 void assertNotifyKeyWasNotCalled() {
252 ASSERT_TRUE(mNotifyKeyArgsQueue.empty())
253 << "Expected notifyKey() to not have been called.";
254 }
255
256 void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = NULL) {
257 ASSERT_FALSE(mNotifyMotionArgsQueue.empty())
258 << "Expected notifyMotion() to have been called.";
259 if (outEventArgs) {
260 *outEventArgs = *mNotifyMotionArgsQueue.begin();
261 }
262 mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin());
263 }
264
265 void assertNotifyMotionWasNotCalled() {
266 ASSERT_TRUE(mNotifyMotionArgsQueue.empty())
267 << "Expected notifyMotion() to not have been called.";
268 }
269
270 void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = NULL) {
271 ASSERT_FALSE(mNotifySwitchArgsQueue.empty())
272 << "Expected notifySwitch() to have been called.";
273 if (outEventArgs) {
274 *outEventArgs = *mNotifySwitchArgsQueue.begin();
275 }
276 mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin());
277 }
278
279private:
280 virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
281 mNotifyConfigurationChangedArgsQueue.push_back(*args);
282 }
283
284 virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) {
285 mNotifyDeviceResetArgsQueue.push_back(*args);
286 }
287
288 virtual void notifyKey(const NotifyKeyArgs* args) {
289 mNotifyKeyArgsQueue.push_back(*args);
290 }
291
292 virtual void notifyMotion(const NotifyMotionArgs* args) {
293 mNotifyMotionArgsQueue.push_back(*args);
294 }
295
296 virtual void notifySwitch(const NotifySwitchArgs* args) {
297 mNotifySwitchArgsQueue.push_back(*args);
298 }
299};
300
301
302// --- FakeEventHub ---
303
304class FakeEventHub : public EventHubInterface {
305 struct KeyInfo {
306 int32_t keyCode;
307 uint32_t flags;
308 };
309
310 struct Device {
311 InputDeviceIdentifier identifier;
312 uint32_t classes;
313 PropertyMap configuration;
314 KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
315 KeyedVector<int, bool> relativeAxes;
316 KeyedVector<int32_t, int32_t> keyCodeStates;
317 KeyedVector<int32_t, int32_t> scanCodeStates;
318 KeyedVector<int32_t, int32_t> switchStates;
319 KeyedVector<int32_t, int32_t> absoluteAxisValue;
320 KeyedVector<int32_t, KeyInfo> keysByScanCode;
321 KeyedVector<int32_t, KeyInfo> keysByUsageCode;
322 KeyedVector<int32_t, bool> leds;
323 Vector<VirtualKeyDefinition> virtualKeys;
324
325 Device(uint32_t classes) :
326 classes(classes) {
327 }
328 };
329
330 KeyedVector<int32_t, Device*> mDevices;
331 Vector<String8> mExcludedDevices;
332 List<RawEvent> mEvents;
333
334protected:
335 virtual ~FakeEventHub() {
336 for (size_t i = 0; i < mDevices.size(); i++) {
337 delete mDevices.valueAt(i);
338 }
339 }
340
341public:
342 FakeEventHub() { }
343
344 void addDevice(int32_t deviceId, const String8& name, uint32_t classes) {
345 Device* device = new Device(classes);
346 device->identifier.name = name;
347 mDevices.add(deviceId, device);
348
349 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0);
350 }
351
352 void removeDevice(int32_t deviceId) {
353 delete mDevices.valueFor(deviceId);
354 mDevices.removeItem(deviceId);
355
356 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0);
357 }
358
359 void finishDeviceScan() {
360 enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0);
361 }
362
363 void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) {
364 Device* device = getDevice(deviceId);
365 device->configuration.addProperty(key, value);
366 }
367
368 void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
369 Device* device = getDevice(deviceId);
370 device->configuration.addAll(configuration);
371 }
372
373 void addAbsoluteAxis(int32_t deviceId, int axis,
374 int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) {
375 Device* device = getDevice(deviceId);
376
377 RawAbsoluteAxisInfo info;
378 info.valid = true;
379 info.minValue = minValue;
380 info.maxValue = maxValue;
381 info.flat = flat;
382 info.fuzz = fuzz;
383 info.resolution = resolution;
384 device->absoluteAxes.add(axis, info);
385 }
386
387 void addRelativeAxis(int32_t deviceId, int32_t axis) {
388 Device* device = getDevice(deviceId);
389 device->relativeAxes.add(axis, true);
390 }
391
392 void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
393 Device* device = getDevice(deviceId);
394 device->keyCodeStates.replaceValueFor(keyCode, state);
395 }
396
397 void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
398 Device* device = getDevice(deviceId);
399 device->scanCodeStates.replaceValueFor(scanCode, state);
400 }
401
402 void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
403 Device* device = getDevice(deviceId);
404 device->switchStates.replaceValueFor(switchCode, state);
405 }
406
407 void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) {
408 Device* device = getDevice(deviceId);
409 device->absoluteAxisValue.replaceValueFor(axis, value);
410 }
411
412 void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
413 int32_t keyCode, uint32_t flags) {
414 Device* device = getDevice(deviceId);
415 KeyInfo info;
416 info.keyCode = keyCode;
417 info.flags = flags;
418 if (scanCode) {
419 device->keysByScanCode.add(scanCode, info);
420 }
421 if (usageCode) {
422 device->keysByUsageCode.add(usageCode, info);
423 }
424 }
425
426 void addLed(int32_t deviceId, int32_t led, bool initialState) {
427 Device* device = getDevice(deviceId);
428 device->leds.add(led, initialState);
429 }
430
431 bool getLedState(int32_t deviceId, int32_t led) {
432 Device* device = getDevice(deviceId);
433 return device->leds.valueFor(led);
434 }
435
436 Vector<String8>& getExcludedDevices() {
437 return mExcludedDevices;
438 }
439
440 void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) {
441 Device* device = getDevice(deviceId);
442 device->virtualKeys.push(definition);
443 }
444
445 void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
446 int32_t code, int32_t value) {
447 RawEvent event;
448 event.when = when;
449 event.deviceId = deviceId;
450 event.type = type;
451 event.code = code;
452 event.value = value;
453 mEvents.push_back(event);
454
455 if (type == EV_ABS) {
456 setAbsoluteAxisValue(deviceId, code, value);
457 }
458 }
459
460 void assertQueueIsEmpty() {
461 ASSERT_EQ(size_t(0), mEvents.size())
462 << "Expected the event queue to be empty (fully consumed).";
463 }
464
465private:
466 Device* getDevice(int32_t deviceId) const {
467 ssize_t index = mDevices.indexOfKey(deviceId);
468 return index >= 0 ? mDevices.valueAt(index) : NULL;
469 }
470
471 virtual uint32_t getDeviceClasses(int32_t deviceId) const {
472 Device* device = getDevice(deviceId);
473 return device ? device->classes : 0;
474 }
475
476 virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
477 Device* device = getDevice(deviceId);
478 return device ? device->identifier : InputDeviceIdentifier();
479 }
480
481 virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
482 Device* device = getDevice(deviceId);
483 if (device) {
484 *outConfiguration = device->configuration;
485 }
486 }
487
488 virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
489 RawAbsoluteAxisInfo* outAxisInfo) const {
490 outAxisInfo->clear();
491 Device* device = getDevice(deviceId);
492 if (device) {
493 ssize_t index = device->absoluteAxes.indexOfKey(axis);
494 if (index >= 0) {
495 *outAxisInfo = device->absoluteAxes.valueAt(index);
496 return OK;
497 }
498 }
499 return -1;
500 }
501
502 virtual bool hasRelativeAxis(int32_t deviceId, int axis) const {
503 Device* device = getDevice(deviceId);
504 if (device) {
505 return device->relativeAxes.indexOfKey(axis) >= 0;
506 }
507 return false;
508 }
509
510 bool hasInputProperty(int32_t deviceId, int property) const override {
511 (void)deviceId;
512 (void)property;
513 return false;
514 }
515
516 virtual status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
517 int32_t* outKeycode, uint32_t* outFlags) const {
518 Device* device = getDevice(deviceId);
519 if (device) {
520 const KeyInfo* key = getKey(device, scanCode, usageCode);
521 if (key) {
522 if (outKeycode) {
523 *outKeycode = key->keyCode;
524 }
525 if (outFlags) {
526 *outFlags = key->flags;
527 }
528 return OK;
529 }
530 }
531 return NAME_NOT_FOUND;
532 }
533
534 const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const {
535 if (usageCode) {
536 ssize_t index = device->keysByUsageCode.indexOfKey(usageCode);
537 if (index >= 0) {
538 return &device->keysByUsageCode.valueAt(index);
539 }
540 }
541 if (scanCode) {
542 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
543 if (index >= 0) {
544 return &device->keysByScanCode.valueAt(index);
545 }
546 }
547 return NULL;
548 }
549
550 status_t mapAxis(int32_t deviceId, int32_t scanCode, AxisInfo* outAxisInfo) const override {
551 (void)deviceId;
552 (void)scanCode;
553 (void)outAxisInfo;
554 return NAME_NOT_FOUND;
555 }
556
557 virtual void setExcludedDevices(const Vector<String8>& devices) {
558 mExcludedDevices = devices;
559 }
560
561 size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) override {
562 (void)timeoutMillis;
563 (void)bufferSize;
564
565 if (mEvents.empty()) {
566 return 0;
567 }
568
569 *buffer = *mEvents.begin();
570 mEvents.erase(mEvents.begin());
571 return 1;
572 }
573
574 int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const override {
575 Device* device = getDevice(deviceId);
576 if (device) {
577 ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
578 if (index >= 0) {
579 return device->scanCodeStates.valueAt(index);
580 }
581 }
582 return AKEY_STATE_UNKNOWN;
583 }
584
585 int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const override {
586 Device* device = getDevice(deviceId);
587 if (device) {
588 ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
589 if (index >= 0) {
590 return device->keyCodeStates.valueAt(index);
591 }
592 }
593 return AKEY_STATE_UNKNOWN;
594 }
595
596 int32_t getSwitchState(int32_t deviceId, int32_t sw) const override {
597 Device* device = getDevice(deviceId);
598 if (device) {
599 ssize_t index = device->switchStates.indexOfKey(sw);
600 if (index >= 0) {
601 return device->switchStates.valueAt(index);
602 }
603 }
604 return AKEY_STATE_UNKNOWN;
605 }
606
607 virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis,
608 int32_t* outValue) const {
609 Device* device = getDevice(deviceId);
610 if (device) {
611 ssize_t index = device->absoluteAxisValue.indexOfKey(axis);
612 if (index >= 0) {
613 *outValue = device->absoluteAxisValue.valueAt(index);
614 return OK;
615 }
616 }
617 *outValue = 0;
618 return -1;
619 }
620
621 virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
622 uint8_t* outFlags) const {
623 bool result = false;
624 Device* device = getDevice(deviceId);
625 if (device) {
626 for (size_t i = 0; i < numCodes; i++) {
627 for (size_t j = 0; j < device->keysByScanCode.size(); j++) {
628 if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) {
629 outFlags[i] = 1;
630 result = true;
631 }
632 }
633 for (size_t j = 0; j < device->keysByUsageCode.size(); j++) {
634 if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) {
635 outFlags[i] = 1;
636 result = true;
637 }
638 }
639 }
640 }
641 return result;
642 }
643
644 virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const {
645 Device* device = getDevice(deviceId);
646 if (device) {
647 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
648 return index >= 0;
649 }
650 return false;
651 }
652
653 virtual bool hasLed(int32_t deviceId, int32_t led) const {
654 Device* device = getDevice(deviceId);
655 return device && device->leds.indexOfKey(led) >= 0;
656 }
657
658 virtual void setLedState(int32_t deviceId, int32_t led, bool on) {
659 Device* device = getDevice(deviceId);
660 if (device) {
661 ssize_t index = device->leds.indexOfKey(led);
662 if (index >= 0) {
663 device->leds.replaceValueAt(led, on);
664 } else {
665 ADD_FAILURE()
666 << "Attempted to set the state of an LED that the EventHub declared "
667 "was not present. led=" << led;
668 }
669 }
670 }
671
672 void getVirtualKeyDefinitions(int32_t deviceId,
673 Vector<VirtualKeyDefinition>& outVirtualKeys) const override {
674 outVirtualKeys.clear();
675
676 Device* device = getDevice(deviceId);
677 if (device) {
678 outVirtualKeys.appendVector(device->virtualKeys);
679 }
680 }
681
682 sp<KeyCharacterMap> getKeyCharacterMap(int32_t deviceId) const override {
683 (void)deviceId;
684 return NULL;
685 }
686
687 bool setKeyboardLayoutOverlay(int32_t deviceId, const sp<KeyCharacterMap>& map) override {
688 (void)deviceId;
689 (void)map;
690 return false;
691 }
692
693 void vibrate(int32_t /*deviceId*/, nsecs_t /*duration*/) override {}
694
695 void cancelVibrate(int32_t /*deviceId*/) override {}
696
697 void wake() override {}
698
699 void dump(String8& /*dump*/) override {}
700
701 void monitor() override {}
702
703 void flush() override {}
704
705 void requestReopenDevices() override {}
706
707};
708
709
710// --- FakeInputReaderContext ---
711
712class FakeInputReaderContext : public InputReaderContext {
713 sp<EventHubInterface> mEventHub;
714 sp<InputReaderPolicyInterface> mPolicy;
715 sp<InputListenerInterface> mListener;
716 int32_t mGlobalMetaState;
717 bool mUpdateGlobalMetaStateWasCalled;
718 int32_t mGeneration;
719
720public:
721 FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
722 const sp<InputReaderPolicyInterface>& policy,
723 const sp<InputListenerInterface>& listener) :
724 mEventHub(eventHub), mPolicy(policy), mListener(listener),
725 mGlobalMetaState(0) {
726 }
727
728 virtual ~FakeInputReaderContext() { }
729
730 void assertUpdateGlobalMetaStateWasCalled() {
731 ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
732 << "Expected updateGlobalMetaState() to have been called.";
733 mUpdateGlobalMetaStateWasCalled = false;
734 }
735
736 void setGlobalMetaState(int32_t state) {
737 mGlobalMetaState = state;
738 }
739
740private:
741 virtual void updateGlobalMetaState() {
742 mUpdateGlobalMetaStateWasCalled = true;
743 }
744
745 virtual int32_t getGlobalMetaState() {
746 return mGlobalMetaState;
747 }
748
749 virtual EventHubInterface* getEventHub() {
750 return mEventHub.get();
751 }
752
753 virtual InputReaderPolicyInterface* getPolicy() {
754 return mPolicy.get();
755 }
756
757 virtual InputListenerInterface* getListener() {
758 return mListener.get();
759 }
760
761 void disableVirtualKeysUntil(nsecs_t /*time*/) override {}
762
763 bool shouldDropVirtualKey(nsecs_t now,
764 InputDevice* device, int32_t keyCode, int32_t scanCode) override {
765 (void) now;
766 (void) device;
767 (void) keyCode;
768 (void) scanCode;
769 return false;
770 }
771
772 void fadePointer() override {}
773
774 void requestTimeoutAtTime(nsecs_t /*when*/) override {}
775
776 int32_t bumpGeneration() override {
777 return ++mGeneration;
778 }
779};
780
781
782// --- FakeInputMapper ---
783
784class FakeInputMapper : public InputMapper {
785 uint32_t mSources;
786 int32_t mKeyboardType;
787 int32_t mMetaState;
788 KeyedVector<int32_t, int32_t> mKeyCodeStates;
789 KeyedVector<int32_t, int32_t> mScanCodeStates;
790 KeyedVector<int32_t, int32_t> mSwitchStates;
791 Vector<int32_t> mSupportedKeyCodes;
792 RawEvent mLastEvent;
793
794 bool mConfigureWasCalled;
795 bool mResetWasCalled;
796 bool mProcessWasCalled;
797
798public:
799 FakeInputMapper(InputDevice* device, uint32_t sources) :
800 InputMapper(device),
801 mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
802 mMetaState(0),
803 mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
804 }
805
806 virtual ~FakeInputMapper() { }
807
808 void setKeyboardType(int32_t keyboardType) {
809 mKeyboardType = keyboardType;
810 }
811
812 void setMetaState(int32_t metaState) {
813 mMetaState = metaState;
814 }
815
816 void assertConfigureWasCalled() {
817 ASSERT_TRUE(mConfigureWasCalled)
818 << "Expected configure() to have been called.";
819 mConfigureWasCalled = false;
820 }
821
822 void assertResetWasCalled() {
823 ASSERT_TRUE(mResetWasCalled)
824 << "Expected reset() to have been called.";
825 mResetWasCalled = false;
826 }
827
828 void assertProcessWasCalled(RawEvent* outLastEvent = NULL) {
829 ASSERT_TRUE(mProcessWasCalled)
830 << "Expected process() to have been called.";
831 if (outLastEvent) {
832 *outLastEvent = mLastEvent;
833 }
834 mProcessWasCalled = false;
835 }
836
837 void setKeyCodeState(int32_t keyCode, int32_t state) {
838 mKeyCodeStates.replaceValueFor(keyCode, state);
839 }
840
841 void setScanCodeState(int32_t scanCode, int32_t state) {
842 mScanCodeStates.replaceValueFor(scanCode, state);
843 }
844
845 void setSwitchState(int32_t switchCode, int32_t state) {
846 mSwitchStates.replaceValueFor(switchCode, state);
847 }
848
849 void addSupportedKeyCode(int32_t keyCode) {
850 mSupportedKeyCodes.add(keyCode);
851 }
852
853private:
854 virtual uint32_t getSources() {
855 return mSources;
856 }
857
858 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
859 InputMapper::populateDeviceInfo(deviceInfo);
860
861 if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
862 deviceInfo->setKeyboardType(mKeyboardType);
863 }
864 }
865
866 void configure(nsecs_t when,
867 const InputReaderConfiguration* config, uint32_t changes) override {
868 (void)when;
869 (void)config;
870 (void)changes;
871 mConfigureWasCalled = true;
872 }
873
874 void reset(nsecs_t when) override {
875 (void)when;
876 mResetWasCalled = true;
877 }
878
879 void process(const RawEvent* rawEvent) override {
880 mLastEvent = *rawEvent;
881 mProcessWasCalled = true;
882 }
883
884 int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode) override {
885 (void)sourceMask;
886 ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
887 return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
888 }
889
890 int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode) override {
891 (void)sourceMask;
892 ssize_t index = mScanCodeStates.indexOfKey(scanCode);
893 return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
894 }
895
896 int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode) override {
897 (void)sourceMask;
898 ssize_t index = mSwitchStates.indexOfKey(switchCode);
899 return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
900 }
901
902 bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
903 const int32_t* keyCodes, uint8_t* outFlags) override {
904 (void)sourceMask;
905 bool result = false;
906 for (size_t i = 0; i < numCodes; i++) {
907 for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
908 if (keyCodes[i] == mSupportedKeyCodes[j]) {
909 outFlags[i] = 1;
910 result = true;
911 }
912 }
913 }
914 return result;
915 }
916
917 int32_t getMetaState() override {
918 return mMetaState;
919 }
920};
921
922
923// --- InstrumentedInputReader ---
924
925class InstrumentedInputReader : public InputReader {
926 InputDevice* mNextDevice;
927
928public:
929 InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
930 const sp<InputReaderPolicyInterface>& policy,
931 const sp<InputListenerInterface>& listener) :
932 InputReader(eventHub, policy, listener),
933 mNextDevice(NULL) {
934 }
935
936 virtual ~InstrumentedInputReader() {
937 if (mNextDevice) {
938 delete mNextDevice;
939 }
940 }
941
942 void setNextDevice(InputDevice* device) {
943 mNextDevice = device;
944 }
945
946 InputDevice* newDevice(int32_t deviceId, const String8& name, uint32_t classes) {
947 InputDeviceIdentifier identifier;
948 identifier.name = name;
949 int32_t generation = deviceId + 1;
950 return new InputDevice(&mContext, deviceId, generation, identifier, classes);
951 }
952
953protected:
954 virtual InputDevice* createDeviceLocked(int32_t deviceId,
955 const InputDeviceIdentifier& identifier, uint32_t classes) {
956 if (mNextDevice) {
957 InputDevice* device = mNextDevice;
958 mNextDevice = NULL;
959 return device;
960 }
961 return InputReader::createDeviceLocked(deviceId, identifier, classes);
962 }
963
964 friend class InputReaderTest;
965};
966
967
968// --- InputReaderTest ---
969
970class InputReaderTest : public testing::Test {
971protected:
972 sp<FakeInputListener> mFakeListener;
973 sp<FakeInputReaderPolicy> mFakePolicy;
974 sp<FakeEventHub> mFakeEventHub;
975 sp<InstrumentedInputReader> mReader;
976
977 virtual void SetUp() {
978 mir::logging::legacy_input_report::initialize(std::make_shared<TestLogger>());
979 mFakeEventHub = new FakeEventHub();
980 mFakePolicy = new FakeInputReaderPolicy();
981 mFakeListener = new FakeInputListener();
982
983 mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener);
984 }
985
986 virtual void TearDown() {
987 mReader.clear();
988
989 mFakeListener.clear();
990 mFakePolicy.clear();
991 mFakeEventHub.clear();
992 }
993
994 void addDevice(int32_t deviceId, const String8& name, uint32_t classes,
995 const PropertyMap* configuration) {
996 mFakeEventHub->addDevice(deviceId, name, classes);
997
998 if (configuration) {
999 mFakeEventHub->addConfigurationMap(deviceId, configuration);
1000 }
1001 mFakeEventHub->finishDeviceScan();
1002 mReader->loopOnce();
1003 mReader->loopOnce();
1004 mFakeEventHub->assertQueueIsEmpty();
1005 }
1006
1007 FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId,
1008 const String8& name, uint32_t classes, uint32_t sources,
1009 const PropertyMap* configuration) {
1010 InputDevice* device = mReader->newDevice(deviceId, name, classes);
1011 FakeInputMapper* mapper = new FakeInputMapper(device, sources);
1012 device->addMapper(mapper);
1013 mReader->setNextDevice(device);
1014 addDevice(deviceId, name, classes, configuration);
1015 return mapper;
1016 }
1017};
1018
1019TEST_F(InputReaderTest, GetInputDevices) {
1020 ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"),
1021 INPUT_DEVICE_CLASS_KEYBOARD, NULL));
1022 ASSERT_NO_FATAL_FAILURE(addDevice(2, String8("ignored"),
1023 0, NULL)); // no classes so device will be ignored
1024
1025 Vector<InputDeviceInfo> inputDevices;
1026 mReader->getInputDevices(inputDevices);
1027
1028 ASSERT_EQ(1U, inputDevices.size());
1029 ASSERT_EQ(1, inputDevices[0].getId());
1030 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
1031 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1032 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1033 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1034
1035 // Should also have received a notification describing the new input devices.
1036 inputDevices = mFakePolicy->getInputDevices();
1037 ASSERT_EQ(1U, inputDevices.size());
1038 ASSERT_EQ(1, inputDevices[0].getId());
1039 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
1040 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1041 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1042 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1043}
1044
1045TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
1046 FakeInputMapper* mapper = NULL;
1047 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
1048 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1049 mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1050
1051 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
1052 AINPUT_SOURCE_ANY, AKEYCODE_A))
1053 << "Should return unknown when the device id is >= 0 but unknown.";
1054
1055 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
1056 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1057 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1058
1059 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
1060 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1061 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1062
1063 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
1064 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1065 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1066
1067 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
1068 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1069 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1070}
1071
1072TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
1073 FakeInputMapper* mapper = NULL;
1074 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
1075 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1076 mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
1077
1078 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
1079 AINPUT_SOURCE_ANY, KEY_A))
1080 << "Should return unknown when the device id is >= 0 but unknown.";
1081
1082 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
1083 AINPUT_SOURCE_TRACKBALL, KEY_A))
1084 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1085
1086 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
1087 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1088 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1089
1090 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
1091 AINPUT_SOURCE_TRACKBALL, KEY_A))
1092 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1093
1094 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
1095 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1096 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1097}
1098
1099TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
1100 FakeInputMapper* mapper = NULL;
1101 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
1102 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1103 mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
1104
1105 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
1106 AINPUT_SOURCE_ANY, SW_LID))
1107 << "Should return unknown when the device id is >= 0 but unknown.";
1108
1109 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
1110 AINPUT_SOURCE_TRACKBALL, SW_LID))
1111 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1112
1113 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
1114 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1115 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1116
1117 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
1118 AINPUT_SOURCE_TRACKBALL, SW_LID))
1119 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1120
1121 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
1122 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1123 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1124}
1125
1126TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
1127 FakeInputMapper* mapper = NULL;
1128 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
1129 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1130 mapper->addSupportedKeyCode(AKEYCODE_A);
1131 mapper->addSupportedKeyCode(AKEYCODE_B);
1132
1133 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1134 uint8_t flags[4] = { 0, 0, 0, 1 };
1135
1136 ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
1137 << "Should return false when device id is >= 0 but unknown.";
1138 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1139
1140 flags[3] = 1;
1141 ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1142 << "Should return false when device id is valid but the sources are not supported by the device.";
1143 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1144
1145 flags[3] = 1;
1146 ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1147 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1148 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1149
1150 flags[3] = 1;
1151 ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1152 << "Should return false when the device id is < 0 but the sources are not supported by any device.";
1153 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1154
1155 flags[3] = 1;
1156 ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1157 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1158 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1159}
1160
1161TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
1162 addDevice(1, String8("ignored"), INPUT_DEVICE_CLASS_KEYBOARD, NULL);
1163
1164 NotifyConfigurationChangedArgs args;
1165
1166 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args));
1167 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1168}
1169
1170TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
1171 FakeInputMapper* mapper = NULL;
1172 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
1173 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1174
1175 mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1);
1176 mReader->loopOnce();
1177 ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
1178
1179 RawEvent event;
1180 ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
1181 ASSERT_EQ(0, event.when);
1182 ASSERT_EQ(1, event.deviceId);
1183 ASSERT_EQ(EV_KEY, event.type);
1184 ASSERT_EQ(KEY_A, event.code);
1185 ASSERT_EQ(1, event.value);
1186}
1187
1188
1189// --- InputDeviceTest ---
1190
1191class InputDeviceTest : public testing::Test {
1192protected:
1193 static const char* DEVICE_NAME;
1194 static const int32_t DEVICE_ID;
1195 static const int32_t DEVICE_GENERATION;
1196 static const uint32_t DEVICE_CLASSES;
1197
1198 sp<FakeEventHub> mFakeEventHub;
1199 sp<FakeInputReaderPolicy> mFakePolicy;
1200 sp<FakeInputListener> mFakeListener;
1201 FakeInputReaderContext* mFakeContext;
1202
1203 InputDevice* mDevice;
1204
1205 virtual void SetUp() {
1206 mir::logging::legacy_input_report::initialize(std::make_shared<TestLogger>());
1207 mFakeEventHub = new FakeEventHub();
1208 mFakePolicy = new FakeInputReaderPolicy();
1209 mFakeListener = new FakeInputListener();
1210 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1211
1212 mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
1213 InputDeviceIdentifier identifier;
1214 identifier.name = DEVICE_NAME;
1215 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1216 identifier, DEVICE_CLASSES);
1217 }
1218
1219 virtual void TearDown() {
1220 delete mDevice;
1221
1222 delete mFakeContext;
1223 mFakeListener.clear();
1224 mFakePolicy.clear();
1225 mFakeEventHub.clear();
1226 }
1227};
1228
1229const char* InputDeviceTest::DEVICE_NAME = "device";
1230const int32_t InputDeviceTest::DEVICE_ID = 1;
1231const int32_t InputDeviceTest::DEVICE_GENERATION = 2;
1232const uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD
1233 | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK;
1234
1235TEST_F(InputDeviceTest, ImmutableProperties) {
1236 ASSERT_EQ(DEVICE_ID, mDevice->getId());
1237 ASSERT_STREQ(DEVICE_NAME, mDevice->getName().c_str());
1238 ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses());
1239}
1240
1241TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
1242 // Configuration.
1243 InputReaderConfiguration config;
1244 mDevice->configure(ARBITRARY_TIME, &config, 0);
1245
1246 // Reset.
1247 mDevice->reset(ARBITRARY_TIME);
1248
1249 NotifyDeviceResetArgs resetArgs;
1250 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1251 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1252 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1253
1254 // Metadata.
1255 ASSERT_TRUE(mDevice->isIgnored());
1256 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources());
1257
1258 InputDeviceInfo info;
1259 mDevice->getDeviceInfo(&info);
1260 ASSERT_EQ(DEVICE_ID, info.getId());
1261 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
1262 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType());
1263 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
1264
1265 // State queries.
1266 ASSERT_EQ(0, mDevice->getMetaState());
1267
1268 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1269 << "Ignored device should return unknown key code state.";
1270 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1271 << "Ignored device should return unknown scan code state.";
1272 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
1273 << "Ignored device should return unknown switch state.";
1274
1275 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1276 uint8_t flags[2] = { 0, 1 };
1277 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
1278 << "Ignored device should never mark any key codes.";
1279 ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
1280 ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
1281}
1282
1283TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
1284 // Configuration.
1285 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value"));
1286
1287 FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
1288 mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1289 mapper1->setMetaState(AMETA_ALT_ON);
1290 mapper1->addSupportedKeyCode(AKEYCODE_A);
1291 mapper1->addSupportedKeyCode(AKEYCODE_B);
1292 mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1293 mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
1294 mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
1295 mapper1->setScanCodeState(3, AKEY_STATE_UP);
1296 mapper1->setSwitchState(4, AKEY_STATE_DOWN);
1297 mDevice->addMapper(mapper1);
1298
1299 FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
1300 mapper2->setMetaState(AMETA_SHIFT_ON);
1301 mDevice->addMapper(mapper2);
1302
1303 InputReaderConfiguration config;
1304 mDevice->configure(ARBITRARY_TIME, &config, 0);
1305
1306 String8 propertyValue;
1307 ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue))
1308 << "Device should have read configuration during configuration phase.";
1309 ASSERT_STREQ("value", propertyValue.c_str());
1310
1311 ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
1312 ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
1313
1314 // Reset
1315 mDevice->reset(ARBITRARY_TIME);
1316 ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
1317 ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
1318
1319 NotifyDeviceResetArgs resetArgs;
1320 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1321 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1322 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1323
1324 // Metadata.
1325 ASSERT_FALSE(mDevice->isIgnored());
1326 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
1327
1328 InputDeviceInfo info;
1329 mDevice->getDeviceInfo(&info);
1330 ASSERT_EQ(DEVICE_ID, info.getId());
1331 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
1332 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
1333 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
1334
1335 // State queries.
1336 ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
1337 << "Should query mappers and combine meta states.";
1338
1339 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1340 << "Should return unknown key code state when source not supported.";
1341 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1342 << "Should return unknown scan code state when source not supported.";
1343 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1344 << "Should return unknown switch state when source not supported.";
1345
1346 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
1347 << "Should query mapper when source is supported.";
1348 ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
1349 << "Should query mapper when source is supported.";
1350 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
1351 << "Should query mapper when source is supported.";
1352
1353 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1354 uint8_t flags[4] = { 0, 0, 0, 1 };
1355 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1356 << "Should do nothing when source is unsupported.";
1357 ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
1358 ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
1359 ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
1360 ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
1361
1362 ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
1363 << "Should query mapper when source is supported.";
1364 ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
1365 ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
1366 ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
1367 ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
1368
1369 // Event handling.
1370 RawEvent event;
1371 event.type = EV_KEY; // some arbitrary event type and code
1372 event.code = KEY_A;
1373 mDevice->process(&event, 1);
1374
1375 ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
1376 ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
1377}
1378
1379
1380// --- InputMapperTest ---
1381
1382class InputMapperTest : public testing::Test {
1383protected:
1384 static const char* DEVICE_NAME;
1385 static const int32_t DEVICE_ID;
1386 static const int32_t DEVICE_GENERATION;
1387 static const uint32_t DEVICE_CLASSES;
1388
1389 sp<FakeEventHub> mFakeEventHub;
1390 sp<FakeInputReaderPolicy> mFakePolicy;
1391 sp<FakeInputListener> mFakeListener;
1392 FakeInputReaderContext* mFakeContext;
1393 InputDevice* mDevice;
1394
1395 virtual void SetUp() {
1396 mir::logging::legacy_input_report::initialize(std::make_shared<TestLogger>());
1397 mFakeEventHub = new FakeEventHub();
1398 mFakePolicy = new FakeInputReaderPolicy();
1399 mFakeListener = new FakeInputListener();
1400 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1401 InputDeviceIdentifier identifier;
1402 identifier.name = DEVICE_NAME;
1403 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1404 identifier, DEVICE_CLASSES);
1405
1406 mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
1407 }
1408
1409 virtual void TearDown() {
1410 delete mDevice;
1411 delete mFakeContext;
1412 mFakeListener.clear();
1413 mFakePolicy.clear();
1414 mFakeEventHub.clear();
1415 }
1416
1417 void addConfigurationProperty(const char* key, const char* value) {
1418 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8(key), String8(value));
1419 }
1420
1421 void addMapperAndConfigure(InputMapper* mapper) {
1422 mDevice->addMapper(mapper);
1423 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 0);
1424 mDevice->reset(ARBITRARY_TIME);
1425 }
1426
1427 void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
1428 int32_t orientation) {
1429 mFakePolicy->setDisplayInfo(displayId, width, height, orientation);
1430 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
1431 InputReaderConfiguration::CHANGE_DISPLAY_INFO);
1432 }
1433
1434 static void process(InputMapper* mapper, nsecs_t when, int32_t deviceId, int32_t type,
1435 int32_t code, int32_t value) {
1436 RawEvent event;
1437 event.when = when;
1438 event.deviceId = deviceId;
1439 event.type = type;
1440 event.code = code;
1441 event.value = value;
1442 mapper->process(&event);
1443 }
1444
1445 static void assertMotionRange(const InputDeviceInfo& info,
1446 int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
1447 const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
1448 ASSERT_TRUE(range != NULL) << "Axis: " << axis << " Source: " << source;
1449 ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source;
1450 ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source;
1451 ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source;
1452 ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source;
1453 ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source;
1454 ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source;
1455 }
1456
1457 static void assertPointerCoords(const PointerCoords& coords,
1458 float x, float y, float pressure, float size,
1459 float touchMajor, float touchMinor, float toolMajor, float toolMinor,
1460 float orientation, float distance) {
1461 ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1);
1462 ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
1463 ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON);
1464 ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON);
1465 ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1);
1466 ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1);
1467 ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1);
1468 ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1);
1469 ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON);
1470 ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON);
1471 }
1472
1473 static void assertPosition(const sp<FakePointerController>& controller, float x, float y) {
1474 float actualX, actualY;
1475 controller->getPosition(&actualX, &actualY);
1476 ASSERT_NEAR(x, actualX, 1);
1477 ASSERT_NEAR(y, actualY, 1);
1478 }
1479};
1480
1481const char* InputMapperTest::DEVICE_NAME = "device";
1482const int32_t InputMapperTest::DEVICE_ID = 1;
1483const int32_t InputMapperTest::DEVICE_GENERATION = 2;
1484const uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests
1485
1486
1487// --- SwitchInputMapperTest ---
1488
1489class SwitchInputMapperTest : public InputMapperTest {
1490protected:
1491};
1492
1493TEST_F(SwitchInputMapperTest, GetSources) {
1494 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1495 addMapperAndConfigure(mapper);
1496
1497 ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources());
1498}
1499
1500TEST_F(SwitchInputMapperTest, GetSwitchState) {
1501 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1502 addMapperAndConfigure(mapper);
1503
1504 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
1505 ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1506
1507 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
1508 ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1509}
1510
1511TEST_F(SwitchInputMapperTest, Process) {
1512 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1513 addMapperAndConfigure(mapper);
1514
1515 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_LID, 1);
1516
1517 NotifySwitchArgs args;
1518 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args));
1519 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1520 ASSERT_EQ(SW_LID, args.switchCode);
1521 ASSERT_EQ(1, args.switchValue);
1522 ASSERT_EQ(uint32_t(0), args.policyFlags);
1523}
1524
1525
1526// --- KeyboardInputMapperTest ---
1527
1528class KeyboardInputMapperTest : public InputMapperTest {
1529protected:
1530 void testDPadKeyRotation(KeyboardInputMapper* mapper,
1531 int32_t originalScanCode, int32_t rotatedKeyCode);
1532};
1533
1534void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
1535 int32_t originalScanCode, int32_t rotatedKeyCode) {
1536 NotifyKeyArgs args;
1537
1538 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 1);
1539 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1540 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1541 ASSERT_EQ(originalScanCode, args.scanCode);
1542 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1543
1544 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 0);
1545 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1546 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1547 ASSERT_EQ(originalScanCode, args.scanCode);
1548 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1549}
1550
1551
1552TEST_F(KeyboardInputMapperTest, GetSources) {
1553 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1554 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1555 addMapperAndConfigure(mapper);
1556
1557 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
1558}
1559
1560TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
1561 const int32_t USAGE_A = 0x070004;
1562 const int32_t USAGE_UNKNOWN = 0x07ffff;
1563 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
1564 mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
1565
1566 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1567 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1568 addMapperAndConfigure(mapper);
1569
1570 // Key down by scan code.
1571 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1572 EV_KEY, KEY_HOME, 1);
1573 NotifyKeyArgs args;
1574 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1575 ASSERT_EQ(DEVICE_ID, args.deviceId);
1576 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1577 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1578 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1579 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1580 ASSERT_EQ(KEY_HOME, args.scanCode);
1581 ASSERT_EQ(AMETA_NONE, args.metaState);
1582 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1583 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1584 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1585
1586 // Key up by scan code.
1587 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1588 EV_KEY, KEY_HOME, 0);
1589 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1590 ASSERT_EQ(DEVICE_ID, args.deviceId);
1591 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1592 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1593 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1594 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1595 ASSERT_EQ(KEY_HOME, args.scanCode);
1596 ASSERT_EQ(AMETA_NONE, args.metaState);
1597 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1598 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1599 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1600
1601 // Key down by usage code.
1602 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1603 EV_MSC, MSC_SCAN, USAGE_A);
1604 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1605 EV_KEY, 0, 1);
1606 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1607 ASSERT_EQ(DEVICE_ID, args.deviceId);
1608 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1609 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1610 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1611 ASSERT_EQ(AKEYCODE_A, args.keyCode);
1612 ASSERT_EQ(0, args.scanCode);
1613 ASSERT_EQ(AMETA_NONE, args.metaState);
1614 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1615 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1616 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1617
1618 // Key up by usage code.
1619 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1620 EV_MSC, MSC_SCAN, USAGE_A);
1621 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1622 EV_KEY, 0, 0);
1623 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1624 ASSERT_EQ(DEVICE_ID, args.deviceId);
1625 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1626 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1627 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1628 ASSERT_EQ(AKEYCODE_A, args.keyCode);
1629 ASSERT_EQ(0, args.scanCode);
1630 ASSERT_EQ(AMETA_NONE, args.metaState);
1631 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1632 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1633 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1634
1635 // Key down with unknown scan code or usage code.
1636 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1637 EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
1638 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1639 EV_KEY, KEY_UNKNOWN, 1);
1640 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1641 ASSERT_EQ(DEVICE_ID, args.deviceId);
1642 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1643 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1644 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1645 ASSERT_EQ(0, args.keyCode);
1646 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
1647 ASSERT_EQ(AMETA_NONE, args.metaState);
1648 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1649 ASSERT_EQ(0U, args.policyFlags);
1650 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1651
1652 // Key up with unknown scan code or usage code.
1653 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1654 EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
1655 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1656 EV_KEY, KEY_UNKNOWN, 0);
1657 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1658 ASSERT_EQ(DEVICE_ID, args.deviceId);
1659 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1660 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1661 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1662 ASSERT_EQ(0, args.keyCode);
1663 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
1664 ASSERT_EQ(AMETA_NONE, args.metaState);
1665 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1666 ASSERT_EQ(0U, args.policyFlags);
1667 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1668}
1669
1670TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
1671 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
1672 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
1673
1674 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1675 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1676 addMapperAndConfigure(mapper);
1677
1678 // Initial metastate.
1679 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1680
1681 // Metakey down.
1682 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1683 EV_KEY, KEY_LEFTSHIFT, 1);
1684 NotifyKeyArgs args;
1685 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1686 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1687 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1688 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
1689
1690 // Key down.
1691 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1692 EV_KEY, KEY_A, 1);
1693 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1694 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1695 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1696
1697 // Key up.
1698 process(mapper, ARBITRARY_TIME + 2, DEVICE_ID,
1699 EV_KEY, KEY_A, 0);
1700 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1701 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1702 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1703
1704 // Metakey up.
1705 process(mapper, ARBITRARY_TIME + 3, DEVICE_ID,
1706 EV_KEY, KEY_LEFTSHIFT, 0);
1707 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1708 ASSERT_EQ(AMETA_NONE, args.metaState);
1709 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1710 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
1711}
1712
1713TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
1714 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
1715 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
1716 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
1717 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
1718
1719 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1720 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1721 addMapperAndConfigure(mapper);
1722
1723 setDisplayInfoAndReconfigure(DISPLAY_ID,
1724 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1725 DISPLAY_ORIENTATION_90);
1726 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1727 KEY_UP, AKEYCODE_DPAD_UP));
1728 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1729 KEY_RIGHT, AKEYCODE_DPAD_RIGHT));
1730 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1731 KEY_DOWN, AKEYCODE_DPAD_DOWN));
1732 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1733 KEY_LEFT, AKEYCODE_DPAD_LEFT));
1734}
1735
1736TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
1737 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
1738 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
1739 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
1740 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
1741
1742 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1743 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1744 addConfigurationProperty("keyboard.orientationAware", "1");
1745 addMapperAndConfigure(mapper);
1746
1747 setDisplayInfoAndReconfigure(DISPLAY_ID,
1748 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1749 DISPLAY_ORIENTATION_0);
1750 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1751 KEY_UP, AKEYCODE_DPAD_UP));
1752 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1753 KEY_RIGHT, AKEYCODE_DPAD_RIGHT));
1754 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1755 KEY_DOWN, AKEYCODE_DPAD_DOWN));
1756 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1757 KEY_LEFT, AKEYCODE_DPAD_LEFT));
1758
1759 setDisplayInfoAndReconfigure(DISPLAY_ID,
1760 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1761 DISPLAY_ORIENTATION_90);
1762 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1763 KEY_UP, AKEYCODE_DPAD_LEFT));
1764 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1765 KEY_RIGHT, AKEYCODE_DPAD_UP));
1766 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1767 KEY_DOWN, AKEYCODE_DPAD_RIGHT));
1768 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1769 KEY_LEFT, AKEYCODE_DPAD_DOWN));
1770
1771 setDisplayInfoAndReconfigure(DISPLAY_ID,
1772 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1773 DISPLAY_ORIENTATION_180);
1774 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1775 KEY_UP, AKEYCODE_DPAD_DOWN));
1776 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1777 KEY_RIGHT, AKEYCODE_DPAD_LEFT));
1778 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1779 KEY_DOWN, AKEYCODE_DPAD_UP));
1780 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1781 KEY_LEFT, AKEYCODE_DPAD_RIGHT));
1782
1783 setDisplayInfoAndReconfigure(DISPLAY_ID,
1784 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1785 DISPLAY_ORIENTATION_270);
1786 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1787 KEY_UP, AKEYCODE_DPAD_RIGHT));
1788 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1789 KEY_RIGHT, AKEYCODE_DPAD_DOWN));
1790 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1791 KEY_DOWN, AKEYCODE_DPAD_LEFT));
1792 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1793 KEY_LEFT, AKEYCODE_DPAD_UP));
1794
1795 // Special case: if orientation changes while key is down, we still emit the same keycode
1796 // in the key up as we did in the key down.
1797 NotifyKeyArgs args;
1798
1799 setDisplayInfoAndReconfigure(DISPLAY_ID,
1800 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1801 DISPLAY_ORIENTATION_270);
1802 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1);
1803 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1804 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1805 ASSERT_EQ(KEY_UP, args.scanCode);
1806 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
1807
1808 setDisplayInfoAndReconfigure(DISPLAY_ID,
1809 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1810 DISPLAY_ORIENTATION_180);
1811 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0);
1812 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1813 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1814 ASSERT_EQ(KEY_UP, args.scanCode);
1815 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
1816}
1817
1818TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
1819 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1820 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1821 addMapperAndConfigure(mapper);
1822
1823 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
1824 ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
1825
1826 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
1827 ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
1828}
1829
1830TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
1831 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1832 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1833 addMapperAndConfigure(mapper);
1834
1835 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
1836 ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
1837
1838 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
1839 ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
1840}
1841
1842TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
1843 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1844 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1845 addMapperAndConfigure(mapper);
1846
1847 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
1848
1849 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1850 uint8_t flags[2] = { 0, 0 };
1851 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
1852 ASSERT_TRUE(flags[0]);
1853 ASSERT_FALSE(flags[1]);
1854}
1855
1856TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
1857 mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/);
1858 mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/);
1859 mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/);
1860 mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
1861 mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
1862 mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
1863
1864 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1865 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1866 addMapperAndConfigure(mapper);
1867
1868 // Initialization should have turned all of the lights off.
1869 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1870 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1871 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1872
1873 // Toggle caps lock on.
1874 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1875 EV_KEY, KEY_CAPSLOCK, 1);
1876 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1877 EV_KEY, KEY_CAPSLOCK, 0);
1878 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1879 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1880 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1881 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState());
1882
1883 // Toggle num lock on.
1884 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1885 EV_KEY, KEY_NUMLOCK, 1);
1886 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1887 EV_KEY, KEY_NUMLOCK, 0);
1888 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1889 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1890 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1891 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState());
1892
1893 // Toggle caps lock off.
1894 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1895 EV_KEY, KEY_CAPSLOCK, 1);
1896 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1897 EV_KEY, KEY_CAPSLOCK, 0);
1898 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1899 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1900 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1901 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState());
1902
1903 // Toggle scroll lock on.
1904 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1905 EV_KEY, KEY_SCROLLLOCK, 1);
1906 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1907 EV_KEY, KEY_SCROLLLOCK, 0);
1908 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1909 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1910 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1911 ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
1912
1913 // Toggle num lock off.
1914 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1915 EV_KEY, KEY_NUMLOCK, 1);
1916 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1917 EV_KEY, KEY_NUMLOCK, 0);
1918 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1919 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1920 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1921 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
1922
1923 // Toggle scroll lock off.
1924 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1925 EV_KEY, KEY_SCROLLLOCK, 1);
1926 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1927 EV_KEY, KEY_SCROLLLOCK, 0);
1928 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1929 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1930 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1931 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1932}
1933
1934
1935// --- CursorInputMapperTest ---
1936
1937class CursorInputMapperTest : public InputMapperTest {
1938protected:
1939 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
1940
1941 sp<FakePointerController> mFakePointerController;
1942
1943 virtual void SetUp() {
1944 InputMapperTest::SetUp();
1945
1946 mFakePointerController = new FakePointerController();
1947 mFakePolicy->setPointerController(DEVICE_ID, mFakePointerController);
1948 }
1949
1950 void testMotionRotation(CursorInputMapper* mapper,
1951 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
1952};
1953
1954const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
1955
1956void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
1957 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
1958 NotifyMotionArgs args;
1959
1960 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, originalX);
1961 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, originalY);
1962 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
1963 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
1964 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
1965 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
1966 float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
1967 float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
1968 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
1969}
1970
1971TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
1972 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
1973 addConfigurationProperty("cursor.mode", "pointer");
1974 addMapperAndConfigure(mapper);
1975
1976 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
1977}
1978
1979TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
1980 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
1981 addConfigurationProperty("cursor.mode", "navigation");
1982 addMapperAndConfigure(mapper);
1983
1984 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
1985}
1986
1987TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
1988 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
1989 addConfigurationProperty("cursor.mode", "pointer");
1990 addMapperAndConfigure(mapper);
1991
1992 InputDeviceInfo info;
1993 mapper->populateDeviceInfo(&info);
1994
1995 // Initially there may not be a valid motion range.
1996 ASSERT_EQ(NULL, info.getMotionRange(AMOTION_EVENT_AXIS_X, AINPUT_SOURCE_MOUSE));
1997 ASSERT_EQ(NULL, info.getMotionRange(AMOTION_EVENT_AXIS_Y, AINPUT_SOURCE_MOUSE));
1998 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
1999 AMOTION_EVENT_AXIS_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f));
2000
2001 // When the bounds are set, then there should be a valid motion range.
2002 mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1);
2003
2004 InputDeviceInfo info2;
2005 mapper->populateDeviceInfo(&info2);
2006
2007 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2008 AMOTION_EVENT_AXIS_X, AINPUT_SOURCE_MOUSE,
2009 1, 800 - 1, 0.0f, 0.0f));
2010 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2011 AMOTION_EVENT_AXIS_Y, AINPUT_SOURCE_MOUSE,
2012 2, 480 - 1, 0.0f, 0.0f));
2013 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2014 AMOTION_EVENT_AXIS_PRESSURE, AINPUT_SOURCE_MOUSE,
2015 0.0f, 1.0f, 0.0f, 0.0f));
2016}
2017
2018TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
2019 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2020 addConfigurationProperty("cursor.mode", "navigation");
2021 addMapperAndConfigure(mapper);
2022
2023 InputDeviceInfo info;
2024 mapper->populateDeviceInfo(&info);
2025
2026 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2027 AMOTION_EVENT_AXIS_X, AINPUT_SOURCE_TRACKBALL,
2028 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2029 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2030 AMOTION_EVENT_AXIS_Y, AINPUT_SOURCE_TRACKBALL,
2031 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2032 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2033 AMOTION_EVENT_AXIS_PRESSURE, AINPUT_SOURCE_TRACKBALL,
2034 0.0f, 1.0f, 0.0f, 0.0f));
2035}
2036
2037TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
2038 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2039 addConfigurationProperty("cursor.mode", "navigation");
2040 addMapperAndConfigure(mapper);
2041
2042 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2043
2044 NotifyMotionArgs args;
2045
2046 // Button press.
2047 // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
2048 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2049 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2050 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2051 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2052 ASSERT_EQ(DEVICE_ID, args.deviceId);
2053 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2054 ASSERT_EQ(uint32_t(0), args.policyFlags);
2055 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2056 ASSERT_EQ(0, args.flags);
2057 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2058 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2059 ASSERT_EQ(0, args.edgeFlags);
2060 ASSERT_EQ(uint32_t(1), args.pointerCount);
2061 ASSERT_EQ(0, args.pointerProperties[0].id);
2062 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2063 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2064 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2065 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2066 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2067 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2068
2069 // Button release. Should have same down time.
2070 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2071 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2072 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2073 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2074 ASSERT_EQ(DEVICE_ID, args.deviceId);
2075 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2076 ASSERT_EQ(uint32_t(0), args.policyFlags);
2077 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2078 ASSERT_EQ(0, args.flags);
2079 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2080 ASSERT_EQ(0, args.buttonState);
2081 ASSERT_EQ(0, args.edgeFlags);
2082 ASSERT_EQ(uint32_t(1), args.pointerCount);
2083 ASSERT_EQ(0, args.pointerProperties[0].id);
2084 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2085 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2086 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2087 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2088 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2089 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2090}
2091
2092TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
2093 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2094 addConfigurationProperty("cursor.mode", "navigation");
2095 addMapperAndConfigure(mapper);
2096
2097 NotifyMotionArgs args;
2098
2099 // Motion in X but not Y.
2100 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1);
2101 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2102 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2103 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2104 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2105 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2106
2107 // Motion in Y but not X.
2108 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2);
2109 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2110 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2111 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2112 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2113 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2114}
2115
2116TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
2117 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2118 addConfigurationProperty("cursor.mode", "navigation");
2119 addMapperAndConfigure(mapper);
2120
2121 NotifyMotionArgs args;
2122
2123 // Button press.
2124 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2125 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2126 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2127 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2128 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2129 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2130
2131 // Button release.
2132 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2133 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2134 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2135 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2136 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2137 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2138}
2139
2140TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
2141 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2142 addConfigurationProperty("cursor.mode", "navigation");
2143 addMapperAndConfigure(mapper);
2144
2145 NotifyMotionArgs args;
2146
2147 // Combined X, Y and Button.
2148 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1);
2149 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2);
2150 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2151 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2152 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2153 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2154 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2155 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2156 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2157
2158 // Move X, Y a bit while pressed.
2159 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 2);
2160 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 1);
2161 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2162 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2163 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2164 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2165 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2166 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2167
2168 // Release Button.
2169 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2170 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2171 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2172 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2173 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2174 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2175}
2176
2177TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
2178 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2179 addConfigurationProperty("cursor.mode", "navigation");
2180 addMapperAndConfigure(mapper);
2181
2182 setDisplayInfoAndReconfigure(DISPLAY_ID,
2183 DISPLAY_WIDTH, DISPLAY_HEIGHT,
2184 DISPLAY_ORIENTATION_90);
2185 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2186 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2187 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2188 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2189 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2190 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2191 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2192 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2193}
2194
2195TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
2196 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2197 addConfigurationProperty("cursor.mode", "navigation");
2198 addConfigurationProperty("cursor.orientationAware", "1");
2199 addMapperAndConfigure(mapper);
2200
2201 setDisplayInfoAndReconfigure(DISPLAY_ID,
2202 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0);
2203 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2204 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2205 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2206 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2207 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2208 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2209 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2210 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2211
2212 setDisplayInfoAndReconfigure(DISPLAY_ID,
2213 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_90);
2214 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0));
2215 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1));
2216 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1));
2217 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1));
2218 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0));
2219 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1));
2220 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1));
2221 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1));
2222
2223 setDisplayInfoAndReconfigure(DISPLAY_ID,
2224 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_180);
2225 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1));
2226 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1));
2227 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0));
2228 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1));
2229 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1));
2230 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1));
2231 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0));
2232 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1));
2233
2234 setDisplayInfoAndReconfigure(DISPLAY_ID,
2235 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_270);
2236 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0));
2237 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1));
2238 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1));
2239 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1));
2240 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0));
2241 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1));
2242 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1));
2243 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1));
2244}
2245
2246TEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) {
2247 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2248 addConfigurationProperty("cursor.mode", "pointer");
2249 addMapperAndConfigure(mapper);
2250
2251 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2252 mFakePointerController->setPosition(100, 200);
2253 mFakePointerController->setButtonState(0);
2254
2255 NotifyMotionArgs motionArgs;
2256 NotifyKeyArgs keyArgs;
2257
2258 // press BTN_LEFT, release BTN_LEFT
2259 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 1);
2260 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2262 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2263 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2264 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2265 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2266 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2267
2268 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 0);
2269 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2270 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2271 ASSERT_EQ(0, motionArgs.buttonState);
2272 ASSERT_EQ(0, mFakePointerController->getButtonState());
2273 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2274 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2275 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2276
2277 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2278 ASSERT_EQ(0, motionArgs.buttonState);
2279 ASSERT_EQ(0, mFakePointerController->getButtonState());
2280 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2281 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2282 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2283
2284 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
2285 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 1);
2286 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 1);
2287 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2288 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2289 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2290 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2291 motionArgs.buttonState);
2292 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2293 mFakePointerController->getButtonState());
2294 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2295 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2296
2297 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 0);
2298 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2299 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2300 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2301 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
2302 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
2303 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2304 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2305
2306 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 0);
2307 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2308 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2309 ASSERT_EQ(0, motionArgs.buttonState);
2310 ASSERT_EQ(0, mFakePointerController->getButtonState());
2311 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2312 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2313 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2314 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2315 ASSERT_EQ(0, motionArgs.buttonState);
2316 ASSERT_EQ(0, mFakePointerController->getButtonState());
2317 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2318 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2319 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2320
2321 // press BTN_BACK, release BTN_BACK
2322 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 1);
2323 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2324 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2325 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2326 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2327 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2328 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2329 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
2330 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2331 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2332 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2333
2334 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 0);
2335 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2336 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2337 ASSERT_EQ(0, motionArgs.buttonState);
2338 ASSERT_EQ(0, mFakePointerController->getButtonState());
2339 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2340 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2341 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2342 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2343 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2344 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2345
2346 // press BTN_SIDE, release BTN_SIDE
2347 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 1);
2348 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2349 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2350 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2351 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2352 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2353 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2354 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
2355 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2356 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2357 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2358
2359 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 0);
2360 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2361 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2362 ASSERT_EQ(0, motionArgs.buttonState);
2363 ASSERT_EQ(0, mFakePointerController->getButtonState());
2364 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2365 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2366 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2367 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2368 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2369 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2370
2371 // press BTN_FORWARD, release BTN_FORWARD
2372 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 1);
2373 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2374 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2375 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2376 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2377 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2378 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2379 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
2380 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2381 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2382 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2383
2384 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 0);
2385 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2386 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2387 ASSERT_EQ(0, motionArgs.buttonState);
2388 ASSERT_EQ(0, mFakePointerController->getButtonState());
2389 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2390 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2391 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2392 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2393 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2394 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2395
2396 // press BTN_EXTRA, release BTN_EXTRA
2397 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 1);
2398 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2399 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2400 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2401 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2402 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2403 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2404 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
2405 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2406 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2407 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2408
2409 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 0);
2410 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2411 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2412 ASSERT_EQ(0, motionArgs.buttonState);
2413 ASSERT_EQ(0, mFakePointerController->getButtonState());
2414 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2415 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2416 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2417 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2418 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2419 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2420}
2421
2422TEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) {
2423 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2424 addConfigurationProperty("cursor.mode", "pointer");
2425 addMapperAndConfigure(mapper);
2426
2427 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2428 mFakePointerController->setPosition(100, 200);
2429 mFakePointerController->setButtonState(0);
2430
2431 NotifyMotionArgs args;
2432
2433 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10);
2434 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20);
2435 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2436 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2437 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
2438 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2439 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2440 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
2441}
2442
2443
2444// --- TouchInputMapperTest ---
2445
2446class TouchInputMapperTest : public InputMapperTest {
2447protected:
2448 static const int32_t RAW_X_MIN;
2449 static const int32_t RAW_X_MAX;
2450 static const int32_t RAW_Y_MIN;
2451 static const int32_t RAW_Y_MAX;
2452 static const int32_t RAW_TOUCH_MIN;
2453 static const int32_t RAW_TOUCH_MAX;
2454 static const int32_t RAW_TOOL_MIN;
2455 static const int32_t RAW_TOOL_MAX;
2456 static const int32_t RAW_PRESSURE_MIN;
2457 static const int32_t RAW_PRESSURE_MAX;
2458 static const int32_t RAW_ORIENTATION_MIN;
2459 static const int32_t RAW_ORIENTATION_MAX;
2460 static const int32_t RAW_DISTANCE_MIN;
2461 static const int32_t RAW_DISTANCE_MAX;
2462 static const int32_t RAW_TILT_MIN;
2463 static const int32_t RAW_TILT_MAX;
2464 static const int32_t RAW_ID_MIN;
2465 static const int32_t RAW_ID_MAX;
2466 static const int32_t RAW_SLOT_MIN;
2467 static const int32_t RAW_SLOT_MAX;
2468 static const float X_PRECISION;
2469 static const float Y_PRECISION;
2470
2471 static const float GEOMETRIC_SCALE;
2472
2473 static const VirtualKeyDefinition VIRTUAL_KEYS[2];
2474
2475 enum Axes {
2476 POSITION = 1 << 0,
2477 TOUCH = 1 << 1,
2478 TOOL = 1 << 2,
2479 PRESSURE = 1 << 3,
2480 ORIENTATION = 1 << 4,
2481 MINOR = 1 << 5,
2482 ID = 1 << 6,
2483 DISTANCE = 1 << 7,
2484 TILT = 1 << 8,
2485 SLOT = 1 << 9,
2486 TOOL_TYPE = 1 << 10,
2487 };
2488
2489 void prepareDisplay(int32_t orientation);
2490 void prepareVirtualKeys();
2491 int32_t toRawX(float displayX);
2492 int32_t toRawY(float displayY);
2493 float toDisplayX(int32_t rawX);
2494 float toDisplayY(int32_t rawY);
2495};
2496
2497const int32_t TouchInputMapperTest::RAW_X_MIN = 25;
2498const int32_t TouchInputMapperTest::RAW_X_MAX = 1019;
2499const int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
2500const int32_t TouchInputMapperTest::RAW_Y_MAX = 1009;
2501const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
2502const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
2503const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
2504const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
2505const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = RAW_TOUCH_MIN;
2506const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = RAW_TOUCH_MAX;
2507const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
2508const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
2509const int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0;
2510const int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7;
2511const int32_t TouchInputMapperTest::RAW_TILT_MIN = 0;
2512const int32_t TouchInputMapperTest::RAW_TILT_MAX = 150;
2513const int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
2514const int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
2515const int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0;
2516const int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9;
2517const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH;
2518const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT;
2519
2520const float TouchInputMapperTest::GEOMETRIC_SCALE =
2521 avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1),
2522 float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1));
2523
2524const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
2525 { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
2526 { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
2527};
2528
2529void TouchInputMapperTest::prepareDisplay(int32_t orientation) {
2530 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation);
2531}
2532
2533void TouchInputMapperTest::prepareVirtualKeys() {
2534 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]);
2535 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]);
2536 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
2537 mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE);
2538}
2539
2540int32_t TouchInputMapperTest::toRawX(float displayX) {
2541 return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN);
2542}
2543
2544int32_t TouchInputMapperTest::toRawY(float displayY) {
2545 return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN);
2546}
2547
2548float TouchInputMapperTest::toDisplayX(int32_t rawX) {
2549 return float(rawX - RAW_X_MIN) * DISPLAY_WIDTH / (RAW_X_MAX - RAW_X_MIN + 1);
2550}
2551
2552float TouchInputMapperTest::toDisplayY(int32_t rawY) {
2553 return float(rawY - RAW_Y_MIN) * DISPLAY_HEIGHT / (RAW_Y_MAX - RAW_Y_MIN + 1);
2554}
2555
2556
2557// --- SingleTouchInputMapperTest ---
2558
2559class SingleTouchInputMapperTest : public TouchInputMapperTest {
2560protected:
2561 void prepareButtons();
2562 void prepareAxes(int axes);
2563
2564 void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
2565 void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
2566 void processUp(SingleTouchInputMapper* mappery);
2567 void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
2568 void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
2569 void processDistance(SingleTouchInputMapper* mapper, int32_t distance);
2570 void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY);
2571 void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value);
2572 void processSync(SingleTouchInputMapper* mapper);
2573};
2574
2575void SingleTouchInputMapperTest::prepareButtons() {
2576 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
2577}
2578
2579void SingleTouchInputMapperTest::prepareAxes(int axes) {
2580 if (axes & POSITION) {
2581 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X,
2582 RAW_X_MIN, RAW_X_MAX, 0, 0);
2583 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y,
2584 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
2585 }
2586 if (axes & PRESSURE) {
2587 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE,
2588 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
2589 }
2590 if (axes & TOOL) {
2591 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH,
2592 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
2593 }
2594 if (axes & DISTANCE) {
2595 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE,
2596 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
2597 }
2598 if (axes & TILT) {
2599 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X,
2600 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
2601 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y,
2602 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
2603 }
2604}
2605
2606void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
2607 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 1);
2608 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x);
2609 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y);
2610}
2611
2612void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
2613 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x);
2614 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y);
2615}
2616
2617void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
2618 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 0);
2619}
2620
2621void SingleTouchInputMapperTest::processPressure(
2622 SingleTouchInputMapper* mapper, int32_t pressure) {
2623 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_PRESSURE, pressure);
2624}
2625
2626void SingleTouchInputMapperTest::processToolMajor(
2627 SingleTouchInputMapper* mapper, int32_t toolMajor) {
2628 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TOOL_WIDTH, toolMajor);
2629}
2630
2631void SingleTouchInputMapperTest::processDistance(
2632 SingleTouchInputMapper* mapper, int32_t distance) {
2633 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_DISTANCE, distance);
2634}
2635
2636void SingleTouchInputMapperTest::processTilt(
2637 SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) {
2638 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_X, tiltX);
2639 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_Y, tiltY);
2640}
2641
2642void SingleTouchInputMapperTest::processKey(
2643 SingleTouchInputMapper* mapper, int32_t code, int32_t value) {
2644 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value);
2645}
2646
2647void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
2648 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2649}
2650
2651
2652TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) {
2653 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2654 prepareButtons();
2655 prepareAxes(POSITION);
2656 addMapperAndConfigure(mapper);
2657
2658 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
2659}
2660
2661TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) {
2662 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2663 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X);
2664 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y);
2665 prepareButtons();
2666 prepareAxes(POSITION);
2667 addMapperAndConfigure(mapper);
2668
2669 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
2670}
2671
2672TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) {
2673 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2674 prepareButtons();
2675 prepareAxes(POSITION);
2676 addConfigurationProperty("touch.deviceType", "touchPad");
2677 addMapperAndConfigure(mapper);
2678
2679 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
2680}
2681
2682TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) {
2683 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2684 prepareButtons();
2685 prepareAxes(POSITION);
2686 addConfigurationProperty("touch.deviceType", "touchScreen");
2687 addMapperAndConfigure(mapper);
2688
2689 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
2690}
2691
2692TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
2693 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2694 addConfigurationProperty("touch.deviceType", "touchScreen");
2695 prepareDisplay(DISPLAY_ORIENTATION_0);
2696 prepareButtons();
2697 prepareAxes(POSITION);
2698 prepareVirtualKeys();
2699 addMapperAndConfigure(mapper);
2700
2701 // Unknown key.
2702 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2703
2704 // Virtual key is down.
2705 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2706 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2707 processDown(mapper, x, y);
2708 processSync(mapper);
2709 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
2710
2711 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
2712
2713 // Virtual key is up.
2714 processUp(mapper);
2715 processSync(mapper);
2716 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
2717
2718 ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
2719}
2720
2721TEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
2722 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2723 addConfigurationProperty("touch.deviceType", "touchScreen");
2724 prepareDisplay(DISPLAY_ORIENTATION_0);
2725 prepareButtons();
2726 prepareAxes(POSITION);
2727 prepareVirtualKeys();
2728 addMapperAndConfigure(mapper);
2729
2730 // Unknown key.
2731 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2732
2733 // Virtual key is down.
2734 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2735 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2736 processDown(mapper, x, y);
2737 processSync(mapper);
2738 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
2739
2740 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
2741
2742 // Virtual key is up.
2743 processUp(mapper);
2744 processSync(mapper);
2745 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
2746
2747 ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
2748}
2749
2750TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
2751 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2752 addConfigurationProperty("touch.deviceType", "touchScreen");
2753 prepareDisplay(DISPLAY_ORIENTATION_0);
2754 prepareButtons();
2755 prepareAxes(POSITION);
2756 prepareVirtualKeys();
2757 addMapperAndConfigure(mapper);
2758
2759 const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
2760 uint8_t flags[2] = { 0, 0 };
2761 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
2762 ASSERT_TRUE(flags[0]);
2763 ASSERT_FALSE(flags[1]);
2764}
2765
2766TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
2767 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2768 addConfigurationProperty("touch.deviceType", "touchScreen");
2769 prepareDisplay(DISPLAY_ORIENTATION_0);
2770 prepareButtons();
2771 prepareAxes(POSITION);
2772 prepareVirtualKeys();
2773 addMapperAndConfigure(mapper);
2774
2775 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2776
2777 NotifyKeyArgs args;
2778
2779 // Press virtual key.
2780 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2781 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2782 processDown(mapper, x, y);
2783 processSync(mapper);
2784
2785 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2786 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2787 ASSERT_EQ(DEVICE_ID, args.deviceId);
2788 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2789 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
2790 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2791 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
2792 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2793 ASSERT_EQ(KEY_HOME, args.scanCode);
2794 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2795 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2796
2797 // Release virtual key.
2798 processUp(mapper);
2799 processSync(mapper);
2800
2801 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2802 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2803 ASSERT_EQ(DEVICE_ID, args.deviceId);
2804 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2805 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
2806 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2807 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
2808 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2809 ASSERT_EQ(KEY_HOME, args.scanCode);
2810 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2811 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2812
2813 // Should not have sent any motions.
2814 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
2815}
2816
2817TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
2818 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2819 addConfigurationProperty("touch.deviceType", "touchScreen");
2820 prepareDisplay(DISPLAY_ORIENTATION_0);
2821 prepareButtons();
2822 prepareAxes(POSITION);
2823 prepareVirtualKeys();
2824 addMapperAndConfigure(mapper);
2825
2826 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2827
2828 NotifyKeyArgs keyArgs;
2829
2830 // Press virtual key.
2831 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2832 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2833 processDown(mapper, x, y);
2834 processSync(mapper);
2835
2836 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2837 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
2838 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
2839 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
2840 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
2841 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2842 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
2843 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
2844 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
2845 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
2846 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
2847
2848 // Move out of bounds. This should generate a cancel and a pointer down since we moved
2849 // into the display area.
2850 y -= 100;
2851 processMove(mapper, x, y);
2852 processSync(mapper);
2853
2854 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2855 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
2856 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
2857 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
2858 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
2859 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2860 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
2861 | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
2862 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
2863 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
2864 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
2865 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
2866
2867 NotifyMotionArgs motionArgs;
2868 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2869 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2870 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2871 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2872 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2873 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2874 ASSERT_EQ(0, motionArgs.flags);
2875 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
2876 ASSERT_EQ(0, motionArgs.buttonState);
2877 ASSERT_EQ(0, motionArgs.edgeFlags);
2878 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
2879 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2880 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
2881 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2882 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
2883 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2884 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2885 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2886
2887 // Keep moving out of bounds. Should generate a pointer move.
2888 y -= 50;
2889 processMove(mapper, x, y);
2890 processSync(mapper);
2891
2892 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2893 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2894 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2895 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2896 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2897 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
2898 ASSERT_EQ(0, motionArgs.flags);
2899 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
2900 ASSERT_EQ(0, motionArgs.buttonState);
2901 ASSERT_EQ(0, motionArgs.edgeFlags);
2902 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
2903 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2904 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
2905 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2906 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
2907 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2908 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2909 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2910
2911 // Release out of bounds. Should generate a pointer up.
2912 processUp(mapper);
2913 processSync(mapper);
2914
2915 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2916 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2917 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2918 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2919 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2920 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2921 ASSERT_EQ(0, motionArgs.flags);
2922 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
2923 ASSERT_EQ(0, motionArgs.buttonState);
2924 ASSERT_EQ(0, motionArgs.edgeFlags);
2925 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
2926 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2927 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
2928 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2929 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
2930 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2931 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2932 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2933
2934 // Should not have sent any more keys or motions.
2935 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
2936 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
2937}
2938
2939TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
2940 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2941 addConfigurationProperty("touch.deviceType", "touchScreen");
2942 prepareDisplay(DISPLAY_ORIENTATION_0);
2943 prepareButtons();
2944 prepareAxes(POSITION);
2945 prepareVirtualKeys();
2946 addMapperAndConfigure(mapper);
2947
2948 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2949
2950 NotifyMotionArgs motionArgs;
2951
2952 // Initially go down out of bounds.
2953 int32_t x = -10;
2954 int32_t y = -10;
2955 processDown(mapper, x, y);
2956 processSync(mapper);
2957
2958 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
2959
2960 // Move into the display area. Should generate a pointer down.
2961 x = 50;
2962 y = 75;
2963 processMove(mapper, x, y);
2964 processSync(mapper);
2965
2966 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2967 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2968 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2969 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2970 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2971 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2972 ASSERT_EQ(0, motionArgs.flags);
2973 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
2974 ASSERT_EQ(0, motionArgs.buttonState);
2975 ASSERT_EQ(0, motionArgs.edgeFlags);
2976 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
2977 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2978 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
2979 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2980 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
2981 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2982 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2983 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2984
2985 // Release. Should generate a pointer up.
2986 processUp(mapper);
2987 processSync(mapper);
2988
2989 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2990 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2991 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2992 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2993 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2994 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2995 ASSERT_EQ(0, motionArgs.flags);
2996 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
2997 ASSERT_EQ(0, motionArgs.buttonState);
2998 ASSERT_EQ(0, motionArgs.edgeFlags);
2999 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3000 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3001 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3002 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3003 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3004 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3005 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3006 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3007
3008 // Should not have sent any more keys or motions.
3009 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3010 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3011}
3012
3013TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
3014 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3015 addConfigurationProperty("touch.deviceType", "touchScreen");
3016 prepareDisplay(DISPLAY_ORIENTATION_0);
3017 prepareButtons();
3018 prepareAxes(POSITION);
3019 prepareVirtualKeys();
3020 addMapperAndConfigure(mapper);
3021
3022 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3023
3024 NotifyMotionArgs motionArgs;
3025
3026 // Down.
3027 int32_t x = 100;
3028 int32_t y = 125;
3029 processDown(mapper, x, y);
3030 processSync(mapper);
3031
3032 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3033 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3034 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3035 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3036 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3037 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3038 ASSERT_EQ(0, motionArgs.flags);
3039 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3040 ASSERT_EQ(0, motionArgs.buttonState);
3041 ASSERT_EQ(0, motionArgs.edgeFlags);
3042 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3043 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3044 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3045 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3046 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3047 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3048 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3049 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3050
3051 // Move.
3052 x += 50;
3053 y += 75;
3054 processMove(mapper, x, y);
3055 processSync(mapper);
3056
3057 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3058 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3059 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3060 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3061 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3062 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3063 ASSERT_EQ(0, motionArgs.flags);
3064 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3065 ASSERT_EQ(0, motionArgs.buttonState);
3066 ASSERT_EQ(0, motionArgs.edgeFlags);
3067 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3068 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3069 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3070 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3071 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3072 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3073 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3074 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3075
3076 // Up.
3077 processUp(mapper);
3078 processSync(mapper);
3079
3080 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3081 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3082 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3083 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3084 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3085 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3086 ASSERT_EQ(0, motionArgs.flags);
3087 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3088 ASSERT_EQ(0, motionArgs.buttonState);
3089 ASSERT_EQ(0, motionArgs.edgeFlags);
3090 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3091 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3092 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3093 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3094 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3095 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3096 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3097 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3098
3099 // Should not have sent any more keys or motions.
3100 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3101 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3102}
3103
3104TEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) {
3105 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3106 addConfigurationProperty("touch.deviceType", "touchScreen");
3107 prepareButtons();
3108 prepareAxes(POSITION);
3109 addConfigurationProperty("touch.orientationAware", "0");
3110 addMapperAndConfigure(mapper);
3111
3112 NotifyMotionArgs args;
3113
3114 // Rotation 90.
3115 prepareDisplay(DISPLAY_ORIENTATION_90);
3116 processDown(mapper, toRawX(50), toRawY(75));
3117 processSync(mapper);
3118
3119 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3120 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3121 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3122
3123 processUp(mapper);
3124 processSync(mapper);
3125 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3126}
3127
3128TEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) {
3129 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3130 addConfigurationProperty("touch.deviceType", "touchScreen");
3131 prepareButtons();
3132 prepareAxes(POSITION);
3133 addMapperAndConfigure(mapper);
3134
3135 NotifyMotionArgs args;
3136
3137 // Rotation 0.
3138 prepareDisplay(DISPLAY_ORIENTATION_0);
3139 processDown(mapper, toRawX(50), toRawY(75));
3140 processSync(mapper);
3141
3142 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3143 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3144 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3145
3146 processUp(mapper);
3147 processSync(mapper);
3148 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3149
3150 // Rotation 90.
3151 prepareDisplay(DISPLAY_ORIENTATION_90);
3152 processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50));
3153 processSync(mapper);
3154
3155 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3156 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3157 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3158
3159 processUp(mapper);
3160 processSync(mapper);
3161 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3162
3163 // Rotation 180.
3164 prepareDisplay(DISPLAY_ORIENTATION_180);
3165 processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN);
3166 processSync(mapper);
3167
3168 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3169 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3170 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3171
3172 processUp(mapper);
3173 processSync(mapper);
3174 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3175
3176 // Rotation 270.
3177 prepareDisplay(DISPLAY_ORIENTATION_270);
3178 processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN);
3179 processSync(mapper);
3180
3181 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3182 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3183 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3184
3185 processUp(mapper);
3186 processSync(mapper);
3187 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3188}
3189
3190TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
3191 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3192 addConfigurationProperty("touch.deviceType", "touchScreen");
3193 prepareDisplay(DISPLAY_ORIENTATION_0);
3194 prepareButtons();
3195 prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT);
3196 addMapperAndConfigure(mapper);
3197
3198 // These calculations are based on the input device calibration documentation.
3199 int32_t rawX = 100;
3200 int32_t rawY = 200;
3201 int32_t rawPressure = 10;
3202 int32_t rawToolMajor = 12;
3203 int32_t rawDistance = 2;
3204 int32_t rawTiltX = 30;
3205 int32_t rawTiltY = 110;
3206
3207 float x = toDisplayX(rawX);
3208 float y = toDisplayY(rawY);
3209 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
3210 float size = float(rawToolMajor) / RAW_TOOL_MAX;
3211 float tool = float(rawToolMajor) * GEOMETRIC_SCALE;
3212 float distance = float(rawDistance);
3213
3214 float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f;
3215 float tiltScale = M_PI / 180;
3216 float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale;
3217 float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale;
3218 float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle));
3219 float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle));
3220
3221 processDown(mapper, rawX, rawY);
3222 processPressure(mapper, rawPressure);
3223 processToolMajor(mapper, rawToolMajor);
3224 processDistance(mapper, rawDistance);
3225 processTilt(mapper, rawTiltX, rawTiltY);
3226 processSync(mapper);
3227
3228 NotifyMotionArgs args;
3229 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3230 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3231 x, y, pressure, size, tool, tool, tool, tool, orientation, distance));
3232 ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT));
3233}
3234
3235TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) {
3236 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3237 addConfigurationProperty("touch.deviceType", "touchScreen");
3238 prepareDisplay(DISPLAY_ORIENTATION_0);
3239 prepareButtons();
3240 prepareAxes(POSITION);
3241 addMapperAndConfigure(mapper);
3242
3243 NotifyMotionArgs motionArgs;
3244 NotifyKeyArgs keyArgs;
3245
3246 processDown(mapper, 100, 200);
3247 processSync(mapper);
3248 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3249 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3250 ASSERT_EQ(0, motionArgs.buttonState);
3251
3252 // press BTN_LEFT, release BTN_LEFT
3253 processKey(mapper, BTN_LEFT, 1);
3254 processSync(mapper);
3255 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3256 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3257 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
3258
3259 processKey(mapper, BTN_LEFT, 0);
3260 processSync(mapper);
3261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3262 ASSERT_EQ(0, motionArgs.buttonState);
3263 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3264
3265 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
3266 processKey(mapper, BTN_RIGHT, 1);
3267 processKey(mapper, BTN_MIDDLE, 1);
3268 processSync(mapper);
3269 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3270 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3271 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
3272 motionArgs.buttonState);
3273
3274 processKey(mapper, BTN_RIGHT, 0);
3275 processSync(mapper);
3276 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3277 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
3278 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3279
3280 processKey(mapper, BTN_MIDDLE, 0);
3281 processSync(mapper);
3282 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3283 ASSERT_EQ(0, motionArgs.buttonState);
3284 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3285
3286 // press BTN_BACK, release BTN_BACK
3287 processKey(mapper, BTN_BACK, 1);
3288 processSync(mapper);
3289 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3290 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3291 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3292 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3293 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
3294 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3295
3296 processKey(mapper, BTN_BACK, 0);
3297 processSync(mapper);
3298 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3299 ASSERT_EQ(0, motionArgs.buttonState);
3300 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3301 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3302 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3303 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3304
3305 // press BTN_SIDE, release BTN_SIDE
3306 processKey(mapper, BTN_SIDE, 1);
3307 processSync(mapper);
3308 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3309 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3310 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3311 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3312 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
3313 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3314
3315 processKey(mapper, BTN_SIDE, 0);
3316 processSync(mapper);
3317 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3318 ASSERT_EQ(0, motionArgs.buttonState);
3319 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3320 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3321 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3322 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3323
3324 // press BTN_FORWARD, release BTN_FORWARD
3325 processKey(mapper, BTN_FORWARD, 1);
3326 processSync(mapper);
3327 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3328 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3329 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3330 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3331 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3332 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3333
3334 processKey(mapper, BTN_FORWARD, 0);
3335 processSync(mapper);
3336 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3337 ASSERT_EQ(0, motionArgs.buttonState);
3338 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3339 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3340 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3341 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3342
3343 // press BTN_EXTRA, release BTN_EXTRA
3344 processKey(mapper, BTN_EXTRA, 1);
3345 processSync(mapper);
3346 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3347 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3348 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3349 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3350 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3351 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3352
3353 processKey(mapper, BTN_EXTRA, 0);
3354 processSync(mapper);
3355 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3356 ASSERT_EQ(0, motionArgs.buttonState);
3357 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3358 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3359 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3360 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3361
3362 // press BTN_STYLUS, release BTN_STYLUS
3363 processKey(mapper, BTN_STYLUS, 1);
3364 processSync(mapper);
3365 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3366 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3367 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState);
3368
3369 processKey(mapper, BTN_STYLUS, 0);
3370 processSync(mapper);
3371 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3372 ASSERT_EQ(0, motionArgs.buttonState);
3373 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3374
3375 // press BTN_STYLUS2, release BTN_STYLUS2
3376 processKey(mapper, BTN_STYLUS2, 1);
3377 processSync(mapper);
3378 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3379 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3380 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
3381
3382 processKey(mapper, BTN_STYLUS2, 0);
3383 processSync(mapper);
3384 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3385 ASSERT_EQ(0, motionArgs.buttonState);
3386 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3387
3388 // release touch
3389 processUp(mapper);
3390 processSync(mapper);
3391 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3392 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3393 ASSERT_EQ(0, motionArgs.buttonState);
3394}
3395
3396TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
3397 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3398 addConfigurationProperty("touch.deviceType", "touchScreen");
3399 prepareDisplay(DISPLAY_ORIENTATION_0);
3400 prepareButtons();
3401 prepareAxes(POSITION);
3402 addMapperAndConfigure(mapper);
3403
3404 NotifyMotionArgs motionArgs;
3405
3406 // default tool type is finger
3407 processDown(mapper, 100, 200);
3408 processSync(mapper);
3409 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3410 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3411 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3412
3413 // eraser
3414 processKey(mapper, BTN_TOOL_RUBBER, 1);
3415 processSync(mapper);
3416 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3417 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3418 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
3419
3420 // stylus
3421 processKey(mapper, BTN_TOOL_RUBBER, 0);
3422 processKey(mapper, BTN_TOOL_PEN, 1);
3423 processSync(mapper);
3424 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3425 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3426 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3427
3428 // brush
3429 processKey(mapper, BTN_TOOL_PEN, 0);
3430 processKey(mapper, BTN_TOOL_BRUSH, 1);
3431 processSync(mapper);
3432 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3433 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3434 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3435
3436 // pencil
3437 processKey(mapper, BTN_TOOL_BRUSH, 0);
3438 processKey(mapper, BTN_TOOL_PENCIL, 1);
3439 processSync(mapper);
3440 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3441 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3442 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3443
3444 // airbrush
3445 processKey(mapper, BTN_TOOL_PENCIL, 0);
3446 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
3447 processSync(mapper);
3448 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3449 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3450 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3451
3452 // mouse
3453 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
3454 processKey(mapper, BTN_TOOL_MOUSE, 1);
3455 processSync(mapper);
3456 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3457 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3458 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
3459
3460 // lens
3461 processKey(mapper, BTN_TOOL_MOUSE, 0);
3462 processKey(mapper, BTN_TOOL_LENS, 1);
3463 processSync(mapper);
3464 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3465 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3466 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
3467
3468 // double-tap
3469 processKey(mapper, BTN_TOOL_LENS, 0);
3470 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
3471 processSync(mapper);
3472 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3473 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3474 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3475
3476 // triple-tap
3477 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
3478 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
3479 processSync(mapper);
3480 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3481 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3482 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3483
3484 // quad-tap
3485 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
3486 processKey(mapper, BTN_TOOL_QUADTAP, 1);
3487 processSync(mapper);
3488 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3489 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3490 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3491
3492 // finger
3493 processKey(mapper, BTN_TOOL_QUADTAP, 0);
3494 processKey(mapper, BTN_TOOL_FINGER, 1);
3495 processSync(mapper);
3496 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3497 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3498 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3499
3500 // stylus trumps finger
3501 processKey(mapper, BTN_TOOL_PEN, 1);
3502 processSync(mapper);
3503 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3504 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3505 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3506
3507 // eraser trumps stylus
3508 processKey(mapper, BTN_TOOL_RUBBER, 1);
3509 processSync(mapper);
3510 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3511 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3512 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
3513
3514 // mouse trumps eraser
3515 processKey(mapper, BTN_TOOL_MOUSE, 1);
3516 processSync(mapper);
3517 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3518 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3519 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
3520
3521 // back to default tool type
3522 processKey(mapper, BTN_TOOL_MOUSE, 0);
3523 processKey(mapper, BTN_TOOL_RUBBER, 0);
3524 processKey(mapper, BTN_TOOL_PEN, 0);
3525 processKey(mapper, BTN_TOOL_FINGER, 0);
3526 processSync(mapper);
3527 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3528 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3529 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3530}
3531
3532TEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
3533 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3534 addConfigurationProperty("touch.deviceType", "touchScreen");
3535 prepareDisplay(DISPLAY_ORIENTATION_0);
3536 prepareButtons();
3537 prepareAxes(POSITION);
3538 mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0);
3539 addMapperAndConfigure(mapper);
3540
3541 NotifyMotionArgs motionArgs;
3542
3543 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
3544 processKey(mapper, BTN_TOOL_FINGER, 1);
3545 processMove(mapper, 100, 200);
3546 processSync(mapper);
3547 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3548 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3549 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3550 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
3551
3552 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3553 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3554 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3555 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
3556
3557 // move a little
3558 processMove(mapper, 150, 250);
3559 processSync(mapper);
3560 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3561 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3562 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3563 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3564
3565 // down when BTN_TOUCH is pressed, pressure defaults to 1
3566 processKey(mapper, BTN_TOUCH, 1);
3567 processSync(mapper);
3568 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3569 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3570 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3571 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3572
3573 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3574 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3575 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3576 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3577
3578 // up when BTN_TOUCH is released, hover restored
3579 processKey(mapper, BTN_TOUCH, 0);
3580 processSync(mapper);
3581 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3582 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3583 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3584 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3585
3586 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3587 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3588 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3589 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3590
3591 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3592 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3593 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3594 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3595
3596 // exit hover when pointer goes away
3597 processKey(mapper, BTN_TOOL_FINGER, 0);
3598 processSync(mapper);
3599 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3600 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3601 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3602 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3603}
3604
3605TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) {
3606 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3607 addConfigurationProperty("touch.deviceType", "touchScreen");
3608 prepareDisplay(DISPLAY_ORIENTATION_0);
3609 prepareButtons();
3610 prepareAxes(POSITION | PRESSURE);
3611 addMapperAndConfigure(mapper);
3612
3613 NotifyMotionArgs motionArgs;
3614
3615 // initially hovering because pressure is 0
3616 processDown(mapper, 100, 200);
3617 processPressure(mapper, 0);
3618 processSync(mapper);
3619 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3620 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3621 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3622 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
3623
3624 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3625 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3626 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3627 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
3628
3629 // move a little
3630 processMove(mapper, 150, 250);
3631 processSync(mapper);
3632 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3633 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3634 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3635 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3636
3637 // down when pressure is non-zero
3638 processPressure(mapper, RAW_PRESSURE_MAX);
3639 processSync(mapper);
3640 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3641 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3642 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3643 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3644
3645 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3646 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3647 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3648 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3649
3650 // up when pressure becomes 0, hover restored
3651 processPressure(mapper, 0);
3652 processSync(mapper);
3653 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3654 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3655 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3656 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3657
3658 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3659 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3660 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3661 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3662
3663 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3664 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3665 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3666 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3667
3668 // exit hover when pointer goes away
3669 processUp(mapper);
3670 processSync(mapper);
3671 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3672 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3673 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3674 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3675}
3676
3677
3678// --- MultiTouchInputMapperTest ---
3679
3680class MultiTouchInputMapperTest : public TouchInputMapperTest {
3681protected:
3682 void prepareAxes(int axes);
3683
3684 void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
3685 void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
3686 void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
3687 void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
3688 void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
3689 void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
3690 void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
3691 void processDistance(MultiTouchInputMapper* mapper, int32_t distance);
3692 void processId(MultiTouchInputMapper* mapper, int32_t id);
3693 void processSlot(MultiTouchInputMapper* mapper, int32_t slot);
3694 void processToolType(MultiTouchInputMapper* mapper, int32_t toolType);
3695 void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value);
3696 void processMTSync(MultiTouchInputMapper* mapper);
3697 void processSync(MultiTouchInputMapper* mapper);
3698 const char *inputSourceToStr(uint32_t source) const;
3699};
3700
3701void MultiTouchInputMapperTest::prepareAxes(int axes) {
3702 if (axes & POSITION) {
3703 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X,
3704 RAW_X_MIN, RAW_X_MAX, 0, 0);
3705 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y,
3706 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
3707 }
3708 if (axes & TOUCH) {
3709 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR,
3710 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
3711 if (axes & MINOR) {
3712 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
3713 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
3714 }
3715 }
3716 if (axes & TOOL) {
3717 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR,
3718 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
3719 if (axes & MINOR) {
3720 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
3721 RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
3722 }
3723 }
3724 if (axes & ORIENTATION) {
3725 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION,
3726 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
3727 }
3728 if (axes & PRESSURE) {
3729 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE,
3730 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
3731 }
3732 if (axes & DISTANCE) {
3733 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE,
3734 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
3735 }
3736 if (axes & ID) {
3737 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
3738 RAW_ID_MIN, RAW_ID_MAX, 0, 0);
3739 }
3740 if (axes & SLOT) {
3741 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT,
3742 RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0);
3743 mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0);
3744 }
3745 if (axes & TOOL_TYPE) {
3746 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE,
3747 0, MT_TOOL_MAX, 0, 0);
3748 }
3749}
3750
3751void MultiTouchInputMapperTest::processPosition(
3752 MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
3753 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_X, x);
3754 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_Y, y);
3755}
3756
3757void MultiTouchInputMapperTest::processTouchMajor(
3758 MultiTouchInputMapper* mapper, int32_t touchMajor) {
3759 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor);
3760}
3761
3762void MultiTouchInputMapperTest::processTouchMinor(
3763 MultiTouchInputMapper* mapper, int32_t touchMinor) {
3764 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor);
3765}
3766
3767void MultiTouchInputMapperTest::processToolMajor(
3768 MultiTouchInputMapper* mapper, int32_t toolMajor) {
3769 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor);
3770}
3771
3772void MultiTouchInputMapperTest::processToolMinor(
3773 MultiTouchInputMapper* mapper, int32_t toolMinor) {
3774 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor);
3775}
3776
3777void MultiTouchInputMapperTest::processOrientation(
3778 MultiTouchInputMapper* mapper, int32_t orientation) {
3779 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_ORIENTATION, orientation);
3780}
3781
3782void MultiTouchInputMapperTest::processPressure(
3783 MultiTouchInputMapper* mapper, int32_t pressure) {
3784 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_PRESSURE, pressure);
3785}
3786
3787void MultiTouchInputMapperTest::processDistance(
3788 MultiTouchInputMapper* mapper, int32_t distance) {
3789 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_DISTANCE, distance);
3790}
3791
3792void MultiTouchInputMapperTest::processId(
3793 MultiTouchInputMapper* mapper, int32_t id) {
3794 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TRACKING_ID, id);
3795}
3796
3797void MultiTouchInputMapperTest::processSlot(
3798 MultiTouchInputMapper* mapper, int32_t slot) {
3799 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_SLOT, slot);
3800}
3801
3802void MultiTouchInputMapperTest::processToolType(
3803 MultiTouchInputMapper* mapper, int32_t toolType) {
3804 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOOL_TYPE, toolType);
3805}
3806
3807void MultiTouchInputMapperTest::processKey(
3808 MultiTouchInputMapper* mapper, int32_t code, int32_t value) {
3809 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value);
3810}
3811
3812void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
3813 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_MT_REPORT, 0);
3814}
3815
3816void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
3817 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
3818}
3819
3820const char *MultiTouchInputMapperTest::inputSourceToStr(uint32_t source) const {
3821 switch (source) {
3822 case AINPUT_SOURCE_UNKNOWN:
3823 return "AINPUT_SOURCE_UNKNOWN";
3824 case AINPUT_SOURCE_KEYBOARD:
3825 return "AINPUT_SOURCE_KEYBOARD";
3826 case AINPUT_SOURCE_DPAD:
3827 return "AINPUT_SOURCE_DPAD";
3828 case AINPUT_SOURCE_GAMEPAD:
3829 return "AINPUT_SOURCE_GAMEPAD";
3830 case AINPUT_SOURCE_TOUCHSCREEN:
3831 return "AINPUT_SOURCE_TOUCHSCREEN";
3832 case AINPUT_SOURCE_MOUSE:
3833 return "AINPUT_SOURCE_MOUSE";
3834 case AINPUT_SOURCE_STYLUS:
3835 return "AINPUT_SOURCE_STYLUS";
3836 case AINPUT_SOURCE_TRACKBALL:
3837 return "AINPUT_SOURCE_TRACKBALL";
3838 case AINPUT_SOURCE_TOUCHPAD:
3839 return "AINPUT_SOURCE_TOUCHPAD";
3840 case AINPUT_SOURCE_JOYSTICK:
3841 return "AINPUT_SOURCE_JOYSTICK";
3842 case AINPUT_SOURCE_ANY:
3843 return "AINPUT_SOURCE_ANY";
3844 default:
3845 return "No matching enum value!";
3846 }
3847}
3848
3849TEST_F(MultiTouchInputMapperTest, DISABLED_Process_NormalMultiTouchGesture_WithoutTrackingIds) {
3850 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
3851 addConfigurationProperty("touch.deviceType", "touchScreen");
3852 prepareDisplay(DISPLAY_ORIENTATION_0);
3853 prepareAxes(POSITION);
3854 prepareVirtualKeys();
3855 addMapperAndConfigure(mapper);
3856
3857 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3858
3859 NotifyMotionArgs motionArgs;
3860
3861 // Two fingers down at once.
3862 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
3863 processPosition(mapper, x1, y1);
3864 processMTSync(mapper);
3865 processPosition(mapper, x2, y2);
3866 processMTSync(mapper);
3867 processSync(mapper);
3868
3869 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3870 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3871 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3872 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source)
3873 << "motionArgs.source=" << inputSourceToStr(motionArgs.source);
3874 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3875 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3876 ASSERT_EQ(0, motionArgs.flags);
3877 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3878 ASSERT_EQ(0, motionArgs.buttonState);
3879 ASSERT_EQ(0, motionArgs.edgeFlags);
3880 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3881 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3882 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3883 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3884 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
3885 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3886 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3887 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3888
3889 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3890 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3891 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3892 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3893 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3894 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
3895 motionArgs.action);
3896 ASSERT_EQ(0, motionArgs.flags);
3897 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3898 ASSERT_EQ(0, motionArgs.buttonState);
3899 ASSERT_EQ(0, motionArgs.edgeFlags);
3900 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
3901 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3902 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3903 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
3904 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
3905 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3906 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
3907 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
3908 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
3909 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3910 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3911 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3912
3913 // Move.
3914 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
3915 processPosition(mapper, x1, y1);
3916 processMTSync(mapper);
3917 processPosition(mapper, x2, y2);
3918 processMTSync(mapper);
3919 processSync(mapper);
3920
3921 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3922 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3923 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3924 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3925 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3926 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3927 ASSERT_EQ(0, motionArgs.flags);
3928 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3929 ASSERT_EQ(0, motionArgs.buttonState);
3930 ASSERT_EQ(0, motionArgs.edgeFlags);
3931 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
3932 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3933 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3934 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
3935 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
3936 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3937 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
3938 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
3939 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
3940 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3941 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3942 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3943
3944 // First finger up.
3945 x2 += 15; y2 -= 20;
3946 processPosition(mapper, x2, y2);
3947 processMTSync(mapper);
3948 processSync(mapper);
3949
3950 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3951 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3952 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3953 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3954 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3955 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
3956 motionArgs.action);
3957 ASSERT_EQ(0, motionArgs.flags);
3958 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3959 ASSERT_EQ(0, motionArgs.buttonState);
3960 ASSERT_EQ(0, motionArgs.edgeFlags);
3961 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
3962 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3963 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3964 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
3965 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
3966 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3967 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
3968 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
3969 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
3970 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3971 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3972 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3973
3974 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3975 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3976 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3977 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3978 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3979 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3980 ASSERT_EQ(0, motionArgs.flags);
3981 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3982 ASSERT_EQ(0, motionArgs.buttonState);
3983 ASSERT_EQ(0, motionArgs.edgeFlags);
3984 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3985 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
3986 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3987 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3988 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
3989 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3990 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3991 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3992
3993 // Move.
3994 x2 += 20; y2 -= 25;
3995 processPosition(mapper, x2, y2);
3996 processMTSync(mapper);
3997 processSync(mapper);
3998
3999 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4000 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4001 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4002 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4003 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4004 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4005 ASSERT_EQ(0, motionArgs.flags);
4006 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4007 ASSERT_EQ(0, motionArgs.buttonState);
4008 ASSERT_EQ(0, motionArgs.edgeFlags);
4009 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4010 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4011 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4012 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4013 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4014 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4015 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4016 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4017
4018 // New finger down.
4019 int32_t x3 = 700, y3 = 300;
4020 processPosition(mapper, x2, y2);
4021 processMTSync(mapper);
4022 processPosition(mapper, x3, y3);
4023 processMTSync(mapper);
4024 processSync(mapper);
4025
4026 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4027 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4028 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4029 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4030 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4031 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4032 motionArgs.action);
4033 ASSERT_EQ(0, motionArgs.flags);
4034 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4035 ASSERT_EQ(0, motionArgs.buttonState);
4036 ASSERT_EQ(0, motionArgs.edgeFlags);
4037 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4038 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4039 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4040 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4041 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4042 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4043 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4044 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4045 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4046 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4047 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4048 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4049
4050 // Second finger up.
4051 x3 += 30; y3 -= 20;
4052 processPosition(mapper, x3, y3);
4053 processMTSync(mapper);
4054 processSync(mapper);
4055
4056 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4057 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4058 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4059 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4060 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4061 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4062 motionArgs.action);
4063 ASSERT_EQ(0, motionArgs.flags);
4064 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4065 ASSERT_EQ(0, motionArgs.buttonState);
4066 ASSERT_EQ(0, motionArgs.edgeFlags);
4067 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4068 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4069 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4070 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4071 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4072 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4073 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4074 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4075 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4076 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4077 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4078 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4079
4080 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4081 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4082 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4083 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4084 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4085 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4086 ASSERT_EQ(0, motionArgs.flags);
4087 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4088 ASSERT_EQ(0, motionArgs.buttonState);
4089 ASSERT_EQ(0, motionArgs.edgeFlags);
4090 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4091 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4092 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4093 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4094 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4095 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4096 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4097 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4098
4099 // Last finger up.
4100 processMTSync(mapper);
4101 processSync(mapper);
4102
4103 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4104 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4105 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4106 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4107 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4108 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4109 ASSERT_EQ(0, motionArgs.flags);
4110 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4111 ASSERT_EQ(0, motionArgs.buttonState);
4112 ASSERT_EQ(0, motionArgs.edgeFlags);
4113 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4114 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4115 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4116 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4117 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4118 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4119 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4120 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4121
4122 // Should not have sent any more keys or motions.
4123 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4124 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4125}
4126
4127TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
4128 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4129 addConfigurationProperty("touch.deviceType", "touchScreen");
4130 prepareDisplay(DISPLAY_ORIENTATION_0);
4131 prepareAxes(POSITION | ID);
4132 prepareVirtualKeys();
4133 addMapperAndConfigure(mapper);
4134
4135 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4136
4137 NotifyMotionArgs motionArgs;
4138
4139 // Two fingers down at once.
4140 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4141 processPosition(mapper, x1, y1);
4142 processId(mapper, 1);
4143 processMTSync(mapper);
4144 processPosition(mapper, x2, y2);
4145 processId(mapper, 2);
4146 processMTSync(mapper);
4147 processSync(mapper);
4148
4149 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4150 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4151 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4152 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4153 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4154 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4155 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4156
4157 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4158 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4159 motionArgs.action);
4160 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4161 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4162 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4163 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4164 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4165 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4166 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4167 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4168 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4169
4170 // Move.
4171 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4172 processPosition(mapper, x1, y1);
4173 processId(mapper, 1);
4174 processMTSync(mapper);
4175 processPosition(mapper, x2, y2);
4176 processId(mapper, 2);
4177 processMTSync(mapper);
4178 processSync(mapper);
4179
4180 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4181 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4182 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4183 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4184 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4185 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4186 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4187 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4188 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4189 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4190 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4191
4192 // First finger up.
4193 x2 += 15; y2 -= 20;
4194 processPosition(mapper, x2, y2);
4195 processId(mapper, 2);
4196 processMTSync(mapper);
4197 processSync(mapper);
4198
4199 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4200 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4201 motionArgs.action);
4202 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4203 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4204 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4205 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4206 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4207 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4208 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4209 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4210 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4211
4212 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4213 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4214 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4215 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4216 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4217 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4218 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4219
4220 // Move.
4221 x2 += 20; y2 -= 25;
4222 processPosition(mapper, x2, y2);
4223 processId(mapper, 2);
4224 processMTSync(mapper);
4225 processSync(mapper);
4226
4227 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4228 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4229 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4230 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4231 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4232 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4233 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4234
4235 // New finger down.
4236 int32_t x3 = 700, y3 = 300;
4237 processPosition(mapper, x2, y2);
4238 processId(mapper, 2);
4239 processMTSync(mapper);
4240 processPosition(mapper, x3, y3);
4241 processId(mapper, 3);
4242 processMTSync(mapper);
4243 processSync(mapper);
4244
4245 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4246 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4247 motionArgs.action);
4248 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4249 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4250 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4251 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4252 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4253 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4254 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4255 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4256 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4257
4258 // Second finger up.
4259 x3 += 30; y3 -= 20;
4260 processPosition(mapper, x3, y3);
4261 processId(mapper, 3);
4262 processMTSync(mapper);
4263 processSync(mapper);
4264
4265 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4266 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4267 motionArgs.action);
4268 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4269 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4270 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4271 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4272 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4273 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4274 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4275 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4276 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4277
4278 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4279 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4280 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4281 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4282 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4283 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4284 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4285
4286 // Last finger up.
4287 processMTSync(mapper);
4288 processSync(mapper);
4289
4290 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4291 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4292 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4293 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4294 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4295 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4296 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4297
4298 // Should not have sent any more keys or motions.
4299 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4300 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4301}
4302
4303TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) {
4304 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4305 addConfigurationProperty("touch.deviceType", "touchScreen");
4306 prepareDisplay(DISPLAY_ORIENTATION_0);
4307 prepareAxes(POSITION | ID | SLOT);
4308 prepareVirtualKeys();
4309 addMapperAndConfigure(mapper);
4310
4311 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4312
4313 NotifyMotionArgs motionArgs;
4314
4315 // Two fingers down at once.
4316 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4317 processPosition(mapper, x1, y1);
4318 processId(mapper, 1);
4319 processSlot(mapper, 1);
4320 processPosition(mapper, x2, y2);
4321 processId(mapper, 2);
4322 processSync(mapper);
4323
4324 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4325 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4326 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4327 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4328 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4329 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4330 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4331
4332 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4333 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4334 motionArgs.action);
4335 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4336 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4337 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4338 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4339 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4340 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4341 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4342 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4343 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4344
4345 // Move.
4346 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4347 processSlot(mapper, 0);
4348 processPosition(mapper, x1, y1);
4349 processSlot(mapper, 1);
4350 processPosition(mapper, x2, y2);
4351 processSync(mapper);
4352
4353 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4354 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4355 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4356 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4357 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4358 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4359 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4360 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4361 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4362 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4363 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4364
4365 // First finger up.
4366 x2 += 15; y2 -= 20;
4367 processSlot(mapper, 0);
4368 processId(mapper, -1);
4369 processSlot(mapper, 1);
4370 processPosition(mapper, x2, y2);
4371 processSync(mapper);
4372
4373 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4374 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4375 motionArgs.action);
4376 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4377 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4378 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4379 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4380 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4381 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4382 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4383 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4384 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4385
4386 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4387 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4388 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4389 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4390 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4391 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4392 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4393
4394 // Move.
4395 x2 += 20; y2 -= 25;
4396 processPosition(mapper, x2, y2);
4397 processSync(mapper);
4398
4399 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4400 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4401 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4402 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4403 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4404 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4405 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4406
4407 // New finger down.
4408 int32_t x3 = 700, y3 = 300;
4409 processPosition(mapper, x2, y2);
4410 processSlot(mapper, 0);
4411 processId(mapper, 3);
4412 processPosition(mapper, x3, y3);
4413 processSync(mapper);
4414
4415 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4416 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4417 motionArgs.action);
4418 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4419 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4420 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4421 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4422 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4423 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4424 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4425 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4426 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4427
4428 // Second finger up.
4429 x3 += 30; y3 -= 20;
4430 processSlot(mapper, 1);
4431 processId(mapper, -1);
4432 processSlot(mapper, 0);
4433 processPosition(mapper, x3, y3);
4434 processSync(mapper);
4435
4436 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4437 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4438 motionArgs.action);
4439 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4440 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4441 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4442 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4443 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4444 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4445 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4446 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4447 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4448
4449 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4450 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4451 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4452 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4453 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4454 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4455 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4456
4457 // Last finger up.
4458 processId(mapper, -1);
4459 processSync(mapper);
4460
4461 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4462 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4463 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4464 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4465 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4466 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4467 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4468
4469 // Should not have sent any more keys or motions.
4470 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4471 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4472}
4473
4474TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
4475 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4476 addConfigurationProperty("touch.deviceType", "touchScreen");
4477 prepareDisplay(DISPLAY_ORIENTATION_0);
4478 prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE);
4479 addMapperAndConfigure(mapper);
4480
4481 // These calculations are based on the input device calibration documentation.
4482 int32_t rawX = 100;
4483 int32_t rawY = 200;
4484 int32_t rawTouchMajor = 7;
4485 int32_t rawTouchMinor = 6;
4486 int32_t rawToolMajor = 9;
4487 int32_t rawToolMinor = 8;
4488 int32_t rawPressure = 11;
4489 int32_t rawDistance = 0;
4490 int32_t rawOrientation = 3;
4491 int32_t id = 5;
4492
4493 float x = toDisplayX(rawX);
4494 float y = toDisplayY(rawY);
4495 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
4496 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
4497 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
4498 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
4499 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
4500 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
4501 float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
4502 float distance = float(rawDistance);
4503
4504 processPosition(mapper, rawX, rawY);
4505 processTouchMajor(mapper, rawTouchMajor);
4506 processTouchMinor(mapper, rawTouchMinor);
4507 processToolMajor(mapper, rawToolMajor);
4508 processToolMinor(mapper, rawToolMinor);
4509 processPressure(mapper, rawPressure);
4510 processOrientation(mapper, rawOrientation);
4511 processDistance(mapper, rawDistance);
4512 processId(mapper, id);
4513 processMTSync(mapper);
4514 processSync(mapper);
4515
4516 NotifyMotionArgs args;
4517 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4518 ASSERT_EQ(0, args.pointerProperties[0].id);
4519 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4520 x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor,
4521 orientation, distance));
4522}
4523
4524TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
4525 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4526 addConfigurationProperty("touch.deviceType", "touchScreen");
4527 prepareDisplay(DISPLAY_ORIENTATION_0);
4528 prepareAxes(POSITION | TOUCH | TOOL | MINOR);
4529 addConfigurationProperty("touch.size.calibration", "geometric");
4530 addMapperAndConfigure(mapper);
4531
4532 // These calculations are based on the input device calibration documentation.
4533 int32_t rawX = 100;
4534 int32_t rawY = 200;
4535 int32_t rawTouchMajor = 140;
4536 int32_t rawTouchMinor = 120;
4537 int32_t rawToolMajor = 180;
4538 int32_t rawToolMinor = 160;
4539
4540 float x = toDisplayX(rawX);
4541 float y = toDisplayY(rawY);
4542 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
4543 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
4544 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
4545 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
4546 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
4547
4548 processPosition(mapper, rawX, rawY);
4549 processTouchMajor(mapper, rawTouchMajor);
4550 processTouchMinor(mapper, rawTouchMinor);
4551 processToolMajor(mapper, rawToolMajor);
4552 processToolMinor(mapper, rawToolMinor);
4553 processMTSync(mapper);
4554 processSync(mapper);
4555
4556 NotifyMotionArgs args;
4557 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4558 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4559 x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0));
4560}
4561
4562TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) {
4563 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4564 addConfigurationProperty("touch.deviceType", "touchScreen");
4565 prepareDisplay(DISPLAY_ORIENTATION_0);
4566 prepareAxes(POSITION | TOUCH | TOOL);
4567 addConfigurationProperty("touch.size.calibration", "diameter");
4568 addConfigurationProperty("touch.size.scale", "10");
4569 addConfigurationProperty("touch.size.bias", "160");
4570 addConfigurationProperty("touch.size.isSummed", "1");
4571 addMapperAndConfigure(mapper);
4572
4573 // These calculations are based on the input device calibration documentation.
4574 // Note: We only provide a single common touch/tool value because the device is assumed
4575 // not to emit separate values for each pointer (isSummed = 1).
4576 int32_t rawX = 100;
4577 int32_t rawY = 200;
4578 int32_t rawX2 = 150;
4579 int32_t rawY2 = 250;
4580 int32_t rawTouchMajor = 5;
4581 int32_t rawToolMajor = 8;
4582
4583 float x = toDisplayX(rawX);
4584 float y = toDisplayY(rawY);
4585 float x2 = toDisplayX(rawX2);
4586 float y2 = toDisplayY(rawY2);
4587 float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX;
4588 float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f;
4589 float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f;
4590
4591 processPosition(mapper, rawX, rawY);
4592 processTouchMajor(mapper, rawTouchMajor);
4593 processToolMajor(mapper, rawToolMajor);
4594 processMTSync(mapper);
4595 processPosition(mapper, rawX2, rawY2);
4596 processTouchMajor(mapper, rawTouchMajor);
4597 processToolMajor(mapper, rawToolMajor);
4598 processMTSync(mapper);
4599 processSync(mapper);
4600
4601 NotifyMotionArgs args;
4602 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4603 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
4604
4605 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4606 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4607 args.action);
4608 ASSERT_EQ(size_t(2), args.pointerCount);
4609 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4610 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
4611 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
4612 x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0));
4613}
4614
4615TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) {
4616 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4617 addConfigurationProperty("touch.deviceType", "touchScreen");
4618 prepareDisplay(DISPLAY_ORIENTATION_0);
4619 prepareAxes(POSITION | TOUCH | TOOL);
4620 addConfigurationProperty("touch.size.calibration", "area");
4621 addConfigurationProperty("touch.size.scale", "43");
4622 addConfigurationProperty("touch.size.bias", "3");
4623 addMapperAndConfigure(mapper);
4624
4625 // These calculations are based on the input device calibration documentation.
4626 int32_t rawX = 100;
4627 int32_t rawY = 200;
4628 int32_t rawTouchMajor = 5;
4629 int32_t rawToolMajor = 8;
4630
4631 float x = toDisplayX(rawX);
4632 float y = toDisplayY(rawY);
4633 float size = float(rawTouchMajor) / RAW_TOUCH_MAX;
4634 float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f;
4635 float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f;
4636
4637 processPosition(mapper, rawX, rawY);
4638 processTouchMajor(mapper, rawTouchMajor);
4639 processToolMajor(mapper, rawToolMajor);
4640 processMTSync(mapper);
4641 processSync(mapper);
4642
4643 NotifyMotionArgs args;
4644 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4645 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4646 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
4647}
4648
4649TEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) {
4650 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4651 addConfigurationProperty("touch.deviceType", "touchScreen");
4652 prepareDisplay(DISPLAY_ORIENTATION_0);
4653 prepareAxes(POSITION | PRESSURE);
4654 addConfigurationProperty("touch.pressure.calibration", "amplitude");
4655 addConfigurationProperty("touch.pressure.scale", "0.01");
4656 addMapperAndConfigure(mapper);
4657
4658 // These calculations are based on the input device calibration documentation.
4659 int32_t rawX = 100;
4660 int32_t rawY = 200;
4661 int32_t rawPressure = 60;
4662
4663 float x = toDisplayX(rawX);
4664 float y = toDisplayY(rawY);
4665 float pressure = float(rawPressure) * 0.01f;
4666
4667 processPosition(mapper, rawX, rawY);
4668 processPressure(mapper, rawPressure);
4669 processMTSync(mapper);
4670 processSync(mapper);
4671
4672 NotifyMotionArgs args;
4673 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4674 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4675 x, y, pressure, 0, 0, 0, 0, 0, 0, 0));
4676}
4677
4678TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) {
4679 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4680 addConfigurationProperty("touch.deviceType", "touchScreen");
4681 prepareDisplay(DISPLAY_ORIENTATION_0);
4682 prepareAxes(POSITION | ID | SLOT);
4683 addMapperAndConfigure(mapper);
4684
4685 NotifyMotionArgs motionArgs;
4686 NotifyKeyArgs keyArgs;
4687
4688 processId(mapper, 1);
4689 processPosition(mapper, 100, 200);
4690 processSync(mapper);
4691 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4692 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4693 ASSERT_EQ(0, motionArgs.buttonState);
4694
4695 // press BTN_LEFT, release BTN_LEFT
4696 processKey(mapper, BTN_LEFT, 1);
4697 processSync(mapper);
4698 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4699 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4700 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4701
4702 processKey(mapper, BTN_LEFT, 0);
4703 processSync(mapper);
4704 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4705 ASSERT_EQ(0, motionArgs.buttonState);
4706 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4707
4708 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
4709 processKey(mapper, BTN_RIGHT, 1);
4710 processKey(mapper, BTN_MIDDLE, 1);
4711 processSync(mapper);
4712 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4713 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4714 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4715 motionArgs.buttonState);
4716
4717 processKey(mapper, BTN_RIGHT, 0);
4718 processSync(mapper);
4719 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4720 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4721 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4722
4723 processKey(mapper, BTN_MIDDLE, 0);
4724 processSync(mapper);
4725 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4726 ASSERT_EQ(0, motionArgs.buttonState);
4727 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4728
4729 // press BTN_BACK, release BTN_BACK
4730 processKey(mapper, BTN_BACK, 1);
4731 processSync(mapper);
4732 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4733 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4734 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4735 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4736 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4737 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4738
4739 processKey(mapper, BTN_BACK, 0);
4740 processSync(mapper);
4741 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4742 ASSERT_EQ(0, motionArgs.buttonState);
4743 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4744 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4745 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4746 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4747
4748 // press BTN_SIDE, release BTN_SIDE
4749 processKey(mapper, BTN_SIDE, 1);
4750 processSync(mapper);
4751 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4752 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4753 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4754 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4755 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4756 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4757
4758 processKey(mapper, BTN_SIDE, 0);
4759 processSync(mapper);
4760 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4761 ASSERT_EQ(0, motionArgs.buttonState);
4762 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4763 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4764 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4765 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4766
4767 // press BTN_FORWARD, release BTN_FORWARD
4768 processKey(mapper, BTN_FORWARD, 1);
4769 processSync(mapper);
4770 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4771 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4772 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4773 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4774 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4775 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4776
4777 processKey(mapper, BTN_FORWARD, 0);
4778 processSync(mapper);
4779 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4780 ASSERT_EQ(0, motionArgs.buttonState);
4781 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4782 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4783 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4784 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4785
4786 // press BTN_EXTRA, release BTN_EXTRA
4787 processKey(mapper, BTN_EXTRA, 1);
4788 processSync(mapper);
4789 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4790 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4791 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4792 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4793 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4794 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4795
4796 processKey(mapper, BTN_EXTRA, 0);
4797 processSync(mapper);
4798 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4799 ASSERT_EQ(0, motionArgs.buttonState);
4800 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4801 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4802 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4803 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4804
4805 // press BTN_STYLUS, release BTN_STYLUS
4806 processKey(mapper, BTN_STYLUS, 1);
4807 processSync(mapper);
4808 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4809 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4810 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState);
4811
4812 processKey(mapper, BTN_STYLUS, 0);
4813 processSync(mapper);
4814 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4815 ASSERT_EQ(0, motionArgs.buttonState);
4816 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4817
4818 // press BTN_STYLUS2, release BTN_STYLUS2
4819 processKey(mapper, BTN_STYLUS2, 1);
4820 processSync(mapper);
4821 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4822 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4823 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4824
4825 processKey(mapper, BTN_STYLUS2, 0);
4826 processSync(mapper);
4827 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4828 ASSERT_EQ(0, motionArgs.buttonState);
4829 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4830
4831 // release touch
4832 processId(mapper, -1);
4833 processSync(mapper);
4834 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4835 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4836 ASSERT_EQ(0, motionArgs.buttonState);
4837}
4838
4839TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
4840 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4841 addConfigurationProperty("touch.deviceType", "touchScreen");
4842 prepareDisplay(DISPLAY_ORIENTATION_0);
4843 prepareAxes(POSITION | ID | SLOT | TOOL_TYPE);
4844 addMapperAndConfigure(mapper);
4845
4846 NotifyMotionArgs motionArgs;
4847
4848 // default tool type is finger
4849 processId(mapper, 1);
4850 processPosition(mapper, 100, 200);
4851 processSync(mapper);
4852 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4853 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4854 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4855
4856 // eraser
4857 processKey(mapper, BTN_TOOL_RUBBER, 1);
4858 processSync(mapper);
4859 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4860 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4861 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4862
4863 // stylus
4864 processKey(mapper, BTN_TOOL_RUBBER, 0);
4865 processKey(mapper, BTN_TOOL_PEN, 1);
4866 processSync(mapper);
4867 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4868 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4869 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4870
4871 // brush
4872 processKey(mapper, BTN_TOOL_PEN, 0);
4873 processKey(mapper, BTN_TOOL_BRUSH, 1);
4874 processSync(mapper);
4875 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4876 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4877 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4878
4879 // pencil
4880 processKey(mapper, BTN_TOOL_BRUSH, 0);
4881 processKey(mapper, BTN_TOOL_PENCIL, 1);
4882 processSync(mapper);
4883 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4884 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4885 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4886
4887 // airbrush
4888 processKey(mapper, BTN_TOOL_PENCIL, 0);
4889 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
4890 processSync(mapper);
4891 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4892 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4893 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4894
4895 // mouse
4896 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
4897 processKey(mapper, BTN_TOOL_MOUSE, 1);
4898 processSync(mapper);
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches