blob: 9b985dc23d7b80aa29ddceeb2f5690b8d83c5224 [file] [log] [blame]
Michael Wrightd02c5b62014-02-10 15:10:22 -08001/*
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
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -070019#include <inttypes.h>
Michael Wrightd02c5b62014-02-10 15:10:22 -080020#include <utils/List.h>
21#include <gtest/gtest.h>
22#include <math.h>
23
24namespace android {
25
26// An arbitrary time value.
27static const nsecs_t ARBITRARY_TIME = 1234;
28
29// Arbitrary display properties.
30static const int32_t DISPLAY_ID = 0;
31static const int32_t DISPLAY_WIDTH = 480;
32static const int32_t DISPLAY_HEIGHT = 800;
Santos Cordonfa5cf462017-04-05 10:37:00 -070033static const int32_t VIRTUAL_DISPLAY_ID = 1;
34static const int32_t VIRTUAL_DISPLAY_WIDTH = 400;
35static const int32_t VIRTUAL_DISPLAY_HEIGHT = 500;
36static const char* VIRTUAL_DISPLAY_UNIQUE_ID = "Vr-display-unique-ID";
Michael Wrightd02c5b62014-02-10 15:10:22 -080037
38// Error tolerance for floating point assertions.
39static const float EPSILON = 0.001f;
40
41template<typename T>
42static inline T min(T a, T b) {
43 return a < b ? a : b;
44}
45
46static inline float avg(float x, float y) {
47 return (x + y) / 2;
48}
49
50
51// --- FakePointerController ---
52
53class FakePointerController : public PointerControllerInterface {
54 bool mHaveBounds;
55 float mMinX, mMinY, mMaxX, mMaxY;
56 float mX, mY;
57 int32_t mButtonState;
58
59protected:
60 virtual ~FakePointerController() { }
61
62public:
63 FakePointerController() :
64 mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0),
65 mButtonState(0) {
66 }
67
68 void setBounds(float minX, float minY, float maxX, float maxY) {
69 mHaveBounds = true;
70 mMinX = minX;
71 mMinY = minY;
72 mMaxX = maxX;
73 mMaxY = maxY;
74 }
75
76 virtual void setPosition(float x, float y) {
77 mX = x;
78 mY = y;
79 }
80
81 virtual void setButtonState(int32_t buttonState) {
82 mButtonState = buttonState;
83 }
84
85 virtual int32_t getButtonState() const {
86 return mButtonState;
87 }
88
89 virtual void getPosition(float* outX, float* outY) const {
90 *outX = mX;
91 *outY = mY;
92 }
93
94private:
95 virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
96 *outMinX = mMinX;
97 *outMinY = mMinY;
98 *outMaxX = mMaxX;
99 *outMaxY = mMaxY;
100 return mHaveBounds;
101 }
102
103 virtual void move(float deltaX, float deltaY) {
104 mX += deltaX;
105 if (mX < mMinX) mX = mMinX;
106 if (mX > mMaxX) mX = mMaxX;
107 mY += deltaY;
108 if (mY < mMinY) mY = mMinY;
109 if (mY > mMaxY) mY = mMaxY;
110 }
111
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100112 virtual void fade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800113 }
114
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100115 virtual void unfade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800116 }
117
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100118 virtual void setPresentation(Presentation) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800119 }
120
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100121 virtual void setSpots(const PointerCoords*, const uint32_t*, BitSet32) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800122 }
123
124 virtual void clearSpots() {
125 }
126};
127
128
129// --- FakeInputReaderPolicy ---
130
131class FakeInputReaderPolicy : public InputReaderPolicyInterface {
132 InputReaderConfiguration mConfig;
133 KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
134 Vector<InputDeviceInfo> mInputDevices;
Jason Gerecke489fda82012-09-07 17:19:40 -0700135 TouchAffineTransformation transform;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800136
137protected:
138 virtual ~FakeInputReaderPolicy() { }
139
140public:
141 FakeInputReaderPolicy() {
142 }
143
Santos Cordonfa5cf462017-04-05 10:37:00 -0700144 void setDisplayViewport(int32_t displayId, int32_t width, int32_t height, int32_t orientation,
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100145 const std::string& uniqueId) {
Santos Cordonfa5cf462017-04-05 10:37:00 -0700146 DisplayViewport v = createDisplayViewport(displayId, width, height, orientation, uniqueId);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800147 // Set the size of both the internal and external display at the same time.
Santos Cordonfa5cf462017-04-05 10:37:00 -0700148 mConfig.setPhysicalDisplayViewport(ViewportType::VIEWPORT_INTERNAL, v);
149 mConfig.setPhysicalDisplayViewport(ViewportType::VIEWPORT_EXTERNAL, v);
150 }
151
152 void setVirtualDisplayViewport(int32_t displayId, int32_t width, int32_t height, int32_t orientation,
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100153 const std::string& uniqueId) {
Santos Cordonfa5cf462017-04-05 10:37:00 -0700154 Vector<DisplayViewport> viewports;
155 viewports.push_back(createDisplayViewport(displayId, width, height, orientation, uniqueId));
156 mConfig.setVirtualDisplayViewports(viewports);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800157 }
158
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100159 void addExcludedDeviceName(const std::string& deviceName) {
160 mConfig.excludedDeviceNames.push_back(deviceName);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800161 }
162
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700163 void addDisabledDevice(int32_t deviceId) {
164 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
165 bool currentlyEnabled = index < 0;
166 if (currentlyEnabled) {
167 mConfig.disabledDevices.add(deviceId);
168 }
169 }
170
171 void removeDisabledDevice(int32_t deviceId) {
172 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
173 bool currentlyEnabled = index < 0;
174 if (!currentlyEnabled) {
175 mConfig.disabledDevices.remove(deviceId);
176 }
177 }
178
Michael Wrightd02c5b62014-02-10 15:10:22 -0800179 void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
180 mPointerControllers.add(deviceId, controller);
181 }
182
183 const InputReaderConfiguration* getReaderConfiguration() const {
184 return &mConfig;
185 }
186
187 const Vector<InputDeviceInfo>& getInputDevices() const {
188 return mInputDevices;
189 }
190
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100191 TouchAffineTransformation getTouchAffineTransformation(const std::string& inputDeviceDescriptor,
Jason Gerecke71b16e82014-03-10 09:47:59 -0700192 int32_t surfaceRotation) {
Jason Gerecke489fda82012-09-07 17:19:40 -0700193 return transform;
194 }
195
196 void setTouchAffineTransformation(const TouchAffineTransformation t) {
197 transform = t;
Jason Gerecke12d6baa2014-01-27 18:34:20 -0800198 }
199
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800200 void setPointerCapture(bool enabled) {
201 mConfig.pointerCapture = enabled;
202 }
203
Michael Wrightd02c5b62014-02-10 15:10:22 -0800204private:
Santos Cordonfa5cf462017-04-05 10:37:00 -0700205 DisplayViewport createDisplayViewport(int32_t displayId, int32_t width, int32_t height,
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100206 int32_t orientation, const std::string& uniqueId) {
Santos Cordonfa5cf462017-04-05 10:37:00 -0700207 bool isRotated = (orientation == DISPLAY_ORIENTATION_90
208 || orientation == DISPLAY_ORIENTATION_270);
209 DisplayViewport v;
210 v.displayId = displayId;
211 v.orientation = orientation;
212 v.logicalLeft = 0;
213 v.logicalTop = 0;
214 v.logicalRight = isRotated ? height : width;
215 v.logicalBottom = isRotated ? width : height;
216 v.physicalLeft = 0;
217 v.physicalTop = 0;
218 v.physicalRight = isRotated ? height : width;
219 v.physicalBottom = isRotated ? width : height;
220 v.deviceWidth = isRotated ? height : width;
221 v.deviceHeight = isRotated ? width : height;
222 v.uniqueId = uniqueId;
223 return v;
224 }
225
Michael Wrightd02c5b62014-02-10 15:10:22 -0800226 virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) {
227 *outConfig = mConfig;
228 }
229
230 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
231 return mPointerControllers.valueFor(deviceId);
232 }
233
234 virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) {
235 mInputDevices = inputDevices;
236 }
237
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100238 virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const InputDeviceIdentifier&) {
Yi Kong9b14ac62018-07-17 13:48:38 -0700239 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800240 }
241
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100242 virtual std::string getDeviceAlias(const InputDeviceIdentifier&) {
243 return "";
Michael Wrightd02c5b62014-02-10 15:10:22 -0800244 }
245};
246
247
248// --- FakeInputListener ---
249
250class FakeInputListener : public InputListenerInterface {
251private:
252 List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue;
253 List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue;
254 List<NotifyKeyArgs> mNotifyKeyArgsQueue;
255 List<NotifyMotionArgs> mNotifyMotionArgsQueue;
256 List<NotifySwitchArgs> mNotifySwitchArgsQueue;
257
258protected:
259 virtual ~FakeInputListener() { }
260
261public:
262 FakeInputListener() {
263 }
264
265 void assertNotifyConfigurationChangedWasCalled(
Yi Kong9b14ac62018-07-17 13:48:38 -0700266 NotifyConfigurationChangedArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800267 ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty())
268 << "Expected notifyConfigurationChanged() to have been called.";
269 if (outEventArgs) {
270 *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin();
271 }
272 mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin());
273 }
274
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700275 void assertNotifyConfigurationChangedWasNotCalled() {
276 ASSERT_TRUE(mNotifyConfigurationChangedArgsQueue.empty())
277 << "Expected notifyConfigurationChanged() to not have been called.";
278 }
279
Michael Wrightd02c5b62014-02-10 15:10:22 -0800280 void assertNotifyDeviceResetWasCalled(
Yi Kong9b14ac62018-07-17 13:48:38 -0700281 NotifyDeviceResetArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800282 ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty())
283 << "Expected notifyDeviceReset() to have been called.";
284 if (outEventArgs) {
285 *outEventArgs = *mNotifyDeviceResetArgsQueue.begin();
286 }
287 mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin());
288 }
289
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700290 void assertNotifyDeviceResetWasNotCalled() {
291 ASSERT_TRUE(mNotifyDeviceResetArgsQueue.empty())
292 << "Expected notifyDeviceReset() to not have been called.";
293 }
294
Yi Kong9b14ac62018-07-17 13:48:38 -0700295 void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800296 ASSERT_FALSE(mNotifyKeyArgsQueue.empty())
297 << "Expected notifyKey() to have been called.";
298 if (outEventArgs) {
299 *outEventArgs = *mNotifyKeyArgsQueue.begin();
300 }
301 mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin());
302 }
303
304 void assertNotifyKeyWasNotCalled() {
305 ASSERT_TRUE(mNotifyKeyArgsQueue.empty())
306 << "Expected notifyKey() to not have been called.";
307 }
308
Yi Kong9b14ac62018-07-17 13:48:38 -0700309 void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800310 ASSERT_FALSE(mNotifyMotionArgsQueue.empty())
311 << "Expected notifyMotion() to have been called.";
312 if (outEventArgs) {
313 *outEventArgs = *mNotifyMotionArgsQueue.begin();
314 }
315 mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin());
316 }
317
318 void assertNotifyMotionWasNotCalled() {
319 ASSERT_TRUE(mNotifyMotionArgsQueue.empty())
320 << "Expected notifyMotion() to not have been called.";
321 }
322
Yi Kong9b14ac62018-07-17 13:48:38 -0700323 void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800324 ASSERT_FALSE(mNotifySwitchArgsQueue.empty())
325 << "Expected notifySwitch() to have been called.";
326 if (outEventArgs) {
327 *outEventArgs = *mNotifySwitchArgsQueue.begin();
328 }
329 mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin());
330 }
331
332private:
333 virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
334 mNotifyConfigurationChangedArgsQueue.push_back(*args);
335 }
336
337 virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) {
338 mNotifyDeviceResetArgsQueue.push_back(*args);
339 }
340
341 virtual void notifyKey(const NotifyKeyArgs* args) {
342 mNotifyKeyArgsQueue.push_back(*args);
343 }
344
345 virtual void notifyMotion(const NotifyMotionArgs* args) {
346 mNotifyMotionArgsQueue.push_back(*args);
347 }
348
349 virtual void notifySwitch(const NotifySwitchArgs* args) {
350 mNotifySwitchArgsQueue.push_back(*args);
351 }
352};
353
354
355// --- FakeEventHub ---
356
357class FakeEventHub : public EventHubInterface {
358 struct KeyInfo {
359 int32_t keyCode;
360 uint32_t flags;
361 };
362
363 struct Device {
364 InputDeviceIdentifier identifier;
365 uint32_t classes;
366 PropertyMap configuration;
367 KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
368 KeyedVector<int, bool> relativeAxes;
369 KeyedVector<int32_t, int32_t> keyCodeStates;
370 KeyedVector<int32_t, int32_t> scanCodeStates;
371 KeyedVector<int32_t, int32_t> switchStates;
372 KeyedVector<int32_t, int32_t> absoluteAxisValue;
373 KeyedVector<int32_t, KeyInfo> keysByScanCode;
374 KeyedVector<int32_t, KeyInfo> keysByUsageCode;
375 KeyedVector<int32_t, bool> leds;
376 Vector<VirtualKeyDefinition> virtualKeys;
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700377 bool enabled;
378
379 status_t enable() {
380 enabled = true;
381 return OK;
382 }
383
384 status_t disable() {
385 enabled = false;
386 return OK;
387 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800388
Chih-Hung Hsieh6ca70ef2016-04-29 16:23:55 -0700389 explicit Device(uint32_t classes) :
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700390 classes(classes), enabled(true) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800391 }
392 };
393
394 KeyedVector<int32_t, Device*> mDevices;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100395 std::vector<std::string> mExcludedDevices;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800396 List<RawEvent> mEvents;
397
398protected:
399 virtual ~FakeEventHub() {
400 for (size_t i = 0; i < mDevices.size(); i++) {
401 delete mDevices.valueAt(i);
402 }
403 }
404
405public:
406 FakeEventHub() { }
407
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100408 void addDevice(int32_t deviceId, const std::string& name, uint32_t classes) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800409 Device* device = new Device(classes);
410 device->identifier.name = name;
411 mDevices.add(deviceId, device);
412
413 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0);
414 }
415
416 void removeDevice(int32_t deviceId) {
417 delete mDevices.valueFor(deviceId);
418 mDevices.removeItem(deviceId);
419
420 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0);
421 }
422
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700423 bool isDeviceEnabled(int32_t deviceId) {
424 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700425 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700426 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
427 return false;
428 }
429 return device->enabled;
430 }
431
432 status_t enableDevice(int32_t deviceId) {
433 status_t result;
434 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700435 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700436 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
437 return BAD_VALUE;
438 }
439 if (device->enabled) {
440 ALOGW("Duplicate call to %s, device %" PRId32 " already enabled", __func__, deviceId);
441 return OK;
442 }
443 result = device->enable();
444 return result;
445 }
446
447 status_t disableDevice(int32_t deviceId) {
448 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700449 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700450 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
451 return BAD_VALUE;
452 }
453 if (!device->enabled) {
454 ALOGW("Duplicate call to %s, device %" PRId32 " already disabled", __func__, deviceId);
455 return OK;
456 }
457 return device->disable();
458 }
459
Michael Wrightd02c5b62014-02-10 15:10:22 -0800460 void finishDeviceScan() {
461 enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0);
462 }
463
464 void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) {
465 Device* device = getDevice(deviceId);
466 device->configuration.addProperty(key, value);
467 }
468
469 void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
470 Device* device = getDevice(deviceId);
471 device->configuration.addAll(configuration);
472 }
473
474 void addAbsoluteAxis(int32_t deviceId, int axis,
475 int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) {
476 Device* device = getDevice(deviceId);
477
478 RawAbsoluteAxisInfo info;
479 info.valid = true;
480 info.minValue = minValue;
481 info.maxValue = maxValue;
482 info.flat = flat;
483 info.fuzz = fuzz;
484 info.resolution = resolution;
485 device->absoluteAxes.add(axis, info);
486 }
487
488 void addRelativeAxis(int32_t deviceId, int32_t axis) {
489 Device* device = getDevice(deviceId);
490 device->relativeAxes.add(axis, true);
491 }
492
493 void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
494 Device* device = getDevice(deviceId);
495 device->keyCodeStates.replaceValueFor(keyCode, state);
496 }
497
498 void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
499 Device* device = getDevice(deviceId);
500 device->scanCodeStates.replaceValueFor(scanCode, state);
501 }
502
503 void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
504 Device* device = getDevice(deviceId);
505 device->switchStates.replaceValueFor(switchCode, state);
506 }
507
508 void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) {
509 Device* device = getDevice(deviceId);
510 device->absoluteAxisValue.replaceValueFor(axis, value);
511 }
512
513 void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
514 int32_t keyCode, uint32_t flags) {
515 Device* device = getDevice(deviceId);
516 KeyInfo info;
517 info.keyCode = keyCode;
518 info.flags = flags;
519 if (scanCode) {
520 device->keysByScanCode.add(scanCode, info);
521 }
522 if (usageCode) {
523 device->keysByUsageCode.add(usageCode, info);
524 }
525 }
526
527 void addLed(int32_t deviceId, int32_t led, bool initialState) {
528 Device* device = getDevice(deviceId);
529 device->leds.add(led, initialState);
530 }
531
532 bool getLedState(int32_t deviceId, int32_t led) {
533 Device* device = getDevice(deviceId);
534 return device->leds.valueFor(led);
535 }
536
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100537 std::vector<std::string>& getExcludedDevices() {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800538 return mExcludedDevices;
539 }
540
541 void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) {
542 Device* device = getDevice(deviceId);
543 device->virtualKeys.push(definition);
544 }
545
546 void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
547 int32_t code, int32_t value) {
548 RawEvent event;
549 event.when = when;
550 event.deviceId = deviceId;
551 event.type = type;
552 event.code = code;
553 event.value = value;
554 mEvents.push_back(event);
555
556 if (type == EV_ABS) {
557 setAbsoluteAxisValue(deviceId, code, value);
558 }
559 }
560
561 void assertQueueIsEmpty() {
562 ASSERT_EQ(size_t(0), mEvents.size())
563 << "Expected the event queue to be empty (fully consumed).";
564 }
565
566private:
567 Device* getDevice(int32_t deviceId) const {
568 ssize_t index = mDevices.indexOfKey(deviceId);
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100569 return index >= 0 ? mDevices.valueAt(index) : nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800570 }
571
572 virtual uint32_t getDeviceClasses(int32_t deviceId) const {
573 Device* device = getDevice(deviceId);
574 return device ? device->classes : 0;
575 }
576
577 virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
578 Device* device = getDevice(deviceId);
579 return device ? device->identifier : InputDeviceIdentifier();
580 }
581
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100582 virtual int32_t getDeviceControllerNumber(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800583 return 0;
584 }
585
586 virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
587 Device* device = getDevice(deviceId);
588 if (device) {
589 *outConfiguration = device->configuration;
590 }
591 }
592
593 virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
594 RawAbsoluteAxisInfo* outAxisInfo) const {
595 Device* device = getDevice(deviceId);
596 if (device) {
597 ssize_t index = device->absoluteAxes.indexOfKey(axis);
598 if (index >= 0) {
599 *outAxisInfo = device->absoluteAxes.valueAt(index);
600 return OK;
601 }
602 }
603 outAxisInfo->clear();
604 return -1;
605 }
606
607 virtual bool hasRelativeAxis(int32_t deviceId, int axis) const {
608 Device* device = getDevice(deviceId);
609 if (device) {
610 return device->relativeAxes.indexOfKey(axis) >= 0;
611 }
612 return false;
613 }
614
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100615 virtual bool hasInputProperty(int32_t, int) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800616 return false;
617 }
618
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700619 virtual status_t mapKey(int32_t deviceId,
620 int32_t scanCode, int32_t usageCode, int32_t metaState,
621 int32_t* outKeycode, int32_t *outMetaState, uint32_t* outFlags) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800622 Device* device = getDevice(deviceId);
623 if (device) {
624 const KeyInfo* key = getKey(device, scanCode, usageCode);
625 if (key) {
626 if (outKeycode) {
627 *outKeycode = key->keyCode;
628 }
629 if (outFlags) {
630 *outFlags = key->flags;
631 }
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700632 if (outMetaState) {
633 *outMetaState = metaState;
634 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800635 return OK;
636 }
637 }
638 return NAME_NOT_FOUND;
639 }
640
641 const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const {
642 if (usageCode) {
643 ssize_t index = device->keysByUsageCode.indexOfKey(usageCode);
644 if (index >= 0) {
645 return &device->keysByUsageCode.valueAt(index);
646 }
647 }
648 if (scanCode) {
649 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
650 if (index >= 0) {
651 return &device->keysByScanCode.valueAt(index);
652 }
653 }
Yi Kong9b14ac62018-07-17 13:48:38 -0700654 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800655 }
656
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100657 virtual status_t mapAxis(int32_t, int32_t, AxisInfo*) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800658 return NAME_NOT_FOUND;
659 }
660
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100661 virtual void setExcludedDevices(const std::vector<std::string>& devices) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800662 mExcludedDevices = devices;
663 }
664
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100665 virtual size_t getEvents(int, RawEvent* buffer, size_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800666 if (mEvents.empty()) {
667 return 0;
668 }
669
670 *buffer = *mEvents.begin();
671 mEvents.erase(mEvents.begin());
672 return 1;
673 }
674
675 virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
676 Device* device = getDevice(deviceId);
677 if (device) {
678 ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
679 if (index >= 0) {
680 return device->scanCodeStates.valueAt(index);
681 }
682 }
683 return AKEY_STATE_UNKNOWN;
684 }
685
686 virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const {
687 Device* device = getDevice(deviceId);
688 if (device) {
689 ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
690 if (index >= 0) {
691 return device->keyCodeStates.valueAt(index);
692 }
693 }
694 return AKEY_STATE_UNKNOWN;
695 }
696
697 virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const {
698 Device* device = getDevice(deviceId);
699 if (device) {
700 ssize_t index = device->switchStates.indexOfKey(sw);
701 if (index >= 0) {
702 return device->switchStates.valueAt(index);
703 }
704 }
705 return AKEY_STATE_UNKNOWN;
706 }
707
708 virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis,
709 int32_t* outValue) const {
710 Device* device = getDevice(deviceId);
711 if (device) {
712 ssize_t index = device->absoluteAxisValue.indexOfKey(axis);
713 if (index >= 0) {
714 *outValue = device->absoluteAxisValue.valueAt(index);
715 return OK;
716 }
717 }
718 *outValue = 0;
719 return -1;
720 }
721
722 virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
723 uint8_t* outFlags) const {
724 bool result = false;
725 Device* device = getDevice(deviceId);
726 if (device) {
727 for (size_t i = 0; i < numCodes; i++) {
728 for (size_t j = 0; j < device->keysByScanCode.size(); j++) {
729 if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) {
730 outFlags[i] = 1;
731 result = true;
732 }
733 }
734 for (size_t j = 0; j < device->keysByUsageCode.size(); j++) {
735 if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) {
736 outFlags[i] = 1;
737 result = true;
738 }
739 }
740 }
741 }
742 return result;
743 }
744
745 virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const {
746 Device* device = getDevice(deviceId);
747 if (device) {
748 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
749 return index >= 0;
750 }
751 return false;
752 }
753
754 virtual bool hasLed(int32_t deviceId, int32_t led) const {
755 Device* device = getDevice(deviceId);
756 return device && device->leds.indexOfKey(led) >= 0;
757 }
758
759 virtual void setLedState(int32_t deviceId, int32_t led, bool on) {
760 Device* device = getDevice(deviceId);
761 if (device) {
762 ssize_t index = device->leds.indexOfKey(led);
763 if (index >= 0) {
764 device->leds.replaceValueAt(led, on);
765 } else {
766 ADD_FAILURE()
767 << "Attempted to set the state of an LED that the EventHub declared "
768 "was not present. led=" << led;
769 }
770 }
771 }
772
773 virtual void getVirtualKeyDefinitions(int32_t deviceId,
774 Vector<VirtualKeyDefinition>& outVirtualKeys) const {
775 outVirtualKeys.clear();
776
777 Device* device = getDevice(deviceId);
778 if (device) {
779 outVirtualKeys.appendVector(device->virtualKeys);
780 }
781 }
782
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100783 virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t) const {
Yi Kong9b14ac62018-07-17 13:48:38 -0700784 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800785 }
786
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100787 virtual bool setKeyboardLayoutOverlay(int32_t, const sp<KeyCharacterMap>&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800788 return false;
789 }
790
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100791 virtual void vibrate(int32_t, nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800792 }
793
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100794 virtual void cancelVibrate(int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800795 }
796
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100797 virtual bool isExternal(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800798 return false;
799 }
800
Siarhei Vishniakouf93fcf42017-11-22 16:00:14 -0800801 virtual void dump(std::string&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800802 }
803
804 virtual void monitor() {
805 }
806
807 virtual void requestReopenDevices() {
808 }
809
810 virtual void wake() {
811 }
812};
813
814
815// --- FakeInputReaderContext ---
816
817class FakeInputReaderContext : public InputReaderContext {
818 sp<EventHubInterface> mEventHub;
819 sp<InputReaderPolicyInterface> mPolicy;
820 sp<InputListenerInterface> mListener;
821 int32_t mGlobalMetaState;
822 bool mUpdateGlobalMetaStateWasCalled;
823 int32_t mGeneration;
824
825public:
826 FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
827 const sp<InputReaderPolicyInterface>& policy,
828 const sp<InputListenerInterface>& listener) :
829 mEventHub(eventHub), mPolicy(policy), mListener(listener),
830 mGlobalMetaState(0) {
831 }
832
833 virtual ~FakeInputReaderContext() { }
834
835 void assertUpdateGlobalMetaStateWasCalled() {
836 ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
837 << "Expected updateGlobalMetaState() to have been called.";
838 mUpdateGlobalMetaStateWasCalled = false;
839 }
840
841 void setGlobalMetaState(int32_t state) {
842 mGlobalMetaState = state;
843 }
844
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800845 uint32_t getGeneration() {
846 return mGeneration;
847 }
848
Michael Wrightd02c5b62014-02-10 15:10:22 -0800849private:
850 virtual void updateGlobalMetaState() {
851 mUpdateGlobalMetaStateWasCalled = true;
852 }
853
854 virtual int32_t getGlobalMetaState() {
855 return mGlobalMetaState;
856 }
857
858 virtual EventHubInterface* getEventHub() {
859 return mEventHub.get();
860 }
861
862 virtual InputReaderPolicyInterface* getPolicy() {
863 return mPolicy.get();
864 }
865
866 virtual InputListenerInterface* getListener() {
867 return mListener.get();
868 }
869
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100870 virtual void disableVirtualKeysUntil(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800871 }
872
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100873 virtual bool shouldDropVirtualKey(nsecs_t, InputDevice*, int32_t, int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800874 return false;
875 }
876
877 virtual void fadePointer() {
878 }
879
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100880 virtual void requestTimeoutAtTime(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800881 }
882
883 virtual int32_t bumpGeneration() {
884 return ++mGeneration;
885 }
Michael Wright842500e2015-03-13 17:32:02 -0700886
887 virtual void getExternalStylusDevices(Vector<InputDeviceInfo>& outDevices) {
888
889 }
890
891 virtual void dispatchExternalStylusState(const StylusState&) {
892
893 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800894};
895
896
897// --- FakeInputMapper ---
898
899class FakeInputMapper : public InputMapper {
900 uint32_t mSources;
901 int32_t mKeyboardType;
902 int32_t mMetaState;
903 KeyedVector<int32_t, int32_t> mKeyCodeStates;
904 KeyedVector<int32_t, int32_t> mScanCodeStates;
905 KeyedVector<int32_t, int32_t> mSwitchStates;
906 Vector<int32_t> mSupportedKeyCodes;
907 RawEvent mLastEvent;
908
909 bool mConfigureWasCalled;
910 bool mResetWasCalled;
911 bool mProcessWasCalled;
912
913public:
914 FakeInputMapper(InputDevice* device, uint32_t sources) :
915 InputMapper(device),
916 mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
917 mMetaState(0),
918 mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
919 }
920
921 virtual ~FakeInputMapper() { }
922
923 void setKeyboardType(int32_t keyboardType) {
924 mKeyboardType = keyboardType;
925 }
926
927 void setMetaState(int32_t metaState) {
928 mMetaState = metaState;
929 }
930
931 void assertConfigureWasCalled() {
932 ASSERT_TRUE(mConfigureWasCalled)
933 << "Expected configure() to have been called.";
934 mConfigureWasCalled = false;
935 }
936
937 void assertResetWasCalled() {
938 ASSERT_TRUE(mResetWasCalled)
939 << "Expected reset() to have been called.";
940 mResetWasCalled = false;
941 }
942
Yi Kong9b14ac62018-07-17 13:48:38 -0700943 void assertProcessWasCalled(RawEvent* outLastEvent = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800944 ASSERT_TRUE(mProcessWasCalled)
945 << "Expected process() to have been called.";
946 if (outLastEvent) {
947 *outLastEvent = mLastEvent;
948 }
949 mProcessWasCalled = false;
950 }
951
952 void setKeyCodeState(int32_t keyCode, int32_t state) {
953 mKeyCodeStates.replaceValueFor(keyCode, state);
954 }
955
956 void setScanCodeState(int32_t scanCode, int32_t state) {
957 mScanCodeStates.replaceValueFor(scanCode, state);
958 }
959
960 void setSwitchState(int32_t switchCode, int32_t state) {
961 mSwitchStates.replaceValueFor(switchCode, state);
962 }
963
964 void addSupportedKeyCode(int32_t keyCode) {
965 mSupportedKeyCodes.add(keyCode);
966 }
967
968private:
969 virtual uint32_t getSources() {
970 return mSources;
971 }
972
973 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
974 InputMapper::populateDeviceInfo(deviceInfo);
975
976 if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
977 deviceInfo->setKeyboardType(mKeyboardType);
978 }
979 }
980
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100981 virtual void configure(nsecs_t, const InputReaderConfiguration*, uint32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800982 mConfigureWasCalled = true;
983 }
984
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100985 virtual void reset(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800986 mResetWasCalled = true;
987 }
988
989 virtual void process(const RawEvent* rawEvent) {
990 mLastEvent = *rawEvent;
991 mProcessWasCalled = true;
992 }
993
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100994 virtual int32_t getKeyCodeState(uint32_t, int32_t keyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800995 ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
996 return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
997 }
998
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100999 virtual int32_t getScanCodeState(uint32_t, int32_t scanCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001000 ssize_t index = mScanCodeStates.indexOfKey(scanCode);
1001 return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1002 }
1003
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001004 virtual int32_t getSwitchState(uint32_t, int32_t switchCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001005 ssize_t index = mSwitchStates.indexOfKey(switchCode);
1006 return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1007 }
1008
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001009 virtual bool markSupportedKeyCodes(uint32_t, size_t numCodes,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001010 const int32_t* keyCodes, uint8_t* outFlags) {
1011 bool result = false;
1012 for (size_t i = 0; i < numCodes; i++) {
1013 for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
1014 if (keyCodes[i] == mSupportedKeyCodes[j]) {
1015 outFlags[i] = 1;
1016 result = true;
1017 }
1018 }
1019 }
1020 return result;
1021 }
1022
1023 virtual int32_t getMetaState() {
1024 return mMetaState;
1025 }
1026
1027 virtual void fadePointer() {
1028 }
1029};
1030
1031
1032// --- InstrumentedInputReader ---
1033
1034class InstrumentedInputReader : public InputReader {
1035 InputDevice* mNextDevice;
1036
1037public:
1038 InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
1039 const sp<InputReaderPolicyInterface>& policy,
1040 const sp<InputListenerInterface>& listener) :
1041 InputReader(eventHub, policy, listener),
Yi Kong9b14ac62018-07-17 13:48:38 -07001042 mNextDevice(nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001043 }
1044
1045 virtual ~InstrumentedInputReader() {
1046 if (mNextDevice) {
1047 delete mNextDevice;
1048 }
1049 }
1050
1051 void setNextDevice(InputDevice* device) {
1052 mNextDevice = device;
1053 }
1054
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001055 InputDevice* newDevice(int32_t deviceId, int32_t controllerNumber, const std::string& name,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001056 uint32_t classes) {
1057 InputDeviceIdentifier identifier;
1058 identifier.name = name;
1059 int32_t generation = deviceId + 1;
1060 return new InputDevice(&mContext, deviceId, generation, controllerNumber, identifier,
1061 classes);
1062 }
1063
1064protected:
1065 virtual InputDevice* createDeviceLocked(int32_t deviceId, int32_t controllerNumber,
1066 const InputDeviceIdentifier& identifier, uint32_t classes) {
1067 if (mNextDevice) {
1068 InputDevice* device = mNextDevice;
Yi Kong9b14ac62018-07-17 13:48:38 -07001069 mNextDevice = nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001070 return device;
1071 }
1072 return InputReader::createDeviceLocked(deviceId, controllerNumber, identifier, classes);
1073 }
1074
1075 friend class InputReaderTest;
1076};
1077
1078
1079// --- InputReaderTest ---
1080
1081class InputReaderTest : public testing::Test {
1082protected:
1083 sp<FakeInputListener> mFakeListener;
1084 sp<FakeInputReaderPolicy> mFakePolicy;
1085 sp<FakeEventHub> mFakeEventHub;
1086 sp<InstrumentedInputReader> mReader;
1087
1088 virtual void SetUp() {
1089 mFakeEventHub = new FakeEventHub();
1090 mFakePolicy = new FakeInputReaderPolicy();
1091 mFakeListener = new FakeInputListener();
1092
1093 mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener);
1094 }
1095
1096 virtual void TearDown() {
1097 mReader.clear();
1098
1099 mFakeListener.clear();
1100 mFakePolicy.clear();
1101 mFakeEventHub.clear();
1102 }
1103
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001104 void addDevice(int32_t deviceId, const std::string& name, uint32_t classes,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001105 const PropertyMap* configuration) {
1106 mFakeEventHub->addDevice(deviceId, name, classes);
1107
1108 if (configuration) {
1109 mFakeEventHub->addConfigurationMap(deviceId, configuration);
1110 }
1111 mFakeEventHub->finishDeviceScan();
1112 mReader->loopOnce();
1113 mReader->loopOnce();
1114 mFakeEventHub->assertQueueIsEmpty();
1115 }
1116
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001117 void disableDevice(int32_t deviceId, InputDevice* device) {
1118 mFakePolicy->addDisabledDevice(deviceId);
1119 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1120 }
1121
1122 void enableDevice(int32_t deviceId, InputDevice* device) {
1123 mFakePolicy->removeDisabledDevice(deviceId);
1124 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1125 }
1126
1127 void configureDevice(uint32_t changes, InputDevice* device) {
1128 device->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1129 }
1130
Michael Wrightd02c5b62014-02-10 15:10:22 -08001131 FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, int32_t controllerNumber,
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001132 const std::string& name, uint32_t classes, uint32_t sources,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001133 const PropertyMap* configuration) {
1134 InputDevice* device = mReader->newDevice(deviceId, controllerNumber, name, classes);
1135 FakeInputMapper* mapper = new FakeInputMapper(device, sources);
1136 device->addMapper(mapper);
1137 mReader->setNextDevice(device);
1138 addDevice(deviceId, name, classes, configuration);
1139 return mapper;
1140 }
1141};
1142
1143TEST_F(InputReaderTest, GetInputDevices) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001144 ASSERT_NO_FATAL_FAILURE(addDevice(1, "keyboard",
Yi Kong9b14ac62018-07-17 13:48:38 -07001145 INPUT_DEVICE_CLASS_KEYBOARD, nullptr));
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001146 ASSERT_NO_FATAL_FAILURE(addDevice(2, "ignored",
Yi Kong9b14ac62018-07-17 13:48:38 -07001147 0, nullptr)); // no classes so device will be ignored
Michael Wrightd02c5b62014-02-10 15:10:22 -08001148
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001149
Michael Wrightd02c5b62014-02-10 15:10:22 -08001150 Vector<InputDeviceInfo> inputDevices;
1151 mReader->getInputDevices(inputDevices);
1152
1153 ASSERT_EQ(1U, inputDevices.size());
1154 ASSERT_EQ(1, inputDevices[0].getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001155 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001156 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1157 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1158 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1159
1160 // Should also have received a notification describing the new input devices.
1161 inputDevices = mFakePolicy->getInputDevices();
1162 ASSERT_EQ(1U, inputDevices.size());
1163 ASSERT_EQ(1, inputDevices[0].getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001164 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001165 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1166 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1167 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1168}
1169
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001170TEST_F(InputReaderTest, WhenEnabledChanges_SendsDeviceResetNotification) {
1171 constexpr int32_t deviceId = 1;
1172 constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001173 InputDevice* device = mReader->newDevice(deviceId, 0, "fake", deviceClass);
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001174 // Must add at least one mapper or the device will be ignored!
1175 FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_KEYBOARD);
1176 device->addMapper(mapper);
1177 mReader->setNextDevice(device);
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001178 addDevice(deviceId, "fake", deviceClass, nullptr);
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001179
Yi Kong9b14ac62018-07-17 13:48:38 -07001180 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(nullptr));
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001181
1182 NotifyDeviceResetArgs resetArgs;
1183 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1184 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1185 ASSERT_EQ(deviceId, resetArgs.deviceId);
1186
1187 ASSERT_EQ(device->isEnabled(), true);
1188 disableDevice(deviceId, device);
1189 mReader->loopOnce();
1190
1191 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1192 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1193 ASSERT_EQ(deviceId, resetArgs.deviceId);
1194 ASSERT_EQ(device->isEnabled(), false);
1195
1196 disableDevice(deviceId, device);
1197 mReader->loopOnce();
1198 mFakeListener->assertNotifyDeviceResetWasNotCalled();
1199 mFakeListener->assertNotifyConfigurationChangedWasNotCalled();
1200 ASSERT_EQ(device->isEnabled(), false);
1201
1202 enableDevice(deviceId, device);
1203 mReader->loopOnce();
1204 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1205 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1206 ASSERT_EQ(deviceId, resetArgs.deviceId);
1207 ASSERT_EQ(device->isEnabled(), true);
1208}
1209
Michael Wrightd02c5b62014-02-10 15:10:22 -08001210TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001211 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001212 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001213 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001214 mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1215
1216 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
1217 AINPUT_SOURCE_ANY, AKEYCODE_A))
1218 << "Should return unknown when the device id is >= 0 but unknown.";
1219
1220 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
1221 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1222 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1223
1224 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
1225 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1226 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1227
1228 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
1229 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1230 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1231
1232 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
1233 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1234 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1235}
1236
1237TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001238 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001239 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001240 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001241 mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
1242
1243 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
1244 AINPUT_SOURCE_ANY, KEY_A))
1245 << "Should return unknown when the device id is >= 0 but unknown.";
1246
1247 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
1248 AINPUT_SOURCE_TRACKBALL, KEY_A))
1249 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1250
1251 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
1252 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1253 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1254
1255 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
1256 AINPUT_SOURCE_TRACKBALL, KEY_A))
1257 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1258
1259 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
1260 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1261 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1262}
1263
1264TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001265 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001266 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001267 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001268 mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
1269
1270 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
1271 AINPUT_SOURCE_ANY, SW_LID))
1272 << "Should return unknown when the device id is >= 0 but unknown.";
1273
1274 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
1275 AINPUT_SOURCE_TRACKBALL, SW_LID))
1276 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1277
1278 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
1279 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1280 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1281
1282 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
1283 AINPUT_SOURCE_TRACKBALL, SW_LID))
1284 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1285
1286 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
1287 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1288 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1289}
1290
1291TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001292 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001293 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001294 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001295
Michael Wrightd02c5b62014-02-10 15:10:22 -08001296 mapper->addSupportedKeyCode(AKEYCODE_A);
1297 mapper->addSupportedKeyCode(AKEYCODE_B);
1298
1299 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1300 uint8_t flags[4] = { 0, 0, 0, 1 };
1301
1302 ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
1303 << "Should return false when device id is >= 0 but unknown.";
1304 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1305
1306 flags[3] = 1;
1307 ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1308 << "Should return false when device id is valid but the sources are not supported by the device.";
1309 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1310
1311 flags[3] = 1;
1312 ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1313 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1314 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1315
1316 flags[3] = 1;
1317 ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1318 << "Should return false when the device id is < 0 but the sources are not supported by any device.";
1319 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1320
1321 flags[3] = 1;
1322 ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1323 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1324 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1325}
1326
1327TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001328 addDevice(1, "ignored", INPUT_DEVICE_CLASS_KEYBOARD, nullptr);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001329
1330 NotifyConfigurationChangedArgs args;
1331
1332 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args));
1333 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1334}
1335
1336TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001337 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001338 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001339 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001340
1341 mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1);
1342 mReader->loopOnce();
1343 ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
1344
1345 RawEvent event;
1346 ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
1347 ASSERT_EQ(0, event.when);
1348 ASSERT_EQ(1, event.deviceId);
1349 ASSERT_EQ(EV_KEY, event.type);
1350 ASSERT_EQ(KEY_A, event.code);
1351 ASSERT_EQ(1, event.value);
1352}
1353
1354
1355// --- InputDeviceTest ---
1356
1357class InputDeviceTest : public testing::Test {
1358protected:
1359 static const char* DEVICE_NAME;
1360 static const int32_t DEVICE_ID;
1361 static const int32_t DEVICE_GENERATION;
1362 static const int32_t DEVICE_CONTROLLER_NUMBER;
1363 static const uint32_t DEVICE_CLASSES;
1364
1365 sp<FakeEventHub> mFakeEventHub;
1366 sp<FakeInputReaderPolicy> mFakePolicy;
1367 sp<FakeInputListener> mFakeListener;
1368 FakeInputReaderContext* mFakeContext;
1369
1370 InputDevice* mDevice;
1371
1372 virtual void SetUp() {
1373 mFakeEventHub = new FakeEventHub();
1374 mFakePolicy = new FakeInputReaderPolicy();
1375 mFakeListener = new FakeInputListener();
1376 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1377
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001378 mFakeEventHub->addDevice(DEVICE_ID, DEVICE_NAME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001379 InputDeviceIdentifier identifier;
1380 identifier.name = DEVICE_NAME;
1381 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1382 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1383 }
1384
1385 virtual void TearDown() {
1386 delete mDevice;
1387
1388 delete mFakeContext;
1389 mFakeListener.clear();
1390 mFakePolicy.clear();
1391 mFakeEventHub.clear();
1392 }
1393};
1394
1395const char* InputDeviceTest::DEVICE_NAME = "device";
1396const int32_t InputDeviceTest::DEVICE_ID = 1;
1397const int32_t InputDeviceTest::DEVICE_GENERATION = 2;
1398const int32_t InputDeviceTest::DEVICE_CONTROLLER_NUMBER = 0;
1399const uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD
1400 | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK;
1401
1402TEST_F(InputDeviceTest, ImmutableProperties) {
1403 ASSERT_EQ(DEVICE_ID, mDevice->getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001404 ASSERT_STREQ(DEVICE_NAME, mDevice->getName().c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001405 ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses());
1406}
1407
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001408TEST_F(InputDeviceTest, WhenDeviceCreated_EnabledIsTrue) {
1409 ASSERT_EQ(mDevice->isEnabled(), true);
1410}
1411
Michael Wrightd02c5b62014-02-10 15:10:22 -08001412TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
1413 // Configuration.
1414 InputReaderConfiguration config;
1415 mDevice->configure(ARBITRARY_TIME, &config, 0);
1416
1417 // Reset.
1418 mDevice->reset(ARBITRARY_TIME);
1419
1420 NotifyDeviceResetArgs resetArgs;
1421 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1422 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1423 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1424
1425 // Metadata.
1426 ASSERT_TRUE(mDevice->isIgnored());
1427 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources());
1428
1429 InputDeviceInfo info;
1430 mDevice->getDeviceInfo(&info);
1431 ASSERT_EQ(DEVICE_ID, info.getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001432 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001433 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType());
1434 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
1435
1436 // State queries.
1437 ASSERT_EQ(0, mDevice->getMetaState());
1438
1439 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1440 << "Ignored device should return unknown key code state.";
1441 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1442 << "Ignored device should return unknown scan code state.";
1443 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
1444 << "Ignored device should return unknown switch state.";
1445
1446 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1447 uint8_t flags[2] = { 0, 1 };
1448 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
1449 << "Ignored device should never mark any key codes.";
1450 ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
1451 ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
1452}
1453
1454TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
1455 // Configuration.
1456 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value"));
1457
1458 FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
1459 mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1460 mapper1->setMetaState(AMETA_ALT_ON);
1461 mapper1->addSupportedKeyCode(AKEYCODE_A);
1462 mapper1->addSupportedKeyCode(AKEYCODE_B);
1463 mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1464 mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
1465 mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
1466 mapper1->setScanCodeState(3, AKEY_STATE_UP);
1467 mapper1->setSwitchState(4, AKEY_STATE_DOWN);
1468 mDevice->addMapper(mapper1);
1469
1470 FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
1471 mapper2->setMetaState(AMETA_SHIFT_ON);
1472 mDevice->addMapper(mapper2);
1473
1474 InputReaderConfiguration config;
1475 mDevice->configure(ARBITRARY_TIME, &config, 0);
1476
1477 String8 propertyValue;
1478 ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue))
1479 << "Device should have read configuration during configuration phase.";
1480 ASSERT_STREQ("value", propertyValue.string());
1481
1482 ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
1483 ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
1484
1485 // Reset
1486 mDevice->reset(ARBITRARY_TIME);
1487 ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
1488 ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
1489
1490 NotifyDeviceResetArgs resetArgs;
1491 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1492 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1493 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1494
1495 // Metadata.
1496 ASSERT_FALSE(mDevice->isIgnored());
1497 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
1498
1499 InputDeviceInfo info;
1500 mDevice->getDeviceInfo(&info);
1501 ASSERT_EQ(DEVICE_ID, info.getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001502 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001503 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
1504 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
1505
1506 // State queries.
1507 ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
1508 << "Should query mappers and combine meta states.";
1509
1510 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1511 << "Should return unknown key code state when source not supported.";
1512 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1513 << "Should return unknown scan code state when source not supported.";
1514 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1515 << "Should return unknown switch state when source not supported.";
1516
1517 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
1518 << "Should query mapper when source is supported.";
1519 ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
1520 << "Should query mapper when source is supported.";
1521 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
1522 << "Should query mapper when source is supported.";
1523
1524 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1525 uint8_t flags[4] = { 0, 0, 0, 1 };
1526 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1527 << "Should do nothing when source is unsupported.";
1528 ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
1529 ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
1530 ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
1531 ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
1532
1533 ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
1534 << "Should query mapper when source is supported.";
1535 ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
1536 ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
1537 ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
1538 ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
1539
1540 // Event handling.
1541 RawEvent event;
1542 mDevice->process(&event, 1);
1543
1544 ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
1545 ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
1546}
1547
1548
1549// --- InputMapperTest ---
1550
1551class InputMapperTest : public testing::Test {
1552protected:
1553 static const char* DEVICE_NAME;
1554 static const int32_t DEVICE_ID;
1555 static const int32_t DEVICE_GENERATION;
1556 static const int32_t DEVICE_CONTROLLER_NUMBER;
1557 static const uint32_t DEVICE_CLASSES;
1558
1559 sp<FakeEventHub> mFakeEventHub;
1560 sp<FakeInputReaderPolicy> mFakePolicy;
1561 sp<FakeInputListener> mFakeListener;
1562 FakeInputReaderContext* mFakeContext;
1563 InputDevice* mDevice;
1564
1565 virtual void SetUp() {
1566 mFakeEventHub = new FakeEventHub();
1567 mFakePolicy = new FakeInputReaderPolicy();
1568 mFakeListener = new FakeInputListener();
1569 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1570 InputDeviceIdentifier identifier;
1571 identifier.name = DEVICE_NAME;
1572 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1573 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1574
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001575 mFakeEventHub->addDevice(DEVICE_ID, DEVICE_NAME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001576 }
1577
1578 virtual void TearDown() {
1579 delete mDevice;
1580 delete mFakeContext;
1581 mFakeListener.clear();
1582 mFakePolicy.clear();
1583 mFakeEventHub.clear();
1584 }
1585
1586 void addConfigurationProperty(const char* key, const char* value) {
1587 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8(key), String8(value));
1588 }
1589
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001590 void configureDevice(uint32_t changes) {
1591 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1592 }
1593
Michael Wrightd02c5b62014-02-10 15:10:22 -08001594 void addMapperAndConfigure(InputMapper* mapper) {
1595 mDevice->addMapper(mapper);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001596 configureDevice(0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001597 mDevice->reset(ARBITRARY_TIME);
1598 }
1599
1600 void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
1601 int32_t orientation) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001602 mFakePolicy->setDisplayViewport(displayId, width, height, orientation, "");
Santos Cordonfa5cf462017-04-05 10:37:00 -07001603 configureDevice(InputReaderConfiguration::CHANGE_DISPLAY_INFO);
1604 }
1605
1606 void setVirtualDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001607 int32_t orientation, const std::string& uniqueId) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07001608 mFakePolicy->setVirtualDisplayViewport(displayId, width, height, orientation, uniqueId);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001609 configureDevice(InputReaderConfiguration::CHANGE_DISPLAY_INFO);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001610 }
1611
1612 static void process(InputMapper* mapper, nsecs_t when, int32_t deviceId, int32_t type,
1613 int32_t code, int32_t value) {
1614 RawEvent event;
1615 event.when = when;
1616 event.deviceId = deviceId;
1617 event.type = type;
1618 event.code = code;
1619 event.value = value;
1620 mapper->process(&event);
1621 }
1622
1623 static void assertMotionRange(const InputDeviceInfo& info,
1624 int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
1625 const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
Yi Kong9b14ac62018-07-17 13:48:38 -07001626 ASSERT_TRUE(range != nullptr) << "Axis: " << axis << " Source: " << source;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001627 ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source;
1628 ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source;
1629 ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source;
1630 ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source;
1631 ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source;
1632 ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source;
1633 }
1634
1635 static void assertPointerCoords(const PointerCoords& coords,
1636 float x, float y, float pressure, float size,
1637 float touchMajor, float touchMinor, float toolMajor, float toolMinor,
1638 float orientation, float distance) {
1639 ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1);
1640 ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
1641 ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON);
1642 ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON);
1643 ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1);
1644 ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1);
1645 ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1);
1646 ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1);
1647 ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON);
1648 ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON);
1649 }
1650
1651 static void assertPosition(const sp<FakePointerController>& controller, float x, float y) {
1652 float actualX, actualY;
1653 controller->getPosition(&actualX, &actualY);
1654 ASSERT_NEAR(x, actualX, 1);
1655 ASSERT_NEAR(y, actualY, 1);
1656 }
1657};
1658
1659const char* InputMapperTest::DEVICE_NAME = "device";
1660const int32_t InputMapperTest::DEVICE_ID = 1;
1661const int32_t InputMapperTest::DEVICE_GENERATION = 2;
1662const int32_t InputMapperTest::DEVICE_CONTROLLER_NUMBER = 0;
1663const uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests
1664
1665
1666// --- SwitchInputMapperTest ---
1667
1668class SwitchInputMapperTest : public InputMapperTest {
1669protected:
1670};
1671
1672TEST_F(SwitchInputMapperTest, GetSources) {
1673 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1674 addMapperAndConfigure(mapper);
1675
1676 ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources());
1677}
1678
1679TEST_F(SwitchInputMapperTest, GetSwitchState) {
1680 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1681 addMapperAndConfigure(mapper);
1682
1683 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
1684 ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1685
1686 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
1687 ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1688}
1689
1690TEST_F(SwitchInputMapperTest, Process) {
1691 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1692 addMapperAndConfigure(mapper);
1693
1694 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_LID, 1);
1695 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_JACK_PHYSICAL_INSERT, 1);
1696 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_HEADPHONE_INSERT, 0);
1697 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
1698
1699 NotifySwitchArgs args;
1700 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args));
1701 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
Dan Albert1bd2fc02016-02-02 15:11:57 -08001702 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT), args.switchValues);
1703 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT) | (1 << SW_HEADPHONE_INSERT),
Michael Wrightd02c5b62014-02-10 15:10:22 -08001704 args.switchMask);
1705 ASSERT_EQ(uint32_t(0), args.policyFlags);
1706}
1707
1708
1709// --- KeyboardInputMapperTest ---
1710
1711class KeyboardInputMapperTest : public InputMapperTest {
1712protected:
1713 void testDPadKeyRotation(KeyboardInputMapper* mapper,
1714 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode);
1715};
1716
1717void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001718 int32_t originalScanCode, int32_t, int32_t rotatedKeyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001719 NotifyKeyArgs args;
1720
1721 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 1);
1722 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1723 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1724 ASSERT_EQ(originalScanCode, args.scanCode);
1725 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1726
1727 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 0);
1728 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1729 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1730 ASSERT_EQ(originalScanCode, args.scanCode);
1731 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1732}
1733
1734
1735TEST_F(KeyboardInputMapperTest, GetSources) {
1736 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1737 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1738 addMapperAndConfigure(mapper);
1739
1740 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
1741}
1742
1743TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
1744 const int32_t USAGE_A = 0x070004;
1745 const int32_t USAGE_UNKNOWN = 0x07ffff;
1746 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
1747 mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
1748
1749 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1750 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1751 addMapperAndConfigure(mapper);
1752
1753 // Key down by scan code.
1754 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1755 EV_KEY, KEY_HOME, 1);
1756 NotifyKeyArgs args;
1757 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1758 ASSERT_EQ(DEVICE_ID, args.deviceId);
1759 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1760 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1761 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1762 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1763 ASSERT_EQ(KEY_HOME, args.scanCode);
1764 ASSERT_EQ(AMETA_NONE, args.metaState);
1765 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1766 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1767 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1768
1769 // Key up by scan code.
1770 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1771 EV_KEY, KEY_HOME, 0);
1772 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1773 ASSERT_EQ(DEVICE_ID, args.deviceId);
1774 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1775 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1776 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1777 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1778 ASSERT_EQ(KEY_HOME, args.scanCode);
1779 ASSERT_EQ(AMETA_NONE, args.metaState);
1780 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1781 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1782 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1783
1784 // Key down by usage code.
1785 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1786 EV_MSC, MSC_SCAN, USAGE_A);
1787 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1788 EV_KEY, 0, 1);
1789 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1790 ASSERT_EQ(DEVICE_ID, args.deviceId);
1791 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1792 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1793 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1794 ASSERT_EQ(AKEYCODE_A, args.keyCode);
1795 ASSERT_EQ(0, args.scanCode);
1796 ASSERT_EQ(AMETA_NONE, args.metaState);
1797 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1798 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1799 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1800
1801 // Key up by usage code.
1802 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1803 EV_MSC, MSC_SCAN, USAGE_A);
1804 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1805 EV_KEY, 0, 0);
1806 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1807 ASSERT_EQ(DEVICE_ID, args.deviceId);
1808 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1809 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1810 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1811 ASSERT_EQ(AKEYCODE_A, args.keyCode);
1812 ASSERT_EQ(0, args.scanCode);
1813 ASSERT_EQ(AMETA_NONE, args.metaState);
1814 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1815 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1816 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1817
1818 // Key down with unknown scan code or usage code.
1819 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1820 EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
1821 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1822 EV_KEY, KEY_UNKNOWN, 1);
1823 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1824 ASSERT_EQ(DEVICE_ID, args.deviceId);
1825 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1826 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1827 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1828 ASSERT_EQ(0, args.keyCode);
1829 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
1830 ASSERT_EQ(AMETA_NONE, args.metaState);
1831 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1832 ASSERT_EQ(0U, args.policyFlags);
1833 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1834
1835 // Key up with unknown scan code or usage code.
1836 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1837 EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
1838 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1839 EV_KEY, KEY_UNKNOWN, 0);
1840 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1841 ASSERT_EQ(DEVICE_ID, args.deviceId);
1842 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1843 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1844 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1845 ASSERT_EQ(0, args.keyCode);
1846 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
1847 ASSERT_EQ(AMETA_NONE, args.metaState);
1848 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1849 ASSERT_EQ(0U, args.policyFlags);
1850 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1851}
1852
1853TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
1854 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
1855 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
1856
1857 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1858 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1859 addMapperAndConfigure(mapper);
1860
1861 // Initial metastate.
1862 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1863
1864 // Metakey down.
1865 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1866 EV_KEY, KEY_LEFTSHIFT, 1);
1867 NotifyKeyArgs args;
1868 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1869 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1870 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1871 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
1872
1873 // Key down.
1874 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1875 EV_KEY, KEY_A, 1);
1876 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1877 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1878 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1879
1880 // Key up.
1881 process(mapper, ARBITRARY_TIME + 2, DEVICE_ID,
1882 EV_KEY, KEY_A, 0);
1883 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1884 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1885 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1886
1887 // Metakey up.
1888 process(mapper, ARBITRARY_TIME + 3, DEVICE_ID,
1889 EV_KEY, KEY_LEFTSHIFT, 0);
1890 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1891 ASSERT_EQ(AMETA_NONE, args.metaState);
1892 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1893 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
1894}
1895
1896TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
1897 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
1898 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
1899 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
1900 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
1901
1902 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1903 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1904 addMapperAndConfigure(mapper);
1905
1906 setDisplayInfoAndReconfigure(DISPLAY_ID,
1907 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1908 DISPLAY_ORIENTATION_90);
1909 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1910 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
1911 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1912 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
1913 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1914 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
1915 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1916 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
1917}
1918
1919TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
1920 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
1921 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
1922 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
1923 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
1924
1925 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1926 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1927 addConfigurationProperty("keyboard.orientationAware", "1");
1928 addMapperAndConfigure(mapper);
1929
1930 setDisplayInfoAndReconfigure(DISPLAY_ID,
1931 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1932 DISPLAY_ORIENTATION_0);
1933 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1934 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
1935 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1936 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
1937 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1938 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
1939 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1940 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
1941
1942 setDisplayInfoAndReconfigure(DISPLAY_ID,
1943 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1944 DISPLAY_ORIENTATION_90);
1945 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1946 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT));
1947 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1948 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP));
1949 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1950 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT));
1951 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1952 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN));
1953
1954 setDisplayInfoAndReconfigure(DISPLAY_ID,
1955 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1956 DISPLAY_ORIENTATION_180);
1957 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1958 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN));
1959 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1960 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT));
1961 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1962 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP));
1963 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1964 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT));
1965
1966 setDisplayInfoAndReconfigure(DISPLAY_ID,
1967 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1968 DISPLAY_ORIENTATION_270);
1969 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1970 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT));
1971 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1972 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN));
1973 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1974 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT));
1975 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1976 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP));
1977
1978 // Special case: if orientation changes while key is down, we still emit the same keycode
1979 // in the key up as we did in the key down.
1980 NotifyKeyArgs args;
1981
1982 setDisplayInfoAndReconfigure(DISPLAY_ID,
1983 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1984 DISPLAY_ORIENTATION_270);
1985 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1);
1986 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1987 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1988 ASSERT_EQ(KEY_UP, args.scanCode);
1989 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
1990
1991 setDisplayInfoAndReconfigure(DISPLAY_ID,
1992 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1993 DISPLAY_ORIENTATION_180);
1994 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0);
1995 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1996 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1997 ASSERT_EQ(KEY_UP, args.scanCode);
1998 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
1999}
2000
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002001TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_NotOrientationAware) {
2002 // If the keyboard is not orientation aware,
2003 // key events should not be associated with a specific display id
2004 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2005
2006 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2007 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2008 addMapperAndConfigure(mapper);
2009 NotifyKeyArgs args;
2010
2011 // Display id should be ADISPLAY_ID_NONE without any display configuration.
2012 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1);
2013 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2014 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0);
2015 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2016 ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2017
2018 setDisplayInfoAndReconfigure(DISPLAY_ID,
2019 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0);
2020 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1);
2021 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2022 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0);
2023 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2024 ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2025}
2026
2027TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_OrientationAware) {
2028 // If the keyboard is orientation aware,
2029 // key events should be associated with the internal viewport
2030 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2031
2032 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2033 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2034 addConfigurationProperty("keyboard.orientationAware", "1");
2035 addMapperAndConfigure(mapper);
2036 NotifyKeyArgs args;
2037
2038 // Display id should be ADISPLAY_ID_NONE without any display configuration.
2039 // ^--- already checked by the previous test
2040
2041 setDisplayInfoAndReconfigure(DISPLAY_ID,
2042 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0);
2043 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1);
2044 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2045 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0);
2046 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2047 ASSERT_EQ(DISPLAY_ID, args.displayId);
2048
2049 constexpr int32_t newDisplayId = 2;
2050 setDisplayInfoAndReconfigure(newDisplayId,
2051 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0);
2052 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1);
2053 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2054 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0);
2055 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2056 ASSERT_EQ(newDisplayId, args.displayId);
2057}
2058
Michael Wrightd02c5b62014-02-10 15:10:22 -08002059TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
2060 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2061 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2062 addMapperAndConfigure(mapper);
2063
2064 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
2065 ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2066
2067 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
2068 ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2069}
2070
2071TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
2072 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2073 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2074 addMapperAndConfigure(mapper);
2075
2076 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
2077 ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2078
2079 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
2080 ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2081}
2082
2083TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
2084 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2085 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2086 addMapperAndConfigure(mapper);
2087
2088 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2089
2090 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
2091 uint8_t flags[2] = { 0, 0 };
2092 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
2093 ASSERT_TRUE(flags[0]);
2094 ASSERT_FALSE(flags[1]);
2095}
2096
2097TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
2098 mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/);
2099 mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/);
2100 mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/);
2101 mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
2102 mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
2103 mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
2104
2105 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2106 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2107 addMapperAndConfigure(mapper);
2108
2109 // Initialization should have turned all of the lights off.
2110 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2111 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2112 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2113
2114 // Toggle caps lock on.
2115 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2116 EV_KEY, KEY_CAPSLOCK, 1);
2117 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2118 EV_KEY, KEY_CAPSLOCK, 0);
2119 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2120 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2121 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2122 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState());
2123
2124 // Toggle num lock on.
2125 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2126 EV_KEY, KEY_NUMLOCK, 1);
2127 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2128 EV_KEY, KEY_NUMLOCK, 0);
2129 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2130 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2131 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2132 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState());
2133
2134 // Toggle caps lock off.
2135 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2136 EV_KEY, KEY_CAPSLOCK, 1);
2137 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2138 EV_KEY, KEY_CAPSLOCK, 0);
2139 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2140 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2141 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2142 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState());
2143
2144 // Toggle scroll lock on.
2145 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2146 EV_KEY, KEY_SCROLLLOCK, 1);
2147 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2148 EV_KEY, KEY_SCROLLLOCK, 0);
2149 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2150 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2151 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2152 ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2153
2154 // Toggle num lock off.
2155 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2156 EV_KEY, KEY_NUMLOCK, 1);
2157 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2158 EV_KEY, KEY_NUMLOCK, 0);
2159 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2160 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2161 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2162 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2163
2164 // Toggle scroll lock off.
2165 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2166 EV_KEY, KEY_SCROLLLOCK, 1);
2167 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2168 EV_KEY, KEY_SCROLLLOCK, 0);
2169 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2170 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2171 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2172 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2173}
2174
2175
2176// --- CursorInputMapperTest ---
2177
2178class CursorInputMapperTest : public InputMapperTest {
2179protected:
2180 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
2181
2182 sp<FakePointerController> mFakePointerController;
2183
2184 virtual void SetUp() {
2185 InputMapperTest::SetUp();
2186
2187 mFakePointerController = new FakePointerController();
2188 mFakePolicy->setPointerController(DEVICE_ID, mFakePointerController);
2189 }
2190
2191 void testMotionRotation(CursorInputMapper* mapper,
2192 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
2193};
2194
2195const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
2196
2197void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
2198 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
2199 NotifyMotionArgs args;
2200
2201 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, originalX);
2202 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, originalY);
2203 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2204 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2205 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2206 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2207 float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
2208 float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
2209 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2210}
2211
2212TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
2213 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2214 addConfigurationProperty("cursor.mode", "pointer");
2215 addMapperAndConfigure(mapper);
2216
2217 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
2218}
2219
2220TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
2221 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2222 addConfigurationProperty("cursor.mode", "navigation");
2223 addMapperAndConfigure(mapper);
2224
2225 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
2226}
2227
2228TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
2229 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2230 addConfigurationProperty("cursor.mode", "pointer");
2231 addMapperAndConfigure(mapper);
2232
2233 InputDeviceInfo info;
2234 mapper->populateDeviceInfo(&info);
2235
2236 // Initially there may not be a valid motion range.
Yi Kong9b14ac62018-07-17 13:48:38 -07002237 ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE));
2238 ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002239 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2240 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f));
2241
2242 // When the bounds are set, then there should be a valid motion range.
2243 mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1);
2244
2245 InputDeviceInfo info2;
2246 mapper->populateDeviceInfo(&info2);
2247
2248 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2249 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE,
2250 1, 800 - 1, 0.0f, 0.0f));
2251 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2252 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE,
2253 2, 480 - 1, 0.0f, 0.0f));
2254 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2255 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE,
2256 0.0f, 1.0f, 0.0f, 0.0f));
2257}
2258
2259TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
2260 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2261 addConfigurationProperty("cursor.mode", "navigation");
2262 addMapperAndConfigure(mapper);
2263
2264 InputDeviceInfo info;
2265 mapper->populateDeviceInfo(&info);
2266
2267 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2268 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL,
2269 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2270 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2271 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL,
2272 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2273 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2274 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL,
2275 0.0f, 1.0f, 0.0f, 0.0f));
2276}
2277
2278TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
2279 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2280 addConfigurationProperty("cursor.mode", "navigation");
2281 addMapperAndConfigure(mapper);
2282
2283 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2284
2285 NotifyMotionArgs args;
2286
2287 // Button press.
2288 // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
2289 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2290 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2291 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2292 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2293 ASSERT_EQ(DEVICE_ID, args.deviceId);
2294 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2295 ASSERT_EQ(uint32_t(0), args.policyFlags);
2296 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2297 ASSERT_EQ(0, args.flags);
2298 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2299 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2300 ASSERT_EQ(0, args.edgeFlags);
2301 ASSERT_EQ(uint32_t(1), args.pointerCount);
2302 ASSERT_EQ(0, args.pointerProperties[0].id);
2303 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2304 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2305 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2306 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2307 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2308 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2309
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002310 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2311 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2312 ASSERT_EQ(DEVICE_ID, args.deviceId);
2313 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2314 ASSERT_EQ(uint32_t(0), args.policyFlags);
2315 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2316 ASSERT_EQ(0, args.flags);
2317 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2318 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2319 ASSERT_EQ(0, args.edgeFlags);
2320 ASSERT_EQ(uint32_t(1), args.pointerCount);
2321 ASSERT_EQ(0, args.pointerProperties[0].id);
2322 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2323 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2324 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2325 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2326 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2327 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2328
Michael Wrightd02c5b62014-02-10 15:10:22 -08002329 // Button release. Should have same down time.
2330 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2331 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2332 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2333 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2334 ASSERT_EQ(DEVICE_ID, args.deviceId);
2335 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2336 ASSERT_EQ(uint32_t(0), args.policyFlags);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002337 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2338 ASSERT_EQ(0, args.flags);
2339 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2340 ASSERT_EQ(0, args.buttonState);
2341 ASSERT_EQ(0, args.edgeFlags);
2342 ASSERT_EQ(uint32_t(1), args.pointerCount);
2343 ASSERT_EQ(0, args.pointerProperties[0].id);
2344 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2345 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2346 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2347 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2348 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2349 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2350
2351 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2352 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2353 ASSERT_EQ(DEVICE_ID, args.deviceId);
2354 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2355 ASSERT_EQ(uint32_t(0), args.policyFlags);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002356 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2357 ASSERT_EQ(0, args.flags);
2358 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2359 ASSERT_EQ(0, args.buttonState);
2360 ASSERT_EQ(0, args.edgeFlags);
2361 ASSERT_EQ(uint32_t(1), args.pointerCount);
2362 ASSERT_EQ(0, args.pointerProperties[0].id);
2363 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2364 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2365 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2366 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2367 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2368 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2369}
2370
2371TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
2372 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2373 addConfigurationProperty("cursor.mode", "navigation");
2374 addMapperAndConfigure(mapper);
2375
2376 NotifyMotionArgs args;
2377
2378 // Motion in X but not Y.
2379 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1);
2380 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2381 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2382 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2383 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2384 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2385
2386 // Motion in Y but not X.
2387 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2);
2388 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2389 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2390 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2391 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2392 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2393}
2394
2395TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
2396 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2397 addConfigurationProperty("cursor.mode", "navigation");
2398 addMapperAndConfigure(mapper);
2399
2400 NotifyMotionArgs args;
2401
2402 // Button press.
2403 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2404 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2405 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2406 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2407 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2408 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2409
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002410 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2411 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2412 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2413 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2414
Michael Wrightd02c5b62014-02-10 15:10:22 -08002415 // Button release.
2416 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2417 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2418 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002419 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2420 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2421 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2422
2423 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002424 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2425 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2426 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2427}
2428
2429TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
2430 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2431 addConfigurationProperty("cursor.mode", "navigation");
2432 addMapperAndConfigure(mapper);
2433
2434 NotifyMotionArgs args;
2435
2436 // Combined X, Y and Button.
2437 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1);
2438 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2);
2439 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2440 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2441 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2442 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2443 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2444 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2445 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2446
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002447 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2448 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2449 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2450 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2451 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2452
Michael Wrightd02c5b62014-02-10 15:10:22 -08002453 // Move X, Y a bit while pressed.
2454 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 2);
2455 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 1);
2456 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2457 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2458 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2459 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2460 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2461 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2462
2463 // Release Button.
2464 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2465 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2466 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002467 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2468 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2469 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2470
2471 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002472 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2473 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2474 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2475}
2476
2477TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
2478 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2479 addConfigurationProperty("cursor.mode", "navigation");
2480 addMapperAndConfigure(mapper);
2481
2482 setDisplayInfoAndReconfigure(DISPLAY_ID,
2483 DISPLAY_WIDTH, DISPLAY_HEIGHT,
2484 DISPLAY_ORIENTATION_90);
2485 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2486 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2487 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2488 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2489 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2490 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2491 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2492 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2493}
2494
2495TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
2496 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2497 addConfigurationProperty("cursor.mode", "navigation");
2498 addConfigurationProperty("cursor.orientationAware", "1");
2499 addMapperAndConfigure(mapper);
2500
2501 setDisplayInfoAndReconfigure(DISPLAY_ID,
2502 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0);
2503 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2504 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2505 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2506 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2507 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2508 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2509 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2510 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2511
2512 setDisplayInfoAndReconfigure(DISPLAY_ID,
2513 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_90);
2514 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0));
2515 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1));
2516 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1));
2517 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1));
2518 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0));
2519 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1));
2520 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1));
2521 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1));
2522
2523 setDisplayInfoAndReconfigure(DISPLAY_ID,
2524 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_180);
2525 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1));
2526 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1));
2527 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0));
2528 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1));
2529 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1));
2530 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1));
2531 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0));
2532 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1));
2533
2534 setDisplayInfoAndReconfigure(DISPLAY_ID,
2535 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_270);
2536 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0));
2537 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1));
2538 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1));
2539 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1));
2540 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0));
2541 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1));
2542 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1));
2543 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1));
2544}
2545
2546TEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) {
2547 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2548 addConfigurationProperty("cursor.mode", "pointer");
2549 addMapperAndConfigure(mapper);
2550
2551 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2552 mFakePointerController->setPosition(100, 200);
2553 mFakePointerController->setButtonState(0);
2554
2555 NotifyMotionArgs motionArgs;
2556 NotifyKeyArgs keyArgs;
2557
2558 // press BTN_LEFT, release BTN_LEFT
2559 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 1);
2560 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2561 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2562 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2563 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2564 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2565 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2566 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2567
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002568 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2569 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2570 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2571 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2572 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2573 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2574
Michael Wrightd02c5b62014-02-10 15:10:22 -08002575 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 0);
2576 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2577 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002578 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002579 ASSERT_EQ(0, motionArgs.buttonState);
2580 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002581 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2582 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2583
2584 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002585 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002586 ASSERT_EQ(0, motionArgs.buttonState);
2587 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002588 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2589 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2590
2591 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002592 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002593 ASSERT_EQ(0, motionArgs.buttonState);
2594 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002595 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2596 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2597
2598 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
2599 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 1);
2600 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 1);
2601 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2602 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2603 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2604 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2605 motionArgs.buttonState);
2606 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2607 mFakePointerController->getButtonState());
2608 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2609 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2610
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002611 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2612 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2613 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2614 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2615 mFakePointerController->getButtonState());
2616 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2617 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2618
2619 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2620 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2621 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2622 motionArgs.buttonState);
2623 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2624 mFakePointerController->getButtonState());
2625 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2626 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2627
Michael Wrightd02c5b62014-02-10 15:10:22 -08002628 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 0);
2629 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2630 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002631 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002632 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2633 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002634 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2635 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2636
2637 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002638 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002639 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2640 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002641 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2642 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2643
2644 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 0);
2645 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2646 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002647 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2648 ASSERT_EQ(0, motionArgs.buttonState);
2649 ASSERT_EQ(0, mFakePointerController->getButtonState());
2650 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2651 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2652 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 0);
2653 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2654
2655 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002656 ASSERT_EQ(0, motionArgs.buttonState);
2657 ASSERT_EQ(0, mFakePointerController->getButtonState());
2658 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2659 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2660 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002661
Michael Wrightd02c5b62014-02-10 15:10:22 -08002662 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2663 ASSERT_EQ(0, motionArgs.buttonState);
2664 ASSERT_EQ(0, mFakePointerController->getButtonState());
2665 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2666 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2667 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2668
2669 // press BTN_BACK, release BTN_BACK
2670 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 1);
2671 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2672 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2673 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2674 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002675
Michael Wrightd02c5b62014-02-10 15:10:22 -08002676 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002677 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002678 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2679 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002680 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2681 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2682
2683 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2684 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2685 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2686 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002687 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2688 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2689
2690 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 0);
2691 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2692 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002693 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002694 ASSERT_EQ(0, motionArgs.buttonState);
2695 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002696 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2697 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2698
2699 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002700 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002701 ASSERT_EQ(0, motionArgs.buttonState);
2702 ASSERT_EQ(0, mFakePointerController->getButtonState());
2703
Michael Wrightd02c5b62014-02-10 15:10:22 -08002704 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2705 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2706 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2707 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2708 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2709
2710 // press BTN_SIDE, release BTN_SIDE
2711 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 1);
2712 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2713 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2714 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2715 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002716
Michael Wrightd02c5b62014-02-10 15:10:22 -08002717 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002718 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002719 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2720 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002721 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2722 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2723
2724 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2725 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2726 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2727 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002728 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2729 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2730
2731 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 0);
2732 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2733 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002734 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002735 ASSERT_EQ(0, motionArgs.buttonState);
2736 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002737 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2738 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002739
2740 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2741 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2742 ASSERT_EQ(0, motionArgs.buttonState);
2743 ASSERT_EQ(0, mFakePointerController->getButtonState());
2744 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2745 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2746
Michael Wrightd02c5b62014-02-10 15:10:22 -08002747 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2748 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2749 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2750
2751 // press BTN_FORWARD, release BTN_FORWARD
2752 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 1);
2753 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2754 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2755 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2756 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002757
Michael Wrightd02c5b62014-02-10 15:10:22 -08002758 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002759 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002760 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2761 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002762 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2763 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2764
2765 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2766 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2767 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2768 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002769 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2770 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2771
2772 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 0);
2773 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2774 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002775 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002776 ASSERT_EQ(0, motionArgs.buttonState);
2777 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002778 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2779 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002780
2781 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2782 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2783 ASSERT_EQ(0, motionArgs.buttonState);
2784 ASSERT_EQ(0, mFakePointerController->getButtonState());
2785 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2786 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2787
Michael Wrightd02c5b62014-02-10 15:10:22 -08002788 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2789 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2790 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2791
2792 // press BTN_EXTRA, release BTN_EXTRA
2793 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 1);
2794 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2795 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2796 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2797 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002798
Michael Wrightd02c5b62014-02-10 15:10:22 -08002799 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002800 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002801 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2802 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002803 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2804 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2805
2806 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2807 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2808 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2809 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002810 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2811 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2812
2813 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 0);
2814 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2815 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002816 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002817 ASSERT_EQ(0, motionArgs.buttonState);
2818 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002819 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2820 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002821
2822 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2823 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2824 ASSERT_EQ(0, motionArgs.buttonState);
2825 ASSERT_EQ(0, mFakePointerController->getButtonState());
2826 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2827 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2828
Michael Wrightd02c5b62014-02-10 15:10:22 -08002829 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2830 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2831 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2832}
2833
2834TEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) {
2835 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2836 addConfigurationProperty("cursor.mode", "pointer");
2837 addMapperAndConfigure(mapper);
2838
2839 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2840 mFakePointerController->setPosition(100, 200);
2841 mFakePointerController->setButtonState(0);
2842
2843 NotifyMotionArgs args;
2844
2845 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10);
2846 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20);
2847 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2848 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08002849 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
2850 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
2851 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2852 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2853 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
2854}
2855
2856TEST_F(CursorInputMapperTest, Process_PointerCapture) {
2857 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2858 addConfigurationProperty("cursor.mode", "pointer");
2859 mFakePolicy->setPointerCapture(true);
2860 addMapperAndConfigure(mapper);
2861
2862 NotifyDeviceResetArgs resetArgs;
2863 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
2864 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
2865 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
2866
2867 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2868 mFakePointerController->setPosition(100, 200);
2869 mFakePointerController->setButtonState(0);
2870
2871 NotifyMotionArgs args;
2872
2873 // Move.
2874 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10);
2875 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20);
2876 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2877 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2878 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2879 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2880 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2881 10.0f, 20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2882 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
2883
2884 // Button press.
2885 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2886 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2887 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2888 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2889 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2890 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2891 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2892 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2893 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2894 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2895 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2896 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2897
2898 // Button release.
2899 process(mapper, ARBITRARY_TIME + 2, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2900 process(mapper, ARBITRARY_TIME + 2, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2901 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2902 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2903 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2904 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2905 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2906 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2907 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2908 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2909 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2910 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2911
2912 // Another move.
2913 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 30);
2914 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 40);
2915 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2916 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2917 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2918 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2919 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2920 30.0f, 40.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2921 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
2922
2923 // Disable pointer capture and check that the device generation got bumped
2924 // and events are generated the usual way.
2925 const uint32_t generation = mFakeContext->getGeneration();
2926 mFakePolicy->setPointerCapture(false);
2927 configureDevice(InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
2928 ASSERT_TRUE(mFakeContext->getGeneration() != generation);
2929
2930 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
2931 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
2932 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
2933
2934 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10);
2935 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20);
2936 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2937 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2938 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002939 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
2940 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2941 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2942 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
2943}
2944
2945
2946// --- TouchInputMapperTest ---
2947
2948class TouchInputMapperTest : public InputMapperTest {
2949protected:
2950 static const int32_t RAW_X_MIN;
2951 static const int32_t RAW_X_MAX;
2952 static const int32_t RAW_Y_MIN;
2953 static const int32_t RAW_Y_MAX;
2954 static const int32_t RAW_TOUCH_MIN;
2955 static const int32_t RAW_TOUCH_MAX;
2956 static const int32_t RAW_TOOL_MIN;
2957 static const int32_t RAW_TOOL_MAX;
2958 static const int32_t RAW_PRESSURE_MIN;
2959 static const int32_t RAW_PRESSURE_MAX;
2960 static const int32_t RAW_ORIENTATION_MIN;
2961 static const int32_t RAW_ORIENTATION_MAX;
2962 static const int32_t RAW_DISTANCE_MIN;
2963 static const int32_t RAW_DISTANCE_MAX;
2964 static const int32_t RAW_TILT_MIN;
2965 static const int32_t RAW_TILT_MAX;
2966 static const int32_t RAW_ID_MIN;
2967 static const int32_t RAW_ID_MAX;
2968 static const int32_t RAW_SLOT_MIN;
2969 static const int32_t RAW_SLOT_MAX;
2970 static const float X_PRECISION;
2971 static const float Y_PRECISION;
Santos Cordonfa5cf462017-04-05 10:37:00 -07002972 static const float X_PRECISION_VIRTUAL;
2973 static const float Y_PRECISION_VIRTUAL;
Michael Wrightd02c5b62014-02-10 15:10:22 -08002974
2975 static const float GEOMETRIC_SCALE;
Jason Gerecke489fda82012-09-07 17:19:40 -07002976 static const TouchAffineTransformation AFFINE_TRANSFORM;
Michael Wrightd02c5b62014-02-10 15:10:22 -08002977
2978 static const VirtualKeyDefinition VIRTUAL_KEYS[2];
2979
2980 enum Axes {
2981 POSITION = 1 << 0,
2982 TOUCH = 1 << 1,
2983 TOOL = 1 << 2,
2984 PRESSURE = 1 << 3,
2985 ORIENTATION = 1 << 4,
2986 MINOR = 1 << 5,
2987 ID = 1 << 6,
2988 DISTANCE = 1 << 7,
2989 TILT = 1 << 8,
2990 SLOT = 1 << 9,
2991 TOOL_TYPE = 1 << 10,
2992 };
2993
2994 void prepareDisplay(int32_t orientation);
Santos Cordonfa5cf462017-04-05 10:37:00 -07002995 void prepareVirtualDisplay(int32_t orientation);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002996 void prepareVirtualKeys();
Jason Gerecke489fda82012-09-07 17:19:40 -07002997 void prepareLocationCalibration();
Michael Wrightd02c5b62014-02-10 15:10:22 -08002998 int32_t toRawX(float displayX);
2999 int32_t toRawY(float displayY);
Jason Gerecke489fda82012-09-07 17:19:40 -07003000 float toCookedX(float rawX, float rawY);
3001 float toCookedY(float rawX, float rawY);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003002 float toDisplayX(int32_t rawX);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003003 float toDisplayX(int32_t rawX, int32_t displayWidth);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003004 float toDisplayY(int32_t rawY);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003005 float toDisplayY(int32_t rawY, int32_t displayHeight);
3006
Michael Wrightd02c5b62014-02-10 15:10:22 -08003007};
3008
3009const int32_t TouchInputMapperTest::RAW_X_MIN = 25;
3010const int32_t TouchInputMapperTest::RAW_X_MAX = 1019;
3011const int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
3012const int32_t TouchInputMapperTest::RAW_Y_MAX = 1009;
3013const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
3014const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
3015const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
3016const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
Michael Wrightaa449c92017-12-13 21:21:43 +00003017const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = 0;
3018const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = 255;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003019const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
3020const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
3021const int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0;
3022const int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7;
3023const int32_t TouchInputMapperTest::RAW_TILT_MIN = 0;
3024const int32_t TouchInputMapperTest::RAW_TILT_MAX = 150;
3025const int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
3026const int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
3027const int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0;
3028const int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9;
3029const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH;
3030const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT;
Santos Cordonfa5cf462017-04-05 10:37:00 -07003031const float TouchInputMapperTest::X_PRECISION_VIRTUAL =
3032 float(RAW_X_MAX - RAW_X_MIN + 1) / VIRTUAL_DISPLAY_WIDTH;
3033const float TouchInputMapperTest::Y_PRECISION_VIRTUAL =
3034 float(RAW_Y_MAX - RAW_Y_MIN + 1) / VIRTUAL_DISPLAY_HEIGHT;
Jason Gerecke489fda82012-09-07 17:19:40 -07003035const TouchAffineTransformation TouchInputMapperTest::AFFINE_TRANSFORM =
3036 TouchAffineTransformation(1, -2, 3, -4, 5, -6);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003037
3038const float TouchInputMapperTest::GEOMETRIC_SCALE =
3039 avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1),
3040 float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1));
3041
3042const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
3043 { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
3044 { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
3045};
3046
3047void TouchInputMapperTest::prepareDisplay(int32_t orientation) {
3048 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation);
3049}
3050
Santos Cordonfa5cf462017-04-05 10:37:00 -07003051void TouchInputMapperTest::prepareVirtualDisplay(int32_t orientation) {
3052 setVirtualDisplayInfoAndReconfigure(VIRTUAL_DISPLAY_ID, VIRTUAL_DISPLAY_WIDTH,
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01003053 VIRTUAL_DISPLAY_HEIGHT, orientation, VIRTUAL_DISPLAY_UNIQUE_ID);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003054}
3055
Michael Wrightd02c5b62014-02-10 15:10:22 -08003056void TouchInputMapperTest::prepareVirtualKeys() {
3057 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]);
3058 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]);
3059 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
3060 mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE);
3061}
3062
Jason Gerecke489fda82012-09-07 17:19:40 -07003063void TouchInputMapperTest::prepareLocationCalibration() {
3064 mFakePolicy->setTouchAffineTransformation(AFFINE_TRANSFORM);
3065}
3066
Michael Wrightd02c5b62014-02-10 15:10:22 -08003067int32_t TouchInputMapperTest::toRawX(float displayX) {
3068 return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN);
3069}
3070
3071int32_t TouchInputMapperTest::toRawY(float displayY) {
3072 return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN);
3073}
3074
Jason Gerecke489fda82012-09-07 17:19:40 -07003075float TouchInputMapperTest::toCookedX(float rawX, float rawY) {
3076 AFFINE_TRANSFORM.applyTo(rawX, rawY);
3077 return rawX;
3078}
3079
3080float TouchInputMapperTest::toCookedY(float rawX, float rawY) {
3081 AFFINE_TRANSFORM.applyTo(rawX, rawY);
3082 return rawY;
3083}
3084
Michael Wrightd02c5b62014-02-10 15:10:22 -08003085float TouchInputMapperTest::toDisplayX(int32_t rawX) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07003086 return toDisplayX(rawX, DISPLAY_WIDTH);
3087}
3088
3089float TouchInputMapperTest::toDisplayX(int32_t rawX, int32_t displayWidth) {
3090 return float(rawX - RAW_X_MIN) * displayWidth / (RAW_X_MAX - RAW_X_MIN + 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003091}
3092
3093float TouchInputMapperTest::toDisplayY(int32_t rawY) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07003094 return toDisplayY(rawY, DISPLAY_HEIGHT);
3095}
3096
3097float TouchInputMapperTest::toDisplayY(int32_t rawY, int32_t displayHeight) {
3098 return float(rawY - RAW_Y_MIN) * displayHeight / (RAW_Y_MAX - RAW_Y_MIN + 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003099}
3100
3101
3102// --- SingleTouchInputMapperTest ---
3103
3104class SingleTouchInputMapperTest : public TouchInputMapperTest {
3105protected:
3106 void prepareButtons();
3107 void prepareAxes(int axes);
3108
3109 void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3110 void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3111 void processUp(SingleTouchInputMapper* mappery);
3112 void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
3113 void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
3114 void processDistance(SingleTouchInputMapper* mapper, int32_t distance);
3115 void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY);
3116 void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value);
3117 void processSync(SingleTouchInputMapper* mapper);
3118};
3119
3120void SingleTouchInputMapperTest::prepareButtons() {
3121 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
3122}
3123
3124void SingleTouchInputMapperTest::prepareAxes(int axes) {
3125 if (axes & POSITION) {
3126 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X,
3127 RAW_X_MIN, RAW_X_MAX, 0, 0);
3128 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y,
3129 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
3130 }
3131 if (axes & PRESSURE) {
3132 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE,
3133 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
3134 }
3135 if (axes & TOOL) {
3136 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH,
3137 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
3138 }
3139 if (axes & DISTANCE) {
3140 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE,
3141 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
3142 }
3143 if (axes & TILT) {
3144 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X,
3145 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3146 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y,
3147 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3148 }
3149}
3150
3151void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
3152 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 1);
3153 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x);
3154 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y);
3155}
3156
3157void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
3158 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x);
3159 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y);
3160}
3161
3162void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
3163 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 0);
3164}
3165
3166void SingleTouchInputMapperTest::processPressure(
3167 SingleTouchInputMapper* mapper, int32_t pressure) {
3168 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_PRESSURE, pressure);
3169}
3170
3171void SingleTouchInputMapperTest::processToolMajor(
3172 SingleTouchInputMapper* mapper, int32_t toolMajor) {
3173 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TOOL_WIDTH, toolMajor);
3174}
3175
3176void SingleTouchInputMapperTest::processDistance(
3177 SingleTouchInputMapper* mapper, int32_t distance) {
3178 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_DISTANCE, distance);
3179}
3180
3181void SingleTouchInputMapperTest::processTilt(
3182 SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) {
3183 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_X, tiltX);
3184 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_Y, tiltY);
3185}
3186
3187void SingleTouchInputMapperTest::processKey(
3188 SingleTouchInputMapper* mapper, int32_t code, int32_t value) {
3189 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value);
3190}
3191
3192void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
3193 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
3194}
3195
3196
3197TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) {
3198 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3199 prepareButtons();
3200 prepareAxes(POSITION);
3201 addMapperAndConfigure(mapper);
3202
3203 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
3204}
3205
3206TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) {
3207 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3208 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X);
3209 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y);
3210 prepareButtons();
3211 prepareAxes(POSITION);
3212 addMapperAndConfigure(mapper);
3213
3214 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3215}
3216
3217TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) {
3218 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3219 prepareButtons();
3220 prepareAxes(POSITION);
3221 addConfigurationProperty("touch.deviceType", "touchPad");
3222 addMapperAndConfigure(mapper);
3223
3224 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3225}
3226
3227TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) {
3228 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3229 prepareButtons();
3230 prepareAxes(POSITION);
3231 addConfigurationProperty("touch.deviceType", "touchScreen");
3232 addMapperAndConfigure(mapper);
3233
3234 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
3235}
3236
3237TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
3238 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3239 addConfigurationProperty("touch.deviceType", "touchScreen");
3240 prepareDisplay(DISPLAY_ORIENTATION_0);
3241 prepareButtons();
3242 prepareAxes(POSITION);
3243 prepareVirtualKeys();
3244 addMapperAndConfigure(mapper);
3245
3246 // Unknown key.
3247 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
3248
3249 // Virtual key is down.
3250 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3251 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3252 processDown(mapper, x, y);
3253 processSync(mapper);
3254 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3255
3256 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3257
3258 // Virtual key is up.
3259 processUp(mapper);
3260 processSync(mapper);
3261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3262
3263 ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3264}
3265
3266TEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
3267 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3268 addConfigurationProperty("touch.deviceType", "touchScreen");
3269 prepareDisplay(DISPLAY_ORIENTATION_0);
3270 prepareButtons();
3271 prepareAxes(POSITION);
3272 prepareVirtualKeys();
3273 addMapperAndConfigure(mapper);
3274
3275 // Unknown key.
3276 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
3277
3278 // Virtual key is down.
3279 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3280 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3281 processDown(mapper, x, y);
3282 processSync(mapper);
3283 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3284
3285 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3286
3287 // Virtual key is up.
3288 processUp(mapper);
3289 processSync(mapper);
3290 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3291
3292 ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3293}
3294
3295TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
3296 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3297 addConfigurationProperty("touch.deviceType", "touchScreen");
3298 prepareDisplay(DISPLAY_ORIENTATION_0);
3299 prepareButtons();
3300 prepareAxes(POSITION);
3301 prepareVirtualKeys();
3302 addMapperAndConfigure(mapper);
3303
3304 const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
3305 uint8_t flags[2] = { 0, 0 };
3306 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
3307 ASSERT_TRUE(flags[0]);
3308 ASSERT_FALSE(flags[1]);
3309}
3310
3311TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
3312 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3313 addConfigurationProperty("touch.deviceType", "touchScreen");
3314 prepareDisplay(DISPLAY_ORIENTATION_0);
3315 prepareButtons();
3316 prepareAxes(POSITION);
3317 prepareVirtualKeys();
3318 addMapperAndConfigure(mapper);
3319
3320 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3321
3322 NotifyKeyArgs args;
3323
3324 // Press virtual key.
3325 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3326 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3327 processDown(mapper, x, y);
3328 processSync(mapper);
3329
3330 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3331 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3332 ASSERT_EQ(DEVICE_ID, args.deviceId);
3333 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3334 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3335 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
3336 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3337 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3338 ASSERT_EQ(KEY_HOME, args.scanCode);
3339 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3340 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3341
3342 // Release virtual key.
3343 processUp(mapper);
3344 processSync(mapper);
3345
3346 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3347 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3348 ASSERT_EQ(DEVICE_ID, args.deviceId);
3349 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3350 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3351 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
3352 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3353 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3354 ASSERT_EQ(KEY_HOME, args.scanCode);
3355 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3356 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3357
3358 // Should not have sent any motions.
3359 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3360}
3361
3362TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
3363 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3364 addConfigurationProperty("touch.deviceType", "touchScreen");
3365 prepareDisplay(DISPLAY_ORIENTATION_0);
3366 prepareButtons();
3367 prepareAxes(POSITION);
3368 prepareVirtualKeys();
3369 addMapperAndConfigure(mapper);
3370
3371 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3372
3373 NotifyKeyArgs keyArgs;
3374
3375 // Press virtual key.
3376 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3377 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3378 processDown(mapper, x, y);
3379 processSync(mapper);
3380
3381 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3382 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3383 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3384 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3385 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3386 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3387 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
3388 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3389 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3390 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3391 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3392
3393 // Move out of bounds. This should generate a cancel and a pointer down since we moved
3394 // into the display area.
3395 y -= 100;
3396 processMove(mapper, x, y);
3397 processSync(mapper);
3398
3399 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3400 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3401 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3402 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3403 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3404 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3405 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
3406 | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
3407 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3408 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3409 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3410 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3411
3412 NotifyMotionArgs motionArgs;
3413 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3414 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3415 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3416 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3417 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3418 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3419 ASSERT_EQ(0, motionArgs.flags);
3420 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3421 ASSERT_EQ(0, motionArgs.buttonState);
3422 ASSERT_EQ(0, motionArgs.edgeFlags);
3423 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3424 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3425 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3426 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3427 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3428 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3429 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3430 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3431
3432 // Keep moving out of bounds. Should generate a pointer move.
3433 y -= 50;
3434 processMove(mapper, x, y);
3435 processSync(mapper);
3436
3437 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3438 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3439 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3440 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3441 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3442 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3443 ASSERT_EQ(0, motionArgs.flags);
3444 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3445 ASSERT_EQ(0, motionArgs.buttonState);
3446 ASSERT_EQ(0, motionArgs.edgeFlags);
3447 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3448 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3449 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3450 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3451 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3452 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3453 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3454 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3455
3456 // Release out of bounds. Should generate a pointer up.
3457 processUp(mapper);
3458 processSync(mapper);
3459
3460 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3461 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3462 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3463 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3464 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3465 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3466 ASSERT_EQ(0, motionArgs.flags);
3467 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3468 ASSERT_EQ(0, motionArgs.buttonState);
3469 ASSERT_EQ(0, motionArgs.edgeFlags);
3470 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3471 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3472 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3473 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3474 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3475 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3476 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3477 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3478
3479 // Should not have sent any more keys or motions.
3480 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3481 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3482}
3483
3484TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
3485 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3486 addConfigurationProperty("touch.deviceType", "touchScreen");
3487 prepareDisplay(DISPLAY_ORIENTATION_0);
3488 prepareButtons();
3489 prepareAxes(POSITION);
3490 prepareVirtualKeys();
3491 addMapperAndConfigure(mapper);
3492
3493 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3494
3495 NotifyMotionArgs motionArgs;
3496
3497 // Initially go down out of bounds.
3498 int32_t x = -10;
3499 int32_t y = -10;
3500 processDown(mapper, x, y);
3501 processSync(mapper);
3502
3503 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3504
3505 // Move into the display area. Should generate a pointer down.
3506 x = 50;
3507 y = 75;
3508 processMove(mapper, x, y);
3509 processSync(mapper);
3510
3511 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3512 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3513 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3514 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3515 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3516 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3517 ASSERT_EQ(0, motionArgs.flags);
3518 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3519 ASSERT_EQ(0, motionArgs.buttonState);
3520 ASSERT_EQ(0, motionArgs.edgeFlags);
3521 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3522 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3523 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3524 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3525 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3526 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3527 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3528 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3529
3530 // Release. Should generate a pointer up.
3531 processUp(mapper);
3532 processSync(mapper);
3533
3534 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3535 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3536 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3537 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3538 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3539 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3540 ASSERT_EQ(0, motionArgs.flags);
3541 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3542 ASSERT_EQ(0, motionArgs.buttonState);
3543 ASSERT_EQ(0, motionArgs.edgeFlags);
3544 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3545 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3546 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3547 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3548 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3549 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3550 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3551 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3552
3553 // Should not have sent any more keys or motions.
3554 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3555 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3556}
3557
Santos Cordonfa5cf462017-04-05 10:37:00 -07003558TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture_VirtualDisplay) {
3559 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3560 addConfigurationProperty("touch.deviceType", "touchScreen");
3561 addConfigurationProperty("touch.displayId", VIRTUAL_DISPLAY_UNIQUE_ID);
3562
3563 prepareVirtualDisplay(DISPLAY_ORIENTATION_0);
3564 prepareButtons();
3565 prepareAxes(POSITION);
3566 prepareVirtualKeys();
3567 addMapperAndConfigure(mapper);
3568
3569 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3570
3571 NotifyMotionArgs motionArgs;
3572
3573 // Down.
3574 int32_t x = 100;
3575 int32_t y = 125;
3576 processDown(mapper, x, y);
3577 processSync(mapper);
3578
3579 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3580 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3581 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3582 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3583 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3584 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3585 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3586 ASSERT_EQ(0, motionArgs.flags);
3587 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3588 ASSERT_EQ(0, motionArgs.buttonState);
3589 ASSERT_EQ(0, motionArgs.edgeFlags);
3590 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3591 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3592 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3593 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3594 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3595 1, 0, 0, 0, 0, 0, 0, 0));
3596 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3597 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3598 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3599
3600 // Move.
3601 x += 50;
3602 y += 75;
3603 processMove(mapper, x, y);
3604 processSync(mapper);
3605
3606 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3607 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3608 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3609 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3610 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3611 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3612 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3613 ASSERT_EQ(0, motionArgs.flags);
3614 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3615 ASSERT_EQ(0, motionArgs.buttonState);
3616 ASSERT_EQ(0, motionArgs.edgeFlags);
3617 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3618 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3619 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3620 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3621 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3622 1, 0, 0, 0, 0, 0, 0, 0));
3623 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3624 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3625 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3626
3627 // Up.
3628 processUp(mapper);
3629 processSync(mapper);
3630
3631 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3632 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3633 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3634 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3635 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3636 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3637 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3638 ASSERT_EQ(0, motionArgs.flags);
3639 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3640 ASSERT_EQ(0, motionArgs.buttonState);
3641 ASSERT_EQ(0, motionArgs.edgeFlags);
3642 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3643 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3644 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3645 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3646 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3647 1, 0, 0, 0, 0, 0, 0, 0));
3648 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3649 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3650 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3651
3652 // Should not have sent any more keys or motions.
3653 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3654 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3655}
3656
Michael Wrightd02c5b62014-02-10 15:10:22 -08003657TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
3658 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3659 addConfigurationProperty("touch.deviceType", "touchScreen");
3660 prepareDisplay(DISPLAY_ORIENTATION_0);
3661 prepareButtons();
3662 prepareAxes(POSITION);
3663 prepareVirtualKeys();
3664 addMapperAndConfigure(mapper);
3665
3666 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3667
3668 NotifyMotionArgs motionArgs;
3669
3670 // Down.
3671 int32_t x = 100;
3672 int32_t y = 125;
3673 processDown(mapper, x, y);
3674 processSync(mapper);
3675
3676 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3677 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3678 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3679 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3680 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3681 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3682 ASSERT_EQ(0, motionArgs.flags);
3683 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3684 ASSERT_EQ(0, motionArgs.buttonState);
3685 ASSERT_EQ(0, motionArgs.edgeFlags);
3686 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3687 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3688 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3689 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3690 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3691 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3692 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3693 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3694
3695 // Move.
3696 x += 50;
3697 y += 75;
3698 processMove(mapper, x, y);
3699 processSync(mapper);
3700
3701 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3702 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3703 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3704 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3705 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3706 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3707 ASSERT_EQ(0, motionArgs.flags);
3708 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3709 ASSERT_EQ(0, motionArgs.buttonState);
3710 ASSERT_EQ(0, motionArgs.edgeFlags);
3711 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3712 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3713 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3714 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3715 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3716 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3717 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3718 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3719
3720 // Up.
3721 processUp(mapper);
3722 processSync(mapper);
3723
3724 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3725 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3726 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3727 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3728 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3729 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3730 ASSERT_EQ(0, motionArgs.flags);
3731 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3732 ASSERT_EQ(0, motionArgs.buttonState);
3733 ASSERT_EQ(0, motionArgs.edgeFlags);
3734 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3735 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3736 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3737 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3738 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3739 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3740 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3741 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3742
3743 // Should not have sent any more keys or motions.
3744 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3745 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3746}
3747
3748TEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) {
3749 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3750 addConfigurationProperty("touch.deviceType", "touchScreen");
3751 prepareButtons();
3752 prepareAxes(POSITION);
3753 addConfigurationProperty("touch.orientationAware", "0");
3754 addMapperAndConfigure(mapper);
3755
3756 NotifyMotionArgs args;
3757
3758 // Rotation 90.
3759 prepareDisplay(DISPLAY_ORIENTATION_90);
3760 processDown(mapper, toRawX(50), toRawY(75));
3761 processSync(mapper);
3762
3763 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3764 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3765 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3766
3767 processUp(mapper);
3768 processSync(mapper);
3769 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3770}
3771
3772TEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) {
3773 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3774 addConfigurationProperty("touch.deviceType", "touchScreen");
3775 prepareButtons();
3776 prepareAxes(POSITION);
3777 addMapperAndConfigure(mapper);
3778
3779 NotifyMotionArgs args;
3780
3781 // Rotation 0.
3782 prepareDisplay(DISPLAY_ORIENTATION_0);
3783 processDown(mapper, toRawX(50), toRawY(75));
3784 processSync(mapper);
3785
3786 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3787 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3788 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3789
3790 processUp(mapper);
3791 processSync(mapper);
3792 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3793
3794 // Rotation 90.
3795 prepareDisplay(DISPLAY_ORIENTATION_90);
3796 processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50));
3797 processSync(mapper);
3798
3799 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3800 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3801 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3802
3803 processUp(mapper);
3804 processSync(mapper);
3805 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3806
3807 // Rotation 180.
3808 prepareDisplay(DISPLAY_ORIENTATION_180);
3809 processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN);
3810 processSync(mapper);
3811
3812 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3813 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3814 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3815
3816 processUp(mapper);
3817 processSync(mapper);
3818 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3819
3820 // Rotation 270.
3821 prepareDisplay(DISPLAY_ORIENTATION_270);
3822 processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN);
3823 processSync(mapper);
3824
3825 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3826 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3827 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3828
3829 processUp(mapper);
3830 processSync(mapper);
3831 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3832}
3833
3834TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
3835 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3836 addConfigurationProperty("touch.deviceType", "touchScreen");
3837 prepareDisplay(DISPLAY_ORIENTATION_0);
3838 prepareButtons();
3839 prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT);
3840 addMapperAndConfigure(mapper);
3841
3842 // These calculations are based on the input device calibration documentation.
3843 int32_t rawX = 100;
3844 int32_t rawY = 200;
3845 int32_t rawPressure = 10;
3846 int32_t rawToolMajor = 12;
3847 int32_t rawDistance = 2;
3848 int32_t rawTiltX = 30;
3849 int32_t rawTiltY = 110;
3850
3851 float x = toDisplayX(rawX);
3852 float y = toDisplayY(rawY);
3853 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
3854 float size = float(rawToolMajor) / RAW_TOOL_MAX;
3855 float tool = float(rawToolMajor) * GEOMETRIC_SCALE;
3856 float distance = float(rawDistance);
3857
3858 float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f;
3859 float tiltScale = M_PI / 180;
3860 float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale;
3861 float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale;
3862 float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle));
3863 float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle));
3864
3865 processDown(mapper, rawX, rawY);
3866 processPressure(mapper, rawPressure);
3867 processToolMajor(mapper, rawToolMajor);
3868 processDistance(mapper, rawDistance);
3869 processTilt(mapper, rawTiltX, rawTiltY);
3870 processSync(mapper);
3871
3872 NotifyMotionArgs args;
3873 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3874 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3875 x, y, pressure, size, tool, tool, tool, tool, orientation, distance));
3876 ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT));
3877}
3878
Jason Gerecke489fda82012-09-07 17:19:40 -07003879TEST_F(SingleTouchInputMapperTest, Process_XYAxes_AffineCalibration) {
3880 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3881 addConfigurationProperty("touch.deviceType", "touchScreen");
3882 prepareDisplay(DISPLAY_ORIENTATION_0);
3883 prepareLocationCalibration();
3884 prepareButtons();
3885 prepareAxes(POSITION);
3886 addMapperAndConfigure(mapper);
3887
3888 int32_t rawX = 100;
3889 int32_t rawY = 200;
3890
3891 float x = toDisplayX(toCookedX(rawX, rawY));
3892 float y = toDisplayY(toCookedY(rawX, rawY));
3893
3894 processDown(mapper, rawX, rawY);
3895 processSync(mapper);
3896
3897 NotifyMotionArgs args;
3898 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3899 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3900 x, y, 1, 0, 0, 0, 0, 0, 0, 0));
3901}
3902
Michael Wrightd02c5b62014-02-10 15:10:22 -08003903TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) {
3904 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3905 addConfigurationProperty("touch.deviceType", "touchScreen");
3906 prepareDisplay(DISPLAY_ORIENTATION_0);
3907 prepareButtons();
3908 prepareAxes(POSITION);
3909 addMapperAndConfigure(mapper);
3910
3911 NotifyMotionArgs motionArgs;
3912 NotifyKeyArgs keyArgs;
3913
3914 processDown(mapper, 100, 200);
3915 processSync(mapper);
3916 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3917 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3918 ASSERT_EQ(0, motionArgs.buttonState);
3919
3920 // press BTN_LEFT, release BTN_LEFT
3921 processKey(mapper, BTN_LEFT, 1);
3922 processSync(mapper);
3923 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3924 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3925 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
3926
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003927 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3928 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3929 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
3930
Michael Wrightd02c5b62014-02-10 15:10:22 -08003931 processKey(mapper, BTN_LEFT, 0);
3932 processSync(mapper);
3933 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003934 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003935 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003936
3937 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003938 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003939 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003940
3941 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
3942 processKey(mapper, BTN_RIGHT, 1);
3943 processKey(mapper, BTN_MIDDLE, 1);
3944 processSync(mapper);
3945 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3946 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3947 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
3948 motionArgs.buttonState);
3949
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003950 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3951 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3952 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
3953
3954 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3955 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3956 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
3957 motionArgs.buttonState);
3958
Michael Wrightd02c5b62014-02-10 15:10:22 -08003959 processKey(mapper, BTN_RIGHT, 0);
3960 processSync(mapper);
3961 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003962 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003963 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003964
3965 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003966 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003967 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003968
3969 processKey(mapper, BTN_MIDDLE, 0);
3970 processSync(mapper);
3971 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003972 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003973 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003974
3975 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003976 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003977 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003978
3979 // press BTN_BACK, release BTN_BACK
3980 processKey(mapper, BTN_BACK, 1);
3981 processSync(mapper);
3982 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3983 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3984 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003985
Michael Wrightd02c5b62014-02-10 15:10:22 -08003986 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003987 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003988 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
3989
3990 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3991 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3992 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003993
3994 processKey(mapper, BTN_BACK, 0);
3995 processSync(mapper);
3996 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003997 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003998 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003999
4000 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004001 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004002 ASSERT_EQ(0, motionArgs.buttonState);
4003
Michael Wrightd02c5b62014-02-10 15:10:22 -08004004 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4005 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4006 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4007
4008 // press BTN_SIDE, release BTN_SIDE
4009 processKey(mapper, BTN_SIDE, 1);
4010 processSync(mapper);
4011 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4012 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4013 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004014
Michael Wrightd02c5b62014-02-10 15:10:22 -08004015 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004016 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004017 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4018
4019 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4020 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4021 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004022
4023 processKey(mapper, BTN_SIDE, 0);
4024 processSync(mapper);
4025 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004026 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004027 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004028
4029 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004030 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004031 ASSERT_EQ(0, motionArgs.buttonState);
4032
Michael Wrightd02c5b62014-02-10 15:10:22 -08004033 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4034 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4035 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4036
4037 // press BTN_FORWARD, release BTN_FORWARD
4038 processKey(mapper, BTN_FORWARD, 1);
4039 processSync(mapper);
4040 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4041 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4042 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004043
Michael Wrightd02c5b62014-02-10 15:10:22 -08004044 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004045 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004046 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4047
4048 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4049 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4050 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004051
4052 processKey(mapper, BTN_FORWARD, 0);
4053 processSync(mapper);
4054 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004055 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004056 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004057
4058 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004059 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004060 ASSERT_EQ(0, motionArgs.buttonState);
4061
Michael Wrightd02c5b62014-02-10 15:10:22 -08004062 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4063 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4064 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4065
4066 // press BTN_EXTRA, release BTN_EXTRA
4067 processKey(mapper, BTN_EXTRA, 1);
4068 processSync(mapper);
4069 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4070 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4071 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004072
Michael Wrightd02c5b62014-02-10 15:10:22 -08004073 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004074 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004075 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4076
4077 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4078 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4079 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004080
4081 processKey(mapper, BTN_EXTRA, 0);
4082 processSync(mapper);
4083 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004084 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004085 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004086
4087 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004088 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004089 ASSERT_EQ(0, motionArgs.buttonState);
4090
Michael Wrightd02c5b62014-02-10 15:10:22 -08004091 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4092 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4093 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4094
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004095 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4096
Michael Wrightd02c5b62014-02-10 15:10:22 -08004097 // press BTN_STYLUS, release BTN_STYLUS
4098 processKey(mapper, BTN_STYLUS, 1);
4099 processSync(mapper);
4100 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4101 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004102 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
4103
4104 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4105 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4106 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004107
4108 processKey(mapper, BTN_STYLUS, 0);
4109 processSync(mapper);
4110 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004111 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004112 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004113
4114 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004115 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004116 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004117
4118 // press BTN_STYLUS2, release BTN_STYLUS2
4119 processKey(mapper, BTN_STYLUS2, 1);
4120 processSync(mapper);
4121 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4122 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004123 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
4124
4125 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4126 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4127 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004128
4129 processKey(mapper, BTN_STYLUS2, 0);
4130 processSync(mapper);
4131 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004132 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004133 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004134
4135 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004136 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004137 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004138
4139 // release touch
4140 processUp(mapper);
4141 processSync(mapper);
4142 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4143 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4144 ASSERT_EQ(0, motionArgs.buttonState);
4145}
4146
4147TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
4148 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4149 addConfigurationProperty("touch.deviceType", "touchScreen");
4150 prepareDisplay(DISPLAY_ORIENTATION_0);
4151 prepareButtons();
4152 prepareAxes(POSITION);
4153 addMapperAndConfigure(mapper);
4154
4155 NotifyMotionArgs motionArgs;
4156
4157 // default tool type is finger
4158 processDown(mapper, 100, 200);
4159 processSync(mapper);
4160 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4161 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4162 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4163
4164 // eraser
4165 processKey(mapper, BTN_TOOL_RUBBER, 1);
4166 processSync(mapper);
4167 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4168 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4169 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4170
4171 // stylus
4172 processKey(mapper, BTN_TOOL_RUBBER, 0);
4173 processKey(mapper, BTN_TOOL_PEN, 1);
4174 processSync(mapper);
4175 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4176 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4177 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4178
4179 // brush
4180 processKey(mapper, BTN_TOOL_PEN, 0);
4181 processKey(mapper, BTN_TOOL_BRUSH, 1);
4182 processSync(mapper);
4183 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4184 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4185 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4186
4187 // pencil
4188 processKey(mapper, BTN_TOOL_BRUSH, 0);
4189 processKey(mapper, BTN_TOOL_PENCIL, 1);
4190 processSync(mapper);
4191 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4192 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4193 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4194
4195 // airbrush
4196 processKey(mapper, BTN_TOOL_PENCIL, 0);
4197 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
4198 processSync(mapper);
4199 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4200 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4201 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4202
4203 // mouse
4204 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
4205 processKey(mapper, BTN_TOOL_MOUSE, 1);
4206 processSync(mapper);
4207 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4208 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4209 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4210
4211 // lens
4212 processKey(mapper, BTN_TOOL_MOUSE, 0);
4213 processKey(mapper, BTN_TOOL_LENS, 1);
4214 processSync(mapper);
4215 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4216 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4217 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4218
4219 // double-tap
4220 processKey(mapper, BTN_TOOL_LENS, 0);
4221 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
4222 processSync(mapper);
4223 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4224 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4225 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4226
4227 // triple-tap
4228 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
4229 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
4230 processSync(mapper);
4231 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4232 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4233 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4234
4235 // quad-tap
4236 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
4237 processKey(mapper, BTN_TOOL_QUADTAP, 1);
4238 processSync(mapper);
4239 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4240 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4241 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4242
4243 // finger
4244 processKey(mapper, BTN_TOOL_QUADTAP, 0);
4245 processKey(mapper, BTN_TOOL_FINGER, 1);
4246 processSync(mapper);
4247 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4248 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4249 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4250
4251 // stylus trumps finger
4252 processKey(mapper, BTN_TOOL_PEN, 1);
4253 processSync(mapper);
4254 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4255 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4256 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4257
4258 // eraser trumps stylus
4259 processKey(mapper, BTN_TOOL_RUBBER, 1);
4260 processSync(mapper);
4261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4262 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4263 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4264
4265 // mouse trumps eraser
4266 processKey(mapper, BTN_TOOL_MOUSE, 1);
4267 processSync(mapper);
4268 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4269 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4270 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4271
4272 // back to default tool type
4273 processKey(mapper, BTN_TOOL_MOUSE, 0);
4274 processKey(mapper, BTN_TOOL_RUBBER, 0);
4275 processKey(mapper, BTN_TOOL_PEN, 0);
4276 processKey(mapper, BTN_TOOL_FINGER, 0);
4277 processSync(mapper);
4278 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4279 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4280 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4281}
4282
4283TEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
4284 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4285 addConfigurationProperty("touch.deviceType", "touchScreen");
4286 prepareDisplay(DISPLAY_ORIENTATION_0);
4287 prepareButtons();
4288 prepareAxes(POSITION);
4289 mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0);
4290 addMapperAndConfigure(mapper);
4291
4292 NotifyMotionArgs motionArgs;
4293
4294 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
4295 processKey(mapper, BTN_TOOL_FINGER, 1);
4296 processMove(mapper, 100, 200);
4297 processSync(mapper);
4298 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4299 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4300 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4301 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4302
4303 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4304 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4305 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4306 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4307
4308 // move a little
4309 processMove(mapper, 150, 250);
4310 processSync(mapper);
4311 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4312 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4313 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4314 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4315
4316 // down when BTN_TOUCH is pressed, pressure defaults to 1
4317 processKey(mapper, BTN_TOUCH, 1);
4318 processSync(mapper);
4319 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4320 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4321 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4322 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4323
4324 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4325 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4326 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4327 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4328
4329 // up when BTN_TOUCH is released, hover restored
4330 processKey(mapper, BTN_TOUCH, 0);
4331 processSync(mapper);
4332 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4333 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4334 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4335 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4336
4337 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4338 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4339 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4340 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4341
4342 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4343 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4344 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4345 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4346
4347 // exit hover when pointer goes away
4348 processKey(mapper, BTN_TOOL_FINGER, 0);
4349 processSync(mapper);
4350 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4351 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4352 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4353 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4354}
4355
4356TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) {
4357 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4358 addConfigurationProperty("touch.deviceType", "touchScreen");
4359 prepareDisplay(DISPLAY_ORIENTATION_0);
4360 prepareButtons();
4361 prepareAxes(POSITION | PRESSURE);
4362 addMapperAndConfigure(mapper);
4363
4364 NotifyMotionArgs motionArgs;
4365
4366 // initially hovering because pressure is 0
4367 processDown(mapper, 100, 200);
4368 processPressure(mapper, 0);
4369 processSync(mapper);
4370 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4371 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4372 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4373 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4374
4375 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4376 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4377 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4378 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4379
4380 // move a little
4381 processMove(mapper, 150, 250);
4382 processSync(mapper);
4383 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4384 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4385 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4386 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4387
4388 // down when pressure is non-zero
4389 processPressure(mapper, RAW_PRESSURE_MAX);
4390 processSync(mapper);
4391 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4392 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4393 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4394 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4395
4396 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4397 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4398 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4399 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4400
4401 // up when pressure becomes 0, hover restored
4402 processPressure(mapper, 0);
4403 processSync(mapper);
4404 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4405 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4406 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4407 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4408
4409 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4410 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4411 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4412 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4413
4414 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4415 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4416 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4417 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4418
4419 // exit hover when pointer goes away
4420 processUp(mapper);
4421 processSync(mapper);
4422 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4423 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4424 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4425 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4426}
4427
4428
4429// --- MultiTouchInputMapperTest ---
4430
4431class MultiTouchInputMapperTest : public TouchInputMapperTest {
4432protected:
4433 void prepareAxes(int axes);
4434
4435 void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
4436 void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
4437 void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
4438 void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
4439 void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
4440 void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
4441 void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
4442 void processDistance(MultiTouchInputMapper* mapper, int32_t distance);
4443 void processId(MultiTouchInputMapper* mapper, int32_t id);
4444 void processSlot(MultiTouchInputMapper* mapper, int32_t slot);
4445 void processToolType(MultiTouchInputMapper* mapper, int32_t toolType);
4446 void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value);
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004447 void processTimestamp(MultiTouchInputMapper* mapper, uint32_t value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004448 void processMTSync(MultiTouchInputMapper* mapper);
4449 void processSync(MultiTouchInputMapper* mapper);
4450};
4451
4452void MultiTouchInputMapperTest::prepareAxes(int axes) {
4453 if (axes & POSITION) {
4454 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X,
4455 RAW_X_MIN, RAW_X_MAX, 0, 0);
4456 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y,
4457 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
4458 }
4459 if (axes & TOUCH) {
4460 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR,
4461 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4462 if (axes & MINOR) {
4463 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
4464 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4465 }
4466 }
4467 if (axes & TOOL) {
4468 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR,
4469 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
4470 if (axes & MINOR) {
4471 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
4472 RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
4473 }
4474 }
4475 if (axes & ORIENTATION) {
4476 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION,
4477 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
4478 }
4479 if (axes & PRESSURE) {
4480 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE,
4481 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
4482 }
4483 if (axes & DISTANCE) {
4484 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE,
4485 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
4486 }
4487 if (axes & ID) {
4488 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
4489 RAW_ID_MIN, RAW_ID_MAX, 0, 0);
4490 }
4491 if (axes & SLOT) {
4492 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT,
4493 RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0);
4494 mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0);
4495 }
4496 if (axes & TOOL_TYPE) {
4497 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE,
4498 0, MT_TOOL_MAX, 0, 0);
4499 }
4500}
4501
4502void MultiTouchInputMapperTest::processPosition(
4503 MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
4504 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_X, x);
4505 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_Y, y);
4506}
4507
4508void MultiTouchInputMapperTest::processTouchMajor(
4509 MultiTouchInputMapper* mapper, int32_t touchMajor) {
4510 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor);
4511}
4512
4513void MultiTouchInputMapperTest::processTouchMinor(
4514 MultiTouchInputMapper* mapper, int32_t touchMinor) {
4515 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor);
4516}
4517
4518void MultiTouchInputMapperTest::processToolMajor(
4519 MultiTouchInputMapper* mapper, int32_t toolMajor) {
4520 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor);
4521}
4522
4523void MultiTouchInputMapperTest::processToolMinor(
4524 MultiTouchInputMapper* mapper, int32_t toolMinor) {
4525 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor);
4526}
4527
4528void MultiTouchInputMapperTest::processOrientation(
4529 MultiTouchInputMapper* mapper, int32_t orientation) {
4530 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_ORIENTATION, orientation);
4531}
4532
4533void MultiTouchInputMapperTest::processPressure(
4534 MultiTouchInputMapper* mapper, int32_t pressure) {
4535 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_PRESSURE, pressure);
4536}
4537
4538void MultiTouchInputMapperTest::processDistance(
4539 MultiTouchInputMapper* mapper, int32_t distance) {
4540 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_DISTANCE, distance);
4541}
4542
4543void MultiTouchInputMapperTest::processId(
4544 MultiTouchInputMapper* mapper, int32_t id) {
4545 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TRACKING_ID, id);
4546}
4547
4548void MultiTouchInputMapperTest::processSlot(
4549 MultiTouchInputMapper* mapper, int32_t slot) {
4550 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_SLOT, slot);
4551}
4552
4553void MultiTouchInputMapperTest::processToolType(
4554 MultiTouchInputMapper* mapper, int32_t toolType) {
4555 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOOL_TYPE, toolType);
4556}
4557
4558void MultiTouchInputMapperTest::processKey(
4559 MultiTouchInputMapper* mapper, int32_t code, int32_t value) {
4560 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value);
4561}
4562
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004563void MultiTouchInputMapperTest::processTimestamp(MultiTouchInputMapper* mapper, uint32_t value) {
4564 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_MSC, MSC_TIMESTAMP, value);
4565}
4566
Michael Wrightd02c5b62014-02-10 15:10:22 -08004567void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
4568 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_MT_REPORT, 0);
4569}
4570
4571void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
4572 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
4573}
4574
4575
4576TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) {
4577 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4578 addConfigurationProperty("touch.deviceType", "touchScreen");
4579 prepareDisplay(DISPLAY_ORIENTATION_0);
4580 prepareAxes(POSITION);
4581 prepareVirtualKeys();
4582 addMapperAndConfigure(mapper);
4583
4584 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4585
4586 NotifyMotionArgs motionArgs;
4587
4588 // Two fingers down at once.
4589 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4590 processPosition(mapper, x1, y1);
4591 processMTSync(mapper);
4592 processPosition(mapper, x2, y2);
4593 processMTSync(mapper);
4594 processSync(mapper);
4595
4596 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4597 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4598 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4599 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4600 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4601 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4602 ASSERT_EQ(0, motionArgs.flags);
4603 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4604 ASSERT_EQ(0, motionArgs.buttonState);
4605 ASSERT_EQ(0, motionArgs.edgeFlags);
4606 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4607 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4608 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4609 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4610 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4611 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4612 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4613 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4614
4615 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4616 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4617 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4618 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4619 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4620 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4621 motionArgs.action);
4622 ASSERT_EQ(0, motionArgs.flags);
4623 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4624 ASSERT_EQ(0, motionArgs.buttonState);
4625 ASSERT_EQ(0, motionArgs.edgeFlags);
4626 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4627 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4628 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4629 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4630 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4631 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4632 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4633 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4634 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4635 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4636 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4637 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4638
4639 // Move.
4640 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4641 processPosition(mapper, x1, y1);
4642 processMTSync(mapper);
4643 processPosition(mapper, x2, y2);
4644 processMTSync(mapper);
4645 processSync(mapper);
4646
4647 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4648 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4649 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4650 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4651 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4652 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4653 ASSERT_EQ(0, motionArgs.flags);
4654 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4655 ASSERT_EQ(0, motionArgs.buttonState);
4656 ASSERT_EQ(0, motionArgs.edgeFlags);
4657 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4658 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4659 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4660 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4661 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4662 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4663 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4664 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4665 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4666 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4667 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4668 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4669
4670 // First finger up.
4671 x2 += 15; y2 -= 20;
4672 processPosition(mapper, x2, y2);
4673 processMTSync(mapper);
4674 processSync(mapper);
4675
4676 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4677 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4678 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4679 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4680 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4681 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4682 motionArgs.action);
4683 ASSERT_EQ(0, motionArgs.flags);
4684 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4685 ASSERT_EQ(0, motionArgs.buttonState);
4686 ASSERT_EQ(0, motionArgs.edgeFlags);
4687 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4688 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4689 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4690 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4691 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4692 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4693 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4694 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4695 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4696 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4697 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4698 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4699
4700 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4701 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4702 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4703 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4704 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4705 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4706 ASSERT_EQ(0, motionArgs.flags);
4707 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4708 ASSERT_EQ(0, motionArgs.buttonState);
4709 ASSERT_EQ(0, motionArgs.edgeFlags);
4710 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4711 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4712 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4713 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4714 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4715 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4716 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4717 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4718
4719 // Move.
4720 x2 += 20; y2 -= 25;
4721 processPosition(mapper, x2, y2);
4722 processMTSync(mapper);
4723 processSync(mapper);
4724
4725 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4726 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4727 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4728 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4729 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4730 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4731 ASSERT_EQ(0, motionArgs.flags);
4732 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4733 ASSERT_EQ(0, motionArgs.buttonState);
4734 ASSERT_EQ(0, motionArgs.edgeFlags);
4735 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4736 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4737 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4738 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4739 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4740 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4741 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4742 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4743
4744 // New finger down.
4745 int32_t x3 = 700, y3 = 300;
4746 processPosition(mapper, x2, y2);
4747 processMTSync(mapper);
4748 processPosition(mapper, x3, y3);
4749 processMTSync(mapper);
4750 processSync(mapper);
4751
4752 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4753 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4754 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4755 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4756 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4757 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4758 motionArgs.action);
4759 ASSERT_EQ(0, motionArgs.flags);
4760 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4761 ASSERT_EQ(0, motionArgs.buttonState);
4762 ASSERT_EQ(0, motionArgs.edgeFlags);
4763 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4764 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4765 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4766 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4767 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4768 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4769 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4770 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4771 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4772 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4773 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4774 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4775
4776 // Second finger up.
4777 x3 += 30; y3 -= 20;
4778 processPosition(mapper, x3, y3);
4779 processMTSync(mapper);
4780 processSync(mapper);
4781
4782 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4783 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4784 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4785 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4786 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4787 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4788 motionArgs.action);
4789 ASSERT_EQ(0, motionArgs.flags);
4790 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4791 ASSERT_EQ(0, motionArgs.buttonState);
4792 ASSERT_EQ(0, motionArgs.edgeFlags);
4793 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4794 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4795 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4796 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4797 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4798 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4799 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4800 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4801 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4802 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4803 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4804 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4805
4806 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4807 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4808 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4809 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4810 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4811 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4812 ASSERT_EQ(0, motionArgs.flags);
4813 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4814 ASSERT_EQ(0, motionArgs.buttonState);
4815 ASSERT_EQ(0, motionArgs.edgeFlags);
4816 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4817 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4818 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4819 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4820 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4821 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4822 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4823 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4824
4825 // Last finger up.
4826 processMTSync(mapper);
4827 processSync(mapper);
4828
4829 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4830 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4831 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4832 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4833 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4834 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4835 ASSERT_EQ(0, motionArgs.flags);
4836 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4837 ASSERT_EQ(0, motionArgs.buttonState);
4838 ASSERT_EQ(0, motionArgs.edgeFlags);
4839 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4840 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4841 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4842 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4843 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4844 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4845 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4846 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4847
4848 // Should not have sent any more keys or motions.
4849 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4850 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4851}
4852
4853TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
4854 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4855 addConfigurationProperty("touch.deviceType", "touchScreen");
4856 prepareDisplay(DISPLAY_ORIENTATION_0);
4857 prepareAxes(POSITION | ID);
4858 prepareVirtualKeys();
4859 addMapperAndConfigure(mapper);
4860
4861 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4862
4863 NotifyMotionArgs motionArgs;
4864
4865 // Two fingers down at once.
4866 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4867 processPosition(mapper, x1, y1);
4868 processId(mapper, 1);
4869 processMTSync(mapper);
4870 processPosition(mapper, x2, y2);
4871 processId(mapper, 2);
4872 processMTSync(mapper);
4873 processSync(mapper);
4874
4875 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4876 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4877 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4878 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4879 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4880 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4881 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4882
4883 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4884 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4885 motionArgs.action);
4886 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4887 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4888 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4889 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4890 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4891 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4892 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4893 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4894 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4895
4896 // Move.
4897 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4898 processPosition(mapper, x1, y1);
4899 processId(mapper, 1);
4900 processMTSync(mapper);
4901 processPosition(mapper, x2, y2);
4902 processId(mapper, 2);
4903 processMTSync(mapper);
4904 processSync(mapper);
4905
4906 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4907 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4908 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4909 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4910 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4911 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4912 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4913 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4914 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4915 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4916 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4917
4918 // First finger up.
4919 x2 += 15; y2 -= 20;
4920 processPosition(mapper, x2, y2);
4921 processId(mapper, 2);
4922 processMTSync(mapper);
4923 processSync(mapper);
4924
4925 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4926 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4927 motionArgs.action);
4928 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4929 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4930 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4931 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4932 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4933 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4934 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4935 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4936 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4937
4938 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4939 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4940 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4941 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4942 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4943 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4944 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4945
4946 // Move.
4947 x2 += 20; y2 -= 25;
4948 processPosition(mapper, x2, y2);
4949 processId(mapper, 2);
4950 processMTSync(mapper);
4951 processSync(mapper);
4952
4953 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4954 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4955 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4956 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4957 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4958 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4959 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4960
4961 // New finger down.
4962 int32_t x3 = 700, y3 = 300;
4963 processPosition(mapper, x2, y2);
4964 processId(mapper, 2);
4965 processMTSync(mapper);
4966 processPosition(mapper, x3, y3);
4967 processId(mapper, 3);
4968 processMTSync(mapper);
4969 processSync(mapper);
4970
4971 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4972 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4973 motionArgs.action);
4974 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4975 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4976 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4977 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4978 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4979 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4980 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4981 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4982 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4983
4984 // Second finger up.
4985 x3 += 30; y3 -= 20;
4986 processPosition(mapper, x3, y3);
4987 processId(mapper, 3);
4988 processMTSync(mapper);
4989 processSync(mapper);
4990
4991 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4992 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4993 motionArgs.action);
4994 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4995 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4996 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4997 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4998 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4999 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5000 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5001 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5002 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5003
5004 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5005 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5006 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5007 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5008 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5009 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5010 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5011
5012 // Last finger up.
5013 processMTSync(mapper);
5014 processSync(mapper);
5015
5016 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5017 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5018 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5019 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5020 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5021 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5022 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5023
5024 // Should not have sent any more keys or motions.
5025 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5026 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5027}
5028
5029TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) {
5030 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5031 addConfigurationProperty("touch.deviceType", "touchScreen");
5032 prepareDisplay(DISPLAY_ORIENTATION_0);
5033 prepareAxes(POSITION | ID | SLOT);
5034 prepareVirtualKeys();
5035 addMapperAndConfigure(mapper);
5036
5037 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5038
5039 NotifyMotionArgs motionArgs;
5040
5041 // Two fingers down at once.
5042 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5043 processPosition(mapper, x1, y1);
5044 processId(mapper, 1);
5045 processSlot(mapper, 1);
5046 processPosition(mapper, x2, y2);
5047 processId(mapper, 2);
5048 processSync(mapper);
5049
5050 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5051 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5052 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5053 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5054 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5055 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5056 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5057
5058 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5059 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5060 motionArgs.action);
5061 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5062 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5063 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5064 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5065 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5066 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5067 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5068 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5069 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5070
5071 // Move.
5072 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5073 processSlot(mapper, 0);
5074 processPosition(mapper, x1, y1);
5075 processSlot(mapper, 1);
5076 processPosition(mapper, x2, y2);
5077 processSync(mapper);
5078
5079 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5080 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5081 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5082 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5083 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5084 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5085 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5086 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5087 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5088 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5089 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5090
5091 // First finger up.
5092 x2 += 15; y2 -= 20;
5093 processSlot(mapper, 0);
5094 processId(mapper, -1);
5095 processSlot(mapper, 1);
5096 processPosition(mapper, x2, y2);
5097 processSync(mapper);
5098
5099 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5100 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5101 motionArgs.action);
5102 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5103 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5104 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5105 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5106 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5107 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5108 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5109 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5110 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5111
5112 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5113 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5114 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5115 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5116 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5117 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5118 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5119
5120 // Move.
5121 x2 += 20; y2 -= 25;
5122 processPosition(mapper, x2, y2);
5123 processSync(mapper);
5124
5125 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5126 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5127 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5128 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5129 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5130 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5131 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5132
5133 // New finger down.
5134 int32_t x3 = 700, y3 = 300;
5135 processPosition(mapper, x2, y2);
5136 processSlot(mapper, 0);
5137 processId(mapper, 3);
5138 processPosition(mapper, x3, y3);
5139 processSync(mapper);
5140
5141 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5142 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5143 motionArgs.action);
5144 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5145 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5146 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5147 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5148 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5149 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5150 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5151 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5152 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5153
5154 // Second finger up.
5155 x3 += 30; y3 -= 20;
5156 processSlot(mapper, 1);
5157 processId(mapper, -1);
5158 processSlot(mapper, 0);
5159 processPosition(mapper, x3, y3);
5160 processSync(mapper);
5161
5162 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5163 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5164 motionArgs.action);
5165 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5166 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5167 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5168 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5169 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5170 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5171 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5172 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5173 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5174
5175 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5176 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5177 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5178 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5179 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5180 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5181 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5182
5183 // Last finger up.
5184 processId(mapper, -1);
5185 processSync(mapper);
5186
5187 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5188 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5189 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5190 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5191 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5192 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5193 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5194
5195 // Should not have sent any more keys or motions.
5196 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5197 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5198}
5199
5200TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
5201 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5202 addConfigurationProperty("touch.deviceType", "touchScreen");
5203 prepareDisplay(DISPLAY_ORIENTATION_0);
5204 prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE);
5205 addMapperAndConfigure(mapper);
5206
5207 // These calculations are based on the input device calibration documentation.
5208 int32_t rawX = 100;
5209 int32_t rawY = 200;
5210 int32_t rawTouchMajor = 7;
5211 int32_t rawTouchMinor = 6;
5212 int32_t rawToolMajor = 9;
5213 int32_t rawToolMinor = 8;
5214 int32_t rawPressure = 11;
5215 int32_t rawDistance = 0;
5216 int32_t rawOrientation = 3;
5217 int32_t id = 5;
5218
5219 float x = toDisplayX(rawX);
5220 float y = toDisplayY(rawY);
5221 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
5222 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5223 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5224 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5225 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5226 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5227 float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
5228 float distance = float(rawDistance);
5229
5230 processPosition(mapper, rawX, rawY);
5231 processTouchMajor(mapper, rawTouchMajor);
5232 processTouchMinor(mapper, rawTouchMinor);
5233 processToolMajor(mapper, rawToolMajor);
5234 processToolMinor(mapper, rawToolMinor);
5235 processPressure(mapper, rawPressure);
5236 processOrientation(mapper, rawOrientation);
5237 processDistance(mapper, rawDistance);
5238 processId(mapper, id);
5239 processMTSync(mapper);
5240 processSync(mapper);
5241
5242 NotifyMotionArgs args;
5243 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5244 ASSERT_EQ(0, args.pointerProperties[0].id);
5245 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5246 x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor,
5247 orientation, distance));
5248}
5249
5250TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
5251 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5252 addConfigurationProperty("touch.deviceType", "touchScreen");
5253 prepareDisplay(DISPLAY_ORIENTATION_0);
5254 prepareAxes(POSITION | TOUCH | TOOL | MINOR);
5255 addConfigurationProperty("touch.size.calibration", "geometric");
5256 addMapperAndConfigure(mapper);
5257
5258 // These calculations are based on the input device calibration documentation.
5259 int32_t rawX = 100;
5260 int32_t rawY = 200;
5261 int32_t rawTouchMajor = 140;
5262 int32_t rawTouchMinor = 120;
5263 int32_t rawToolMajor = 180;
5264 int32_t rawToolMinor = 160;
5265
5266 float x = toDisplayX(rawX);
5267 float y = toDisplayY(rawY);
5268 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5269 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5270 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5271 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5272 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5273
5274 processPosition(mapper, rawX, rawY);
5275 processTouchMajor(mapper, rawTouchMajor);
5276 processTouchMinor(mapper, rawTouchMinor);
5277 processToolMajor(mapper, rawToolMajor);
5278 processToolMinor(mapper, rawToolMinor);
5279 processMTSync(mapper);
5280 processSync(mapper);
5281
5282 NotifyMotionArgs args;
5283 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5284 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5285 x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0));
5286}
5287
5288TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) {
5289 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5290 addConfigurationProperty("touch.deviceType", "touchScreen");
5291 prepareDisplay(DISPLAY_ORIENTATION_0);
5292 prepareAxes(POSITION | TOUCH | TOOL);
5293 addConfigurationProperty("touch.size.calibration", "diameter");
5294 addConfigurationProperty("touch.size.scale", "10");
5295 addConfigurationProperty("touch.size.bias", "160");
5296 addConfigurationProperty("touch.size.isSummed", "1");
5297 addMapperAndConfigure(mapper);
5298
5299 // These calculations are based on the input device calibration documentation.
5300 // Note: We only provide a single common touch/tool value because the device is assumed
5301 // not to emit separate values for each pointer (isSummed = 1).
5302 int32_t rawX = 100;
5303 int32_t rawY = 200;
5304 int32_t rawX2 = 150;
5305 int32_t rawY2 = 250;
5306 int32_t rawTouchMajor = 5;
5307 int32_t rawToolMajor = 8;
5308
5309 float x = toDisplayX(rawX);
5310 float y = toDisplayY(rawY);
5311 float x2 = toDisplayX(rawX2);
5312 float y2 = toDisplayY(rawY2);
5313 float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX;
5314 float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f;
5315 float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f;
5316
5317 processPosition(mapper, rawX, rawY);
5318 processTouchMajor(mapper, rawTouchMajor);
5319 processToolMajor(mapper, rawToolMajor);
5320 processMTSync(mapper);
5321 processPosition(mapper, rawX2, rawY2);
5322 processTouchMajor(mapper, rawTouchMajor);
5323 processToolMajor(mapper, rawToolMajor);
5324 processMTSync(mapper);
5325 processSync(mapper);
5326
5327 NotifyMotionArgs args;
5328 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5329 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
5330
5331 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5332 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5333 args.action);
5334 ASSERT_EQ(size_t(2), args.pointerCount);
5335 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5336 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5337 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
5338 x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0));
5339}
5340
5341TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) {
5342 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5343 addConfigurationProperty("touch.deviceType", "touchScreen");
5344 prepareDisplay(DISPLAY_ORIENTATION_0);
5345 prepareAxes(POSITION | TOUCH | TOOL);
5346 addConfigurationProperty("touch.size.calibration", "area");
5347 addConfigurationProperty("touch.size.scale", "43");
5348 addConfigurationProperty("touch.size.bias", "3");
5349 addMapperAndConfigure(mapper);
5350
5351 // These calculations are based on the input device calibration documentation.
5352 int32_t rawX = 100;
5353 int32_t rawY = 200;
5354 int32_t rawTouchMajor = 5;
5355 int32_t rawToolMajor = 8;
5356
5357 float x = toDisplayX(rawX);
5358 float y = toDisplayY(rawY);
5359 float size = float(rawTouchMajor) / RAW_TOUCH_MAX;
5360 float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f;
5361 float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f;
5362
5363 processPosition(mapper, rawX, rawY);
5364 processTouchMajor(mapper, rawTouchMajor);
5365 processToolMajor(mapper, rawToolMajor);
5366 processMTSync(mapper);
5367 processSync(mapper);
5368
5369 NotifyMotionArgs args;
5370 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5371 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5372 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5373}
5374
5375TEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) {
5376 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5377 addConfigurationProperty("touch.deviceType", "touchScreen");
5378 prepareDisplay(DISPLAY_ORIENTATION_0);
5379 prepareAxes(POSITION | PRESSURE);
5380 addConfigurationProperty("touch.pressure.calibration", "amplitude");
5381 addConfigurationProperty("touch.pressure.scale", "0.01");
5382 addMapperAndConfigure(mapper);
5383
Michael Wrightaa449c92017-12-13 21:21:43 +00005384 InputDeviceInfo info;
5385 mapper->populateDeviceInfo(&info);
5386 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
5387 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TOUCHSCREEN,
5388 0.0f, RAW_PRESSURE_MAX * 0.01, 0.0f, 0.0f));
5389
Michael Wrightd02c5b62014-02-10 15:10:22 -08005390 // These calculations are based on the input device calibration documentation.
5391 int32_t rawX = 100;
5392 int32_t rawY = 200;
5393 int32_t rawPressure = 60;
5394
5395 float x = toDisplayX(rawX);
5396 float y = toDisplayY(rawY);
5397 float pressure = float(rawPressure) * 0.01f;
5398
5399 processPosition(mapper, rawX, rawY);
5400 processPressure(mapper, rawPressure);
5401 processMTSync(mapper);
5402 processSync(mapper);
5403
5404 NotifyMotionArgs args;
5405 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5406 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5407 x, y, pressure, 0, 0, 0, 0, 0, 0, 0));
5408}
5409
5410TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) {
5411 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5412 addConfigurationProperty("touch.deviceType", "touchScreen");
5413 prepareDisplay(DISPLAY_ORIENTATION_0);
5414 prepareAxes(POSITION | ID | SLOT);
5415 addMapperAndConfigure(mapper);
5416
5417 NotifyMotionArgs motionArgs;
5418 NotifyKeyArgs keyArgs;
5419
5420 processId(mapper, 1);
5421 processPosition(mapper, 100, 200);
5422 processSync(mapper);
5423 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5424 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5425 ASSERT_EQ(0, motionArgs.buttonState);
5426
5427 // press BTN_LEFT, release BTN_LEFT
5428 processKey(mapper, BTN_LEFT, 1);
5429 processSync(mapper);
5430 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5431 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5432 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5433
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005434 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5435 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5436 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5437
Michael Wrightd02c5b62014-02-10 15:10:22 -08005438 processKey(mapper, BTN_LEFT, 0);
5439 processSync(mapper);
5440 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005441 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005442 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005443
5444 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005445 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005446 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005447
5448 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
5449 processKey(mapper, BTN_RIGHT, 1);
5450 processKey(mapper, BTN_MIDDLE, 1);
5451 processSync(mapper);
5452 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5453 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5454 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5455 motionArgs.buttonState);
5456
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005457 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5458 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5459 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
5460
5461 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5462 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5463 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5464 motionArgs.buttonState);
5465
Michael Wrightd02c5b62014-02-10 15:10:22 -08005466 processKey(mapper, BTN_RIGHT, 0);
5467 processSync(mapper);
5468 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005469 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005470 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005471
5472 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005473 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005474 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005475
5476 processKey(mapper, BTN_MIDDLE, 0);
5477 processSync(mapper);
5478 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005479 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005480 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005481
5482 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005483 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005484 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005485
5486 // press BTN_BACK, release BTN_BACK
5487 processKey(mapper, BTN_BACK, 1);
5488 processSync(mapper);
5489 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5490 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5491 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005492
Michael Wrightd02c5b62014-02-10 15:10:22 -08005493 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005494 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005495 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5496
5497 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5498 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5499 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005500
5501 processKey(mapper, BTN_BACK, 0);
5502 processSync(mapper);
5503 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005504 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005505 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005506
5507 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005508 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005509 ASSERT_EQ(0, motionArgs.buttonState);
5510
Michael Wrightd02c5b62014-02-10 15:10:22 -08005511 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5512 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5513 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5514
5515 // press BTN_SIDE, release BTN_SIDE
5516 processKey(mapper, BTN_SIDE, 1);
5517 processSync(mapper);
5518 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5519 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5520 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005521
Michael Wrightd02c5b62014-02-10 15:10:22 -08005522 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005523 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005524 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5525
5526 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5527 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5528 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005529
5530 processKey(mapper, BTN_SIDE, 0);
5531 processSync(mapper);
5532 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005533 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005534 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005535
5536 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005537 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005538 ASSERT_EQ(0, motionArgs.buttonState);
5539
Michael Wrightd02c5b62014-02-10 15:10:22 -08005540 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5541 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5542 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5543
5544 // press BTN_FORWARD, release BTN_FORWARD
5545 processKey(mapper, BTN_FORWARD, 1);
5546 processSync(mapper);
5547 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5548 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5549 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005550
Michael Wrightd02c5b62014-02-10 15:10:22 -08005551 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005552 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005553 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5554
5555 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5556 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5557 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005558
5559 processKey(mapper, BTN_FORWARD, 0);
5560 processSync(mapper);
5561 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005562 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005563 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005564
5565 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005566 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005567 ASSERT_EQ(0, motionArgs.buttonState);
5568
Michael Wrightd02c5b62014-02-10 15:10:22 -08005569 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5570 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5571 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5572
5573 // press BTN_EXTRA, release BTN_EXTRA
5574 processKey(mapper, BTN_EXTRA, 1);
5575 processSync(mapper);
5576 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5577 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5578 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005579
Michael Wrightd02c5b62014-02-10 15:10:22 -08005580 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005581 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005582 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5583
5584 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5585 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5586 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005587
5588 processKey(mapper, BTN_EXTRA, 0);
5589 processSync(mapper);
5590 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005591 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005592 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005593
5594 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005595 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005596 ASSERT_EQ(0, motionArgs.buttonState);
5597
Michael Wrightd02c5b62014-02-10 15:10:22 -08005598 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5599 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5600 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5601
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005602 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5603
Michael Wrightd02c5b62014-02-10 15:10:22 -08005604 // press BTN_STYLUS, release BTN_STYLUS
5605 processKey(mapper, BTN_STYLUS, 1);
5606 processSync(mapper);
5607 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5608 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005609 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
5610
5611 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5612 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5613 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005614
5615 processKey(mapper, BTN_STYLUS, 0);
5616 processSync(mapper);
5617 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005618 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005619 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005620
5621 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005622 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005623 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005624
5625 // press BTN_STYLUS2, release BTN_STYLUS2
5626 processKey(mapper, BTN_STYLUS2, 1);
5627 processSync(mapper);
5628 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5629 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005630 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
5631
5632 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5633 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5634 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005635
5636 processKey(mapper, BTN_STYLUS2, 0);
5637 processSync(mapper);
5638 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005639 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005640 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005641
5642 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005643 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005644 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005645
5646 // release touch
5647 processId(mapper, -1);
5648 processSync(mapper);
5649 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5650 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5651 ASSERT_EQ(0, motionArgs.buttonState);
5652}
5653
5654TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
5655 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5656 addConfigurationProperty("touch.deviceType", "touchScreen");
5657 prepareDisplay(DISPLAY_ORIENTATION_0);
5658 prepareAxes(POSITION | ID | SLOT | TOOL_TYPE);
5659 addMapperAndConfigure(mapper);
5660
5661 NotifyMotionArgs motionArgs;
5662
5663 // default tool type is finger
5664 processId(mapper, 1);
5665 processPosition(mapper, 100, 200);
5666 processSync(mapper);
5667 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5668 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5669 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5670
5671 // eraser
5672 processKey(mapper, BTN_TOOL_RUBBER, 1);
5673 processSync(mapper);
5674 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5675 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5676 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
5677
5678 // stylus
5679 processKey(mapper, BTN_TOOL_RUBBER, 0);
5680 processKey(mapper, BTN_TOOL_PEN, 1);
5681 processSync(mapper);
5682 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5683 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5684 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5685
5686 // brush
5687 processKey(mapper, BTN_TOOL_PEN, 0);
5688 processKey(mapper, BTN_TOOL_BRUSH, 1);
5689 processSync(mapper);
5690 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5691 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5692 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5693
5694 // pencil
5695 processKey(mapper, BTN_TOOL_BRUSH, 0);
5696 processKey(mapper, BTN_TOOL_PENCIL, 1);
5697 processSync(mapper);
5698 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5699 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5700 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5701
5702 // airbrush
5703 processKey(mapper, BTN_TOOL_PENCIL, 0);
5704 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
5705 processSync(mapper);
5706 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5707 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5708 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5709
5710 // mouse
5711 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
5712 processKey(mapper, BTN_TOOL_MOUSE, 1);
5713 processSync(mapper);
5714 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5715 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5716 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5717
5718 // lens
5719 processKey(mapper, BTN_TOOL_MOUSE, 0);
5720 processKey(mapper, BTN_TOOL_LENS, 1);
5721 processSync(mapper);
5722 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5723 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5724 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5725
5726 // double-tap
5727 processKey(mapper, BTN_TOOL_LENS, 0);
5728 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
5729 processSync(mapper);
5730 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5731 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5732 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5733
5734 // triple-tap
5735 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
5736 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
5737 processSync(mapper);
5738 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5739 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5740 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5741
5742 // quad-tap
5743 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
5744 processKey(mapper, BTN_TOOL_QUADTAP, 1);
5745 processSync(mapper);
5746 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5747 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5748 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5749
5750 // finger
5751 processKey(mapper, BTN_TOOL_QUADTAP, 0);
5752 processKey(mapper, BTN_TOOL_FINGER, 1);
5753 processSync(mapper);
5754 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5755 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5756 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5757
5758 // stylus trumps finger
5759 processKey(mapper, BTN_TOOL_PEN, 1);
5760 processSync(mapper);
5761 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5762 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5763 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5764
5765 // eraser trumps stylus
5766 processKey(mapper, BTN_TOOL_RUBBER, 1);
5767 processSync(mapper);
5768 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5769 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5770 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
5771
5772 // mouse trumps eraser
5773 processKey(mapper, BTN_TOOL_MOUSE, 1);
5774 processSync(mapper);
5775 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5776 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5777 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5778
5779 // MT tool type trumps BTN tool types: MT_TOOL_FINGER
5780 processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE
5781 processSync(mapper);
5782 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5783 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5784 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5785
5786 // MT tool type trumps BTN tool types: MT_TOOL_PEN
5787 processToolType(mapper, MT_TOOL_PEN);
5788 processSync(mapper);
5789 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5790 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5791 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5792
5793 // back to default tool type
5794 processToolType(mapper, -1); // use a deliberately undefined tool type, for testing
5795 processKey(mapper, BTN_TOOL_MOUSE, 0);
5796 processKey(mapper, BTN_TOOL_RUBBER, 0);
5797 processKey(mapper, BTN_TOOL_PEN, 0);
5798 processKey(mapper, BTN_TOOL_FINGER, 0);
5799 processSync(mapper);
5800 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5801 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5802 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5803}
5804
5805TEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
5806 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5807 addConfigurationProperty("touch.deviceType", "touchScreen");
5808 prepareDisplay(DISPLAY_ORIENTATION_0);
5809 prepareAxes(POSITION | ID | SLOT);
5810 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
5811 addMapperAndConfigure(mapper);
5812
5813 NotifyMotionArgs motionArgs;
5814
5815 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
5816 processId(mapper, 1);
5817 processPosition(mapper, 100, 200);
5818 processSync(mapper);
5819 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5820 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5821 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5822 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5823
5824 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5825 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5826 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5827 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5828
5829 // move a little
5830 processPosition(mapper, 150, 250);
5831 processSync(mapper);
5832 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5833 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5834 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5835 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5836
5837 // down when BTN_TOUCH is pressed, pressure defaults to 1
5838 processKey(mapper, BTN_TOUCH, 1);
5839 processSync(mapper);
5840 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5841 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5842 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5843 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5844
5845 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5846 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5847 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5848 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5849
5850 // up when BTN_TOUCH is released, hover restored
5851 processKey(mapper, BTN_TOUCH, 0);
5852 processSync(mapper);
5853 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5854 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5855 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5856 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5857
5858 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5859 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5860 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5861 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5862
5863 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5864 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5865 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5866 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5867
5868 // exit hover when pointer goes away
5869 processId(mapper, -1);
5870 processSync(mapper);
5871 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5872 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5873 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5874 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5875}
5876
5877TEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) {
5878 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5879 addConfigurationProperty("touch.deviceType", "touchScreen");
5880 prepareDisplay(DISPLAY_ORIENTATION_0);
5881 prepareAxes(POSITION | ID | SLOT | PRESSURE);
5882 addMapperAndConfigure(mapper);
5883
5884 NotifyMotionArgs motionArgs;
5885
5886 // initially hovering because pressure is 0
5887 processId(mapper, 1);
5888 processPosition(mapper, 100, 200);
5889 processPressure(mapper, 0);
5890 processSync(mapper);
5891 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5892 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5893 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5894 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5895
5896 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5897 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5898 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5899 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5900
5901 // move a little
5902 processPosition(mapper, 150, 250);
5903 processSync(mapper);
5904 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5905 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5906 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5907 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5908
5909 // down when pressure becomes non-zero
5910 processPressure(mapper, RAW_PRESSURE_MAX);
5911 processSync(mapper);
5912 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5913 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5914 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5915 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5916
5917 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5918 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5919 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5920 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5921
5922 // up when pressure becomes 0, hover restored
5923 processPressure(mapper, 0);
5924 processSync(mapper);
5925 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5926 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5927 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5928 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5929
5930 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5931 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5932 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5933 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5934
5935 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5936 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5937 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5938 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5939
5940 // exit hover when pointer goes away
5941 processId(mapper, -1);
5942 processSync(mapper);
5943 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5944 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5945 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5946 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5947}
5948
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08005949TEST_F(MultiTouchInputMapperTest, Process_HandlesTimestamp) {
5950 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5951
5952 addConfigurationProperty("touch.deviceType", "touchScreen");
5953 prepareDisplay(DISPLAY_ORIENTATION_0);
5954 prepareAxes(POSITION);
5955 addMapperAndConfigure(mapper);
5956 NotifyMotionArgs args;
5957
5958 // By default, deviceTimestamp should be zero
5959 processPosition(mapper, 100, 100);
5960 processMTSync(mapper);
5961 processSync(mapper);
5962 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5963 ASSERT_EQ(0U, args.deviceTimestamp);
5964
5965 // Now the timestamp of 1000 is reported by evdev and should appear in MotionArgs
5966 processPosition(mapper, 0, 0);
5967 processTimestamp(mapper, 1000);
5968 processMTSync(mapper);
5969 processSync(mapper);
5970 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5971 ASSERT_EQ(1000U, args.deviceTimestamp);
5972}
5973
Siarhei Vishniakoueaf7acd2018-01-09 12:35:51 -08005974TEST_F(MultiTouchInputMapperTest, WhenMapperIsReset_TimestampIsCleared) {
5975 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5976
5977 addConfigurationProperty("touch.deviceType", "touchScreen");
5978 prepareDisplay(DISPLAY_ORIENTATION_0);
5979 prepareAxes(POSITION);
5980 addMapperAndConfigure(mapper);
5981 NotifyMotionArgs args;
5982
5983 // Send a touch event with a timestamp
5984 processPosition(mapper, 100, 100);
5985 processTimestamp(mapper, 1);
5986 processMTSync(mapper);
5987 processSync(mapper);
5988 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5989 ASSERT_EQ(1U, args.deviceTimestamp);
5990
5991 // Since the data accumulates, and new timestamp has not arrived, deviceTimestamp won't change
5992 processPosition(mapper, 100, 200);
5993 processMTSync(mapper);
5994 processSync(mapper);
5995 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5996 ASSERT_EQ(1U, args.deviceTimestamp);
5997
5998 mapper->reset(/* when */ 0);
5999 // After the mapper is reset, deviceTimestamp should become zero again
6000 processPosition(mapper, 100, 300);
6001 processMTSync(mapper);
6002 processSync(mapper);
6003 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6004 ASSERT_EQ(0U, args.deviceTimestamp);
6005}
6006
Michael Wrightd02c5b62014-02-10 15:10:22 -08006007
6008} // namespace android