blob: 04b87d5a33606a8c216c320eccf94c63ad8a5ad4 [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;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -070031static const int32_t SECONDARY_DISPLAY_ID = DISPLAY_ID + 1;
Michael Wrightd02c5b62014-02-10 15:10:22 -080032static const int32_t DISPLAY_WIDTH = 480;
33static const int32_t DISPLAY_HEIGHT = 800;
Santos Cordonfa5cf462017-04-05 10:37:00 -070034static const int32_t VIRTUAL_DISPLAY_ID = 1;
35static const int32_t VIRTUAL_DISPLAY_WIDTH = 400;
36static const int32_t VIRTUAL_DISPLAY_HEIGHT = 500;
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -070037static const char* VIRTUAL_DISPLAY_UNIQUE_ID = "virtual:1";
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -070038static constexpr std::optional<uint8_t> NO_PORT = std::nullopt; // no physical port is specified
Michael Wrightd02c5b62014-02-10 15:10:22 -080039
40// Error tolerance for floating point assertions.
41static const float EPSILON = 0.001f;
42
43template<typename T>
44static inline T min(T a, T b) {
45 return a < b ? a : b;
46}
47
48static inline float avg(float x, float y) {
49 return (x + y) / 2;
50}
51
52
53// --- FakePointerController ---
54
55class FakePointerController : public PointerControllerInterface {
56 bool mHaveBounds;
57 float mMinX, mMinY, mMaxX, mMaxY;
58 float mX, mY;
59 int32_t mButtonState;
60
61protected:
62 virtual ~FakePointerController() { }
63
64public:
65 FakePointerController() :
66 mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0),
67 mButtonState(0) {
68 }
69
70 void setBounds(float minX, float minY, float maxX, float maxY) {
71 mHaveBounds = true;
72 mMinX = minX;
73 mMinY = minY;
74 mMaxX = maxX;
75 mMaxY = maxY;
76 }
77
78 virtual void setPosition(float x, float y) {
79 mX = x;
80 mY = y;
81 }
82
83 virtual void setButtonState(int32_t buttonState) {
84 mButtonState = buttonState;
85 }
86
87 virtual int32_t getButtonState() const {
88 return mButtonState;
89 }
90
91 virtual void getPosition(float* outX, float* outY) const {
92 *outX = mX;
93 *outY = mY;
94 }
95
96private:
97 virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
98 *outMinX = mMinX;
99 *outMinY = mMinY;
100 *outMaxX = mMaxX;
101 *outMaxY = mMaxY;
102 return mHaveBounds;
103 }
104
105 virtual void move(float deltaX, float deltaY) {
106 mX += deltaX;
107 if (mX < mMinX) mX = mMinX;
108 if (mX > mMaxX) mX = mMaxX;
109 mY += deltaY;
110 if (mY < mMinY) mY = mMinY;
111 if (mY > mMaxY) mY = mMaxY;
112 }
113
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100114 virtual void fade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800115 }
116
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100117 virtual void unfade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800118 }
119
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100120 virtual void setPresentation(Presentation) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800121 }
122
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100123 virtual void setSpots(const PointerCoords*, const uint32_t*, BitSet32) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800124 }
125
126 virtual void clearSpots() {
127 }
128};
129
130
131// --- FakeInputReaderPolicy ---
132
133class FakeInputReaderPolicy : public InputReaderPolicyInterface {
134 InputReaderConfiguration mConfig;
135 KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
136 Vector<InputDeviceInfo> mInputDevices;
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100137 std::vector<DisplayViewport> mViewports;
Jason Gerecke489fda82012-09-07 17:19:40 -0700138 TouchAffineTransformation transform;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800139
140protected:
141 virtual ~FakeInputReaderPolicy() { }
142
143public:
144 FakeInputReaderPolicy() {
145 }
146
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700147 virtual void clearViewports() {
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100148 mViewports.clear();
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100149 mConfig.setDisplayViewports(mViewports);
Santos Cordonfa5cf462017-04-05 10:37:00 -0700150 }
151
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700152 std::optional<DisplayViewport> getDisplayViewportByUniqueId(const std::string& uniqueId) const {
153 return mConfig.getDisplayViewportByUniqueId(uniqueId);
154 }
155 std::optional<DisplayViewport> getDisplayViewportByType(ViewportType type) const {
156 return mConfig.getDisplayViewportByType(type);
157 }
158
159 std::optional<DisplayViewport> getDisplayViewportByPort(uint8_t displayPort) const {
160 return mConfig.getDisplayViewportByPort(displayPort);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700161 }
162
163 void addDisplayViewport(int32_t displayId, int32_t width, int32_t height, int32_t orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700164 const std::string& uniqueId, std::optional<uint8_t> physicalPort,
165 ViewportType viewportType) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700166 const DisplayViewport viewport = createDisplayViewport(displayId, width, height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700167 orientation, uniqueId, physicalPort, viewportType);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700168 mViewports.push_back(viewport);
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100169 mConfig.setDisplayViewports(mViewports);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800170 }
171
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100172 void addExcludedDeviceName(const std::string& deviceName) {
173 mConfig.excludedDeviceNames.push_back(deviceName);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800174 }
175
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700176 void addInputPortAssociation(const std::string& inputPort, uint8_t displayPort) {
177 mConfig.portAssociations.insert({inputPort, displayPort});
178 }
179
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700180 void addDisabledDevice(int32_t deviceId) {
181 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
182 bool currentlyEnabled = index < 0;
183 if (currentlyEnabled) {
184 mConfig.disabledDevices.add(deviceId);
185 }
186 }
187
188 void removeDisabledDevice(int32_t deviceId) {
189 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
190 bool currentlyEnabled = index < 0;
191 if (!currentlyEnabled) {
192 mConfig.disabledDevices.remove(deviceId);
193 }
194 }
195
Michael Wrightd02c5b62014-02-10 15:10:22 -0800196 void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
197 mPointerControllers.add(deviceId, controller);
198 }
199
200 const InputReaderConfiguration* getReaderConfiguration() const {
201 return &mConfig;
202 }
203
204 const Vector<InputDeviceInfo>& getInputDevices() const {
205 return mInputDevices;
206 }
207
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100208 TouchAffineTransformation getTouchAffineTransformation(const std::string& inputDeviceDescriptor,
Jason Gerecke71b16e82014-03-10 09:47:59 -0700209 int32_t surfaceRotation) {
Jason Gerecke489fda82012-09-07 17:19:40 -0700210 return transform;
211 }
212
213 void setTouchAffineTransformation(const TouchAffineTransformation t) {
214 transform = t;
Jason Gerecke12d6baa2014-01-27 18:34:20 -0800215 }
216
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800217 void setPointerCapture(bool enabled) {
218 mConfig.pointerCapture = enabled;
219 }
220
Michael Wrightd02c5b62014-02-10 15:10:22 -0800221private:
Santos Cordonfa5cf462017-04-05 10:37:00 -0700222 DisplayViewport createDisplayViewport(int32_t displayId, int32_t width, int32_t height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700223 int32_t orientation, const std::string& uniqueId, std::optional<uint8_t> physicalPort,
224 ViewportType type) {
Santos Cordonfa5cf462017-04-05 10:37:00 -0700225 bool isRotated = (orientation == DISPLAY_ORIENTATION_90
226 || orientation == DISPLAY_ORIENTATION_270);
227 DisplayViewport v;
228 v.displayId = displayId;
229 v.orientation = orientation;
230 v.logicalLeft = 0;
231 v.logicalTop = 0;
232 v.logicalRight = isRotated ? height : width;
233 v.logicalBottom = isRotated ? width : height;
234 v.physicalLeft = 0;
235 v.physicalTop = 0;
236 v.physicalRight = isRotated ? height : width;
237 v.physicalBottom = isRotated ? width : height;
238 v.deviceWidth = isRotated ? height : width;
239 v.deviceHeight = isRotated ? width : height;
240 v.uniqueId = uniqueId;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700241 v.physicalPort = physicalPort;
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100242 v.type = type;
Santos Cordonfa5cf462017-04-05 10:37:00 -0700243 return v;
244 }
245
Michael Wrightd02c5b62014-02-10 15:10:22 -0800246 virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) {
247 *outConfig = mConfig;
248 }
249
250 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
251 return mPointerControllers.valueFor(deviceId);
252 }
253
254 virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) {
255 mInputDevices = inputDevices;
256 }
257
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100258 virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const InputDeviceIdentifier&) {
Yi Kong9b14ac62018-07-17 13:48:38 -0700259 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800260 }
261
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100262 virtual std::string getDeviceAlias(const InputDeviceIdentifier&) {
263 return "";
Michael Wrightd02c5b62014-02-10 15:10:22 -0800264 }
265};
266
267
268// --- FakeInputListener ---
269
270class FakeInputListener : public InputListenerInterface {
271private:
272 List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue;
273 List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue;
274 List<NotifyKeyArgs> mNotifyKeyArgsQueue;
275 List<NotifyMotionArgs> mNotifyMotionArgsQueue;
276 List<NotifySwitchArgs> mNotifySwitchArgsQueue;
277
278protected:
279 virtual ~FakeInputListener() { }
280
281public:
282 FakeInputListener() {
283 }
284
285 void assertNotifyConfigurationChangedWasCalled(
Yi Kong9b14ac62018-07-17 13:48:38 -0700286 NotifyConfigurationChangedArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800287 ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty())
288 << "Expected notifyConfigurationChanged() to have been called.";
289 if (outEventArgs) {
290 *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin();
291 }
292 mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin());
293 }
294
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700295 void assertNotifyConfigurationChangedWasNotCalled() {
296 ASSERT_TRUE(mNotifyConfigurationChangedArgsQueue.empty())
297 << "Expected notifyConfigurationChanged() to not have been called.";
298 }
299
Michael Wrightd02c5b62014-02-10 15:10:22 -0800300 void assertNotifyDeviceResetWasCalled(
Yi Kong9b14ac62018-07-17 13:48:38 -0700301 NotifyDeviceResetArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800302 ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty())
303 << "Expected notifyDeviceReset() to have been called.";
304 if (outEventArgs) {
305 *outEventArgs = *mNotifyDeviceResetArgsQueue.begin();
306 }
307 mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin());
308 }
309
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700310 void assertNotifyDeviceResetWasNotCalled() {
311 ASSERT_TRUE(mNotifyDeviceResetArgsQueue.empty())
312 << "Expected notifyDeviceReset() to not have been called.";
313 }
314
Yi Kong9b14ac62018-07-17 13:48:38 -0700315 void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800316 ASSERT_FALSE(mNotifyKeyArgsQueue.empty())
317 << "Expected notifyKey() to have been called.";
318 if (outEventArgs) {
319 *outEventArgs = *mNotifyKeyArgsQueue.begin();
320 }
321 mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin());
322 }
323
324 void assertNotifyKeyWasNotCalled() {
325 ASSERT_TRUE(mNotifyKeyArgsQueue.empty())
326 << "Expected notifyKey() to not have been called.";
327 }
328
Yi Kong9b14ac62018-07-17 13:48:38 -0700329 void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800330 ASSERT_FALSE(mNotifyMotionArgsQueue.empty())
331 << "Expected notifyMotion() to have been called.";
332 if (outEventArgs) {
333 *outEventArgs = *mNotifyMotionArgsQueue.begin();
334 }
335 mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin());
336 }
337
338 void assertNotifyMotionWasNotCalled() {
339 ASSERT_TRUE(mNotifyMotionArgsQueue.empty())
340 << "Expected notifyMotion() to not have been called.";
341 }
342
Yi Kong9b14ac62018-07-17 13:48:38 -0700343 void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800344 ASSERT_FALSE(mNotifySwitchArgsQueue.empty())
345 << "Expected notifySwitch() to have been called.";
346 if (outEventArgs) {
347 *outEventArgs = *mNotifySwitchArgsQueue.begin();
348 }
349 mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin());
350 }
351
352private:
353 virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
354 mNotifyConfigurationChangedArgsQueue.push_back(*args);
355 }
356
357 virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) {
358 mNotifyDeviceResetArgsQueue.push_back(*args);
359 }
360
361 virtual void notifyKey(const NotifyKeyArgs* args) {
362 mNotifyKeyArgsQueue.push_back(*args);
363 }
364
365 virtual void notifyMotion(const NotifyMotionArgs* args) {
366 mNotifyMotionArgsQueue.push_back(*args);
367 }
368
369 virtual void notifySwitch(const NotifySwitchArgs* args) {
370 mNotifySwitchArgsQueue.push_back(*args);
371 }
372};
373
374
375// --- FakeEventHub ---
376
377class FakeEventHub : public EventHubInterface {
378 struct KeyInfo {
379 int32_t keyCode;
380 uint32_t flags;
381 };
382
383 struct Device {
384 InputDeviceIdentifier identifier;
385 uint32_t classes;
386 PropertyMap configuration;
387 KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
388 KeyedVector<int, bool> relativeAxes;
389 KeyedVector<int32_t, int32_t> keyCodeStates;
390 KeyedVector<int32_t, int32_t> scanCodeStates;
391 KeyedVector<int32_t, int32_t> switchStates;
392 KeyedVector<int32_t, int32_t> absoluteAxisValue;
393 KeyedVector<int32_t, KeyInfo> keysByScanCode;
394 KeyedVector<int32_t, KeyInfo> keysByUsageCode;
395 KeyedVector<int32_t, bool> leds;
396 Vector<VirtualKeyDefinition> virtualKeys;
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700397 bool enabled;
398
399 status_t enable() {
400 enabled = true;
401 return OK;
402 }
403
404 status_t disable() {
405 enabled = false;
406 return OK;
407 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800408
Chih-Hung Hsieh6ca70ef2016-04-29 16:23:55 -0700409 explicit Device(uint32_t classes) :
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700410 classes(classes), enabled(true) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800411 }
412 };
413
414 KeyedVector<int32_t, Device*> mDevices;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100415 std::vector<std::string> mExcludedDevices;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800416 List<RawEvent> mEvents;
417
418protected:
419 virtual ~FakeEventHub() {
420 for (size_t i = 0; i < mDevices.size(); i++) {
421 delete mDevices.valueAt(i);
422 }
423 }
424
425public:
426 FakeEventHub() { }
427
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100428 void addDevice(int32_t deviceId, const std::string& name, uint32_t classes) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800429 Device* device = new Device(classes);
430 device->identifier.name = name;
431 mDevices.add(deviceId, device);
432
433 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0);
434 }
435
436 void removeDevice(int32_t deviceId) {
437 delete mDevices.valueFor(deviceId);
438 mDevices.removeItem(deviceId);
439
440 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0);
441 }
442
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700443 bool isDeviceEnabled(int32_t deviceId) {
444 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700445 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700446 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
447 return false;
448 }
449 return device->enabled;
450 }
451
452 status_t enableDevice(int32_t deviceId) {
453 status_t result;
454 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700455 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700456 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
457 return BAD_VALUE;
458 }
459 if (device->enabled) {
460 ALOGW("Duplicate call to %s, device %" PRId32 " already enabled", __func__, deviceId);
461 return OK;
462 }
463 result = device->enable();
464 return result;
465 }
466
467 status_t disableDevice(int32_t deviceId) {
468 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700469 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700470 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
471 return BAD_VALUE;
472 }
473 if (!device->enabled) {
474 ALOGW("Duplicate call to %s, device %" PRId32 " already disabled", __func__, deviceId);
475 return OK;
476 }
477 return device->disable();
478 }
479
Michael Wrightd02c5b62014-02-10 15:10:22 -0800480 void finishDeviceScan() {
481 enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0);
482 }
483
484 void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) {
485 Device* device = getDevice(deviceId);
486 device->configuration.addProperty(key, value);
487 }
488
489 void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
490 Device* device = getDevice(deviceId);
491 device->configuration.addAll(configuration);
492 }
493
494 void addAbsoluteAxis(int32_t deviceId, int axis,
495 int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) {
496 Device* device = getDevice(deviceId);
497
498 RawAbsoluteAxisInfo info;
499 info.valid = true;
500 info.minValue = minValue;
501 info.maxValue = maxValue;
502 info.flat = flat;
503 info.fuzz = fuzz;
504 info.resolution = resolution;
505 device->absoluteAxes.add(axis, info);
506 }
507
508 void addRelativeAxis(int32_t deviceId, int32_t axis) {
509 Device* device = getDevice(deviceId);
510 device->relativeAxes.add(axis, true);
511 }
512
513 void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
514 Device* device = getDevice(deviceId);
515 device->keyCodeStates.replaceValueFor(keyCode, state);
516 }
517
518 void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
519 Device* device = getDevice(deviceId);
520 device->scanCodeStates.replaceValueFor(scanCode, state);
521 }
522
523 void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
524 Device* device = getDevice(deviceId);
525 device->switchStates.replaceValueFor(switchCode, state);
526 }
527
528 void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) {
529 Device* device = getDevice(deviceId);
530 device->absoluteAxisValue.replaceValueFor(axis, value);
531 }
532
533 void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
534 int32_t keyCode, uint32_t flags) {
535 Device* device = getDevice(deviceId);
536 KeyInfo info;
537 info.keyCode = keyCode;
538 info.flags = flags;
539 if (scanCode) {
540 device->keysByScanCode.add(scanCode, info);
541 }
542 if (usageCode) {
543 device->keysByUsageCode.add(usageCode, info);
544 }
545 }
546
547 void addLed(int32_t deviceId, int32_t led, bool initialState) {
548 Device* device = getDevice(deviceId);
549 device->leds.add(led, initialState);
550 }
551
552 bool getLedState(int32_t deviceId, int32_t led) {
553 Device* device = getDevice(deviceId);
554 return device->leds.valueFor(led);
555 }
556
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100557 std::vector<std::string>& getExcludedDevices() {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800558 return mExcludedDevices;
559 }
560
561 void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) {
562 Device* device = getDevice(deviceId);
563 device->virtualKeys.push(definition);
564 }
565
566 void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
567 int32_t code, int32_t value) {
568 RawEvent event;
569 event.when = when;
570 event.deviceId = deviceId;
571 event.type = type;
572 event.code = code;
573 event.value = value;
574 mEvents.push_back(event);
575
576 if (type == EV_ABS) {
577 setAbsoluteAxisValue(deviceId, code, value);
578 }
579 }
580
581 void assertQueueIsEmpty() {
582 ASSERT_EQ(size_t(0), mEvents.size())
583 << "Expected the event queue to be empty (fully consumed).";
584 }
585
586private:
587 Device* getDevice(int32_t deviceId) const {
588 ssize_t index = mDevices.indexOfKey(deviceId);
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100589 return index >= 0 ? mDevices.valueAt(index) : nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800590 }
591
592 virtual uint32_t getDeviceClasses(int32_t deviceId) const {
593 Device* device = getDevice(deviceId);
594 return device ? device->classes : 0;
595 }
596
597 virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
598 Device* device = getDevice(deviceId);
599 return device ? device->identifier : InputDeviceIdentifier();
600 }
601
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100602 virtual int32_t getDeviceControllerNumber(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800603 return 0;
604 }
605
606 virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
607 Device* device = getDevice(deviceId);
608 if (device) {
609 *outConfiguration = device->configuration;
610 }
611 }
612
613 virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
614 RawAbsoluteAxisInfo* outAxisInfo) const {
615 Device* device = getDevice(deviceId);
616 if (device) {
617 ssize_t index = device->absoluteAxes.indexOfKey(axis);
618 if (index >= 0) {
619 *outAxisInfo = device->absoluteAxes.valueAt(index);
620 return OK;
621 }
622 }
623 outAxisInfo->clear();
624 return -1;
625 }
626
627 virtual bool hasRelativeAxis(int32_t deviceId, int axis) const {
628 Device* device = getDevice(deviceId);
629 if (device) {
630 return device->relativeAxes.indexOfKey(axis) >= 0;
631 }
632 return false;
633 }
634
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100635 virtual bool hasInputProperty(int32_t, int) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800636 return false;
637 }
638
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700639 virtual status_t mapKey(int32_t deviceId,
640 int32_t scanCode, int32_t usageCode, int32_t metaState,
641 int32_t* outKeycode, int32_t *outMetaState, uint32_t* outFlags) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800642 Device* device = getDevice(deviceId);
643 if (device) {
644 const KeyInfo* key = getKey(device, scanCode, usageCode);
645 if (key) {
646 if (outKeycode) {
647 *outKeycode = key->keyCode;
648 }
649 if (outFlags) {
650 *outFlags = key->flags;
651 }
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700652 if (outMetaState) {
653 *outMetaState = metaState;
654 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800655 return OK;
656 }
657 }
658 return NAME_NOT_FOUND;
659 }
660
661 const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const {
662 if (usageCode) {
663 ssize_t index = device->keysByUsageCode.indexOfKey(usageCode);
664 if (index >= 0) {
665 return &device->keysByUsageCode.valueAt(index);
666 }
667 }
668 if (scanCode) {
669 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
670 if (index >= 0) {
671 return &device->keysByScanCode.valueAt(index);
672 }
673 }
Yi Kong9b14ac62018-07-17 13:48:38 -0700674 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800675 }
676
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100677 virtual status_t mapAxis(int32_t, int32_t, AxisInfo*) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800678 return NAME_NOT_FOUND;
679 }
680
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100681 virtual void setExcludedDevices(const std::vector<std::string>& devices) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800682 mExcludedDevices = devices;
683 }
684
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100685 virtual size_t getEvents(int, RawEvent* buffer, size_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800686 if (mEvents.empty()) {
687 return 0;
688 }
689
690 *buffer = *mEvents.begin();
691 mEvents.erase(mEvents.begin());
692 return 1;
693 }
694
695 virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
696 Device* device = getDevice(deviceId);
697 if (device) {
698 ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
699 if (index >= 0) {
700 return device->scanCodeStates.valueAt(index);
701 }
702 }
703 return AKEY_STATE_UNKNOWN;
704 }
705
706 virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const {
707 Device* device = getDevice(deviceId);
708 if (device) {
709 ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
710 if (index >= 0) {
711 return device->keyCodeStates.valueAt(index);
712 }
713 }
714 return AKEY_STATE_UNKNOWN;
715 }
716
717 virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const {
718 Device* device = getDevice(deviceId);
719 if (device) {
720 ssize_t index = device->switchStates.indexOfKey(sw);
721 if (index >= 0) {
722 return device->switchStates.valueAt(index);
723 }
724 }
725 return AKEY_STATE_UNKNOWN;
726 }
727
728 virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis,
729 int32_t* outValue) const {
730 Device* device = getDevice(deviceId);
731 if (device) {
732 ssize_t index = device->absoluteAxisValue.indexOfKey(axis);
733 if (index >= 0) {
734 *outValue = device->absoluteAxisValue.valueAt(index);
735 return OK;
736 }
737 }
738 *outValue = 0;
739 return -1;
740 }
741
742 virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
743 uint8_t* outFlags) const {
744 bool result = false;
745 Device* device = getDevice(deviceId);
746 if (device) {
747 for (size_t i = 0; i < numCodes; i++) {
748 for (size_t j = 0; j < device->keysByScanCode.size(); j++) {
749 if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) {
750 outFlags[i] = 1;
751 result = true;
752 }
753 }
754 for (size_t j = 0; j < device->keysByUsageCode.size(); j++) {
755 if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) {
756 outFlags[i] = 1;
757 result = true;
758 }
759 }
760 }
761 }
762 return result;
763 }
764
765 virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const {
766 Device* device = getDevice(deviceId);
767 if (device) {
768 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
769 return index >= 0;
770 }
771 return false;
772 }
773
774 virtual bool hasLed(int32_t deviceId, int32_t led) const {
775 Device* device = getDevice(deviceId);
776 return device && device->leds.indexOfKey(led) >= 0;
777 }
778
779 virtual void setLedState(int32_t deviceId, int32_t led, bool on) {
780 Device* device = getDevice(deviceId);
781 if (device) {
782 ssize_t index = device->leds.indexOfKey(led);
783 if (index >= 0) {
784 device->leds.replaceValueAt(led, on);
785 } else {
786 ADD_FAILURE()
787 << "Attempted to set the state of an LED that the EventHub declared "
788 "was not present. led=" << led;
789 }
790 }
791 }
792
793 virtual void getVirtualKeyDefinitions(int32_t deviceId,
794 Vector<VirtualKeyDefinition>& outVirtualKeys) const {
795 outVirtualKeys.clear();
796
797 Device* device = getDevice(deviceId);
798 if (device) {
799 outVirtualKeys.appendVector(device->virtualKeys);
800 }
801 }
802
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100803 virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t) const {
Yi Kong9b14ac62018-07-17 13:48:38 -0700804 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800805 }
806
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100807 virtual bool setKeyboardLayoutOverlay(int32_t, const sp<KeyCharacterMap>&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800808 return false;
809 }
810
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100811 virtual void vibrate(int32_t, nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800812 }
813
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100814 virtual void cancelVibrate(int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800815 }
816
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100817 virtual bool isExternal(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800818 return false;
819 }
820
Siarhei Vishniakouf93fcf42017-11-22 16:00:14 -0800821 virtual void dump(std::string&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800822 }
823
824 virtual void monitor() {
825 }
826
827 virtual void requestReopenDevices() {
828 }
829
830 virtual void wake() {
831 }
832};
833
834
835// --- FakeInputReaderContext ---
836
837class FakeInputReaderContext : public InputReaderContext {
838 sp<EventHubInterface> mEventHub;
839 sp<InputReaderPolicyInterface> mPolicy;
840 sp<InputListenerInterface> mListener;
841 int32_t mGlobalMetaState;
842 bool mUpdateGlobalMetaStateWasCalled;
843 int32_t mGeneration;
844
845public:
846 FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
847 const sp<InputReaderPolicyInterface>& policy,
848 const sp<InputListenerInterface>& listener) :
849 mEventHub(eventHub), mPolicy(policy), mListener(listener),
850 mGlobalMetaState(0) {
851 }
852
853 virtual ~FakeInputReaderContext() { }
854
855 void assertUpdateGlobalMetaStateWasCalled() {
856 ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
857 << "Expected updateGlobalMetaState() to have been called.";
858 mUpdateGlobalMetaStateWasCalled = false;
859 }
860
861 void setGlobalMetaState(int32_t state) {
862 mGlobalMetaState = state;
863 }
864
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800865 uint32_t getGeneration() {
866 return mGeneration;
867 }
868
Michael Wrightd02c5b62014-02-10 15:10:22 -0800869private:
870 virtual void updateGlobalMetaState() {
871 mUpdateGlobalMetaStateWasCalled = true;
872 }
873
874 virtual int32_t getGlobalMetaState() {
875 return mGlobalMetaState;
876 }
877
878 virtual EventHubInterface* getEventHub() {
879 return mEventHub.get();
880 }
881
882 virtual InputReaderPolicyInterface* getPolicy() {
883 return mPolicy.get();
884 }
885
886 virtual InputListenerInterface* getListener() {
887 return mListener.get();
888 }
889
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100890 virtual void disableVirtualKeysUntil(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800891 }
892
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100893 virtual bool shouldDropVirtualKey(nsecs_t, InputDevice*, int32_t, int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800894 return false;
895 }
896
897 virtual void fadePointer() {
898 }
899
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100900 virtual void requestTimeoutAtTime(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800901 }
902
903 virtual int32_t bumpGeneration() {
904 return ++mGeneration;
905 }
Michael Wright842500e2015-03-13 17:32:02 -0700906
907 virtual void getExternalStylusDevices(Vector<InputDeviceInfo>& outDevices) {
908
909 }
910
911 virtual void dispatchExternalStylusState(const StylusState&) {
912
913 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800914};
915
916
917// --- FakeInputMapper ---
918
919class FakeInputMapper : public InputMapper {
920 uint32_t mSources;
921 int32_t mKeyboardType;
922 int32_t mMetaState;
923 KeyedVector<int32_t, int32_t> mKeyCodeStates;
924 KeyedVector<int32_t, int32_t> mScanCodeStates;
925 KeyedVector<int32_t, int32_t> mSwitchStates;
926 Vector<int32_t> mSupportedKeyCodes;
927 RawEvent mLastEvent;
928
929 bool mConfigureWasCalled;
930 bool mResetWasCalled;
931 bool mProcessWasCalled;
932
933public:
934 FakeInputMapper(InputDevice* device, uint32_t sources) :
935 InputMapper(device),
936 mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
937 mMetaState(0),
938 mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
939 }
940
941 virtual ~FakeInputMapper() { }
942
943 void setKeyboardType(int32_t keyboardType) {
944 mKeyboardType = keyboardType;
945 }
946
947 void setMetaState(int32_t metaState) {
948 mMetaState = metaState;
949 }
950
951 void assertConfigureWasCalled() {
952 ASSERT_TRUE(mConfigureWasCalled)
953 << "Expected configure() to have been called.";
954 mConfigureWasCalled = false;
955 }
956
957 void assertResetWasCalled() {
958 ASSERT_TRUE(mResetWasCalled)
959 << "Expected reset() to have been called.";
960 mResetWasCalled = false;
961 }
962
Yi Kong9b14ac62018-07-17 13:48:38 -0700963 void assertProcessWasCalled(RawEvent* outLastEvent = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800964 ASSERT_TRUE(mProcessWasCalled)
965 << "Expected process() to have been called.";
966 if (outLastEvent) {
967 *outLastEvent = mLastEvent;
968 }
969 mProcessWasCalled = false;
970 }
971
972 void setKeyCodeState(int32_t keyCode, int32_t state) {
973 mKeyCodeStates.replaceValueFor(keyCode, state);
974 }
975
976 void setScanCodeState(int32_t scanCode, int32_t state) {
977 mScanCodeStates.replaceValueFor(scanCode, state);
978 }
979
980 void setSwitchState(int32_t switchCode, int32_t state) {
981 mSwitchStates.replaceValueFor(switchCode, state);
982 }
983
984 void addSupportedKeyCode(int32_t keyCode) {
985 mSupportedKeyCodes.add(keyCode);
986 }
987
988private:
989 virtual uint32_t getSources() {
990 return mSources;
991 }
992
993 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
994 InputMapper::populateDeviceInfo(deviceInfo);
995
996 if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
997 deviceInfo->setKeyboardType(mKeyboardType);
998 }
999 }
1000
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001001 virtual void configure(nsecs_t, const InputReaderConfiguration*, uint32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001002 mConfigureWasCalled = true;
1003 }
1004
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001005 virtual void reset(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001006 mResetWasCalled = true;
1007 }
1008
1009 virtual void process(const RawEvent* rawEvent) {
1010 mLastEvent = *rawEvent;
1011 mProcessWasCalled = true;
1012 }
1013
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001014 virtual int32_t getKeyCodeState(uint32_t, int32_t keyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001015 ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
1016 return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1017 }
1018
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001019 virtual int32_t getScanCodeState(uint32_t, int32_t scanCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001020 ssize_t index = mScanCodeStates.indexOfKey(scanCode);
1021 return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1022 }
1023
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001024 virtual int32_t getSwitchState(uint32_t, int32_t switchCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001025 ssize_t index = mSwitchStates.indexOfKey(switchCode);
1026 return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1027 }
1028
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001029 virtual bool markSupportedKeyCodes(uint32_t, size_t numCodes,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001030 const int32_t* keyCodes, uint8_t* outFlags) {
1031 bool result = false;
1032 for (size_t i = 0; i < numCodes; i++) {
1033 for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
1034 if (keyCodes[i] == mSupportedKeyCodes[j]) {
1035 outFlags[i] = 1;
1036 result = true;
1037 }
1038 }
1039 }
1040 return result;
1041 }
1042
1043 virtual int32_t getMetaState() {
1044 return mMetaState;
1045 }
1046
1047 virtual void fadePointer() {
1048 }
1049};
1050
1051
1052// --- InstrumentedInputReader ---
1053
1054class InstrumentedInputReader : public InputReader {
1055 InputDevice* mNextDevice;
1056
1057public:
1058 InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
1059 const sp<InputReaderPolicyInterface>& policy,
1060 const sp<InputListenerInterface>& listener) :
1061 InputReader(eventHub, policy, listener),
Yi Kong9b14ac62018-07-17 13:48:38 -07001062 mNextDevice(nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001063 }
1064
1065 virtual ~InstrumentedInputReader() {
1066 if (mNextDevice) {
1067 delete mNextDevice;
1068 }
1069 }
1070
1071 void setNextDevice(InputDevice* device) {
1072 mNextDevice = device;
1073 }
1074
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001075 InputDevice* newDevice(int32_t deviceId, int32_t controllerNumber, const std::string& name,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001076 uint32_t classes) {
1077 InputDeviceIdentifier identifier;
1078 identifier.name = name;
1079 int32_t generation = deviceId + 1;
1080 return new InputDevice(&mContext, deviceId, generation, controllerNumber, identifier,
1081 classes);
1082 }
1083
1084protected:
1085 virtual InputDevice* createDeviceLocked(int32_t deviceId, int32_t controllerNumber,
1086 const InputDeviceIdentifier& identifier, uint32_t classes) {
1087 if (mNextDevice) {
1088 InputDevice* device = mNextDevice;
Yi Kong9b14ac62018-07-17 13:48:38 -07001089 mNextDevice = nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001090 return device;
1091 }
1092 return InputReader::createDeviceLocked(deviceId, controllerNumber, identifier, classes);
1093 }
1094
1095 friend class InputReaderTest;
1096};
1097
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001098// --- InputReaderPolicyTest ---
1099class InputReaderPolicyTest : public testing::Test {
Siarhei Vishniakoucd7ac1e2018-10-15 13:39:50 -07001100protected:
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001101 sp<FakeInputReaderPolicy> mFakePolicy;
1102
1103 virtual void SetUp() {
1104 mFakePolicy = new FakeInputReaderPolicy();
1105 }
1106 virtual void TearDown() {
1107 mFakePolicy.clear();
1108 }
1109};
1110
1111/**
1112 * Check that empty set of viewports is an acceptable configuration.
1113 * Also try to get internal viewport two different ways - by type and by uniqueId.
1114 *
1115 * There will be confusion if two viewports with empty uniqueId and identical type are present.
1116 * Such configuration is not currently allowed.
1117 */
1118TEST_F(InputReaderPolicyTest, Viewports_GetCleared) {
Siarhei Vishniakoucd7ac1e2018-10-15 13:39:50 -07001119 static const std::string uniqueId = "local:0";
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001120
1121 // We didn't add any viewports yet, so there shouldn't be any.
1122 std::optional<DisplayViewport> internalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001123 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001124 ASSERT_FALSE(internalViewport);
1125
1126 // Add an internal viewport, then clear it
1127 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001128 DISPLAY_ORIENTATION_0, uniqueId, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001129
1130 // Check matching by uniqueId
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001131 internalViewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001132 ASSERT_TRUE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001133 ASSERT_EQ(ViewportType::VIEWPORT_INTERNAL, internalViewport->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001134
1135 // Check matching by viewport type
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001136 internalViewport = mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001137 ASSERT_TRUE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001138 ASSERT_EQ(uniqueId, internalViewport->uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001139
1140 mFakePolicy->clearViewports();
1141 // Make sure nothing is found after clear
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001142 internalViewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001143 ASSERT_FALSE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001144 internalViewport = mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001145 ASSERT_FALSE(internalViewport);
1146}
1147
1148TEST_F(InputReaderPolicyTest, Viewports_GetByType) {
1149 const std::string internalUniqueId = "local:0";
1150 const std::string externalUniqueId = "local:1";
1151 const std::string virtualUniqueId1 = "virtual:2";
1152 const std::string virtualUniqueId2 = "virtual:3";
1153 constexpr int32_t virtualDisplayId1 = 2;
1154 constexpr int32_t virtualDisplayId2 = 3;
1155
1156 // Add an internal viewport
1157 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001158 DISPLAY_ORIENTATION_0, internalUniqueId, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001159 // Add an external viewport
1160 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001161 DISPLAY_ORIENTATION_0, externalUniqueId, NO_PORT, ViewportType::VIEWPORT_EXTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001162 // Add an virtual viewport
1163 mFakePolicy->addDisplayViewport(virtualDisplayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001164 DISPLAY_ORIENTATION_0, virtualUniqueId1, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001165 // Add another virtual viewport
1166 mFakePolicy->addDisplayViewport(virtualDisplayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001167 DISPLAY_ORIENTATION_0, virtualUniqueId2, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001168
1169 // Check matching by type for internal
1170 std::optional<DisplayViewport> internalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001171 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001172 ASSERT_TRUE(internalViewport);
1173 ASSERT_EQ(internalUniqueId, internalViewport->uniqueId);
1174
1175 // Check matching by type for external
1176 std::optional<DisplayViewport> externalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001177 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_EXTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001178 ASSERT_TRUE(externalViewport);
1179 ASSERT_EQ(externalUniqueId, externalViewport->uniqueId);
1180
1181 // Check matching by uniqueId for virtual viewport #1
1182 std::optional<DisplayViewport> virtualViewport1 =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001183 mFakePolicy->getDisplayViewportByUniqueId(virtualUniqueId1);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001184 ASSERT_TRUE(virtualViewport1);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001185 ASSERT_EQ(ViewportType::VIEWPORT_VIRTUAL, virtualViewport1->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001186 ASSERT_EQ(virtualUniqueId1, virtualViewport1->uniqueId);
1187 ASSERT_EQ(virtualDisplayId1, virtualViewport1->displayId);
1188
1189 // Check matching by uniqueId for virtual viewport #2
1190 std::optional<DisplayViewport> virtualViewport2 =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001191 mFakePolicy->getDisplayViewportByUniqueId(virtualUniqueId2);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001192 ASSERT_TRUE(virtualViewport2);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001193 ASSERT_EQ(ViewportType::VIEWPORT_VIRTUAL, virtualViewport2->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001194 ASSERT_EQ(virtualUniqueId2, virtualViewport2->uniqueId);
1195 ASSERT_EQ(virtualDisplayId2, virtualViewport2->displayId);
1196}
1197
1198
1199/**
1200 * We can have 2 viewports of the same kind. We can distinguish them by uniqueId, and confirm
1201 * that lookup works by checking display id.
1202 * Check that 2 viewports of each kind is possible, for all existing viewport types.
1203 */
1204TEST_F(InputReaderPolicyTest, Viewports_TwoOfSameType) {
1205 const std::string uniqueId1 = "uniqueId1";
1206 const std::string uniqueId2 = "uniqueId2";
1207 constexpr int32_t displayId1 = 2;
1208 constexpr int32_t displayId2 = 3;
1209
1210 std::vector<ViewportType> types = {ViewportType::VIEWPORT_INTERNAL,
1211 ViewportType::VIEWPORT_EXTERNAL, ViewportType::VIEWPORT_VIRTUAL};
1212 for (const ViewportType& type : types) {
1213 mFakePolicy->clearViewports();
1214 // Add a viewport
1215 mFakePolicy->addDisplayViewport(displayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001216 DISPLAY_ORIENTATION_0, uniqueId1, NO_PORT, type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001217 // Add another viewport
1218 mFakePolicy->addDisplayViewport(displayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001219 DISPLAY_ORIENTATION_0, uniqueId2, NO_PORT, type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001220
1221 // Check that correct display viewport was returned by comparing the display IDs.
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001222 std::optional<DisplayViewport> viewport1 =
1223 mFakePolicy->getDisplayViewportByUniqueId(uniqueId1);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001224 ASSERT_TRUE(viewport1);
1225 ASSERT_EQ(displayId1, viewport1->displayId);
1226 ASSERT_EQ(type, viewport1->type);
1227
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001228 std::optional<DisplayViewport> viewport2 =
1229 mFakePolicy->getDisplayViewportByUniqueId(uniqueId2);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001230 ASSERT_TRUE(viewport2);
1231 ASSERT_EQ(displayId2, viewport2->displayId);
1232 ASSERT_EQ(type, viewport2->type);
1233
1234 // When there are multiple viewports of the same kind, and uniqueId is not specified
1235 // in the call to getDisplayViewport, then that situation is not supported.
1236 // The viewports can be stored in any order, so we cannot rely on the order, since that
1237 // is just implementation detail.
1238 // However, we can check that it still returns *a* viewport, we just cannot assert
1239 // which one specifically is returned.
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001240 std::optional<DisplayViewport> someViewport = mFakePolicy->getDisplayViewportByType(type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001241 ASSERT_TRUE(someViewport);
1242 }
1243}
Michael Wrightd02c5b62014-02-10 15:10:22 -08001244
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001245/**
1246 * Check getDisplayViewportByPort
1247 */
1248TEST_F(InputReaderPolicyTest, Viewports_GetByPort) {
1249 constexpr ViewportType type = ViewportType::VIEWPORT_EXTERNAL;
1250 const std::string uniqueId1 = "uniqueId1";
1251 const std::string uniqueId2 = "uniqueId2";
1252 constexpr int32_t displayId1 = 1;
1253 constexpr int32_t displayId2 = 2;
1254 const uint8_t hdmi1 = 0;
1255 const uint8_t hdmi2 = 1;
1256 const uint8_t hdmi3 = 2;
1257
1258 mFakePolicy->clearViewports();
1259 // Add a viewport that's associated with some display port that's not of interest.
1260 mFakePolicy->addDisplayViewport(displayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1261 DISPLAY_ORIENTATION_0, uniqueId1, hdmi3, type);
1262 // Add another viewport, connected to HDMI1 port
1263 mFakePolicy->addDisplayViewport(displayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1264 DISPLAY_ORIENTATION_0, uniqueId2, hdmi1, type);
1265
1266 // Check that correct display viewport was returned by comparing the display ports.
1267 std::optional<DisplayViewport> hdmi1Viewport = mFakePolicy->getDisplayViewportByPort(hdmi1);
1268 ASSERT_TRUE(hdmi1Viewport);
1269 ASSERT_EQ(displayId2, hdmi1Viewport->displayId);
1270 ASSERT_EQ(uniqueId2, hdmi1Viewport->uniqueId);
1271
1272 // Check that we can still get the same viewport using the uniqueId
1273 hdmi1Viewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId2);
1274 ASSERT_TRUE(hdmi1Viewport);
1275 ASSERT_EQ(displayId2, hdmi1Viewport->displayId);
1276 ASSERT_EQ(uniqueId2, hdmi1Viewport->uniqueId);
1277 ASSERT_EQ(type, hdmi1Viewport->type);
1278
1279 // Check that we cannot find a port with "HDMI2", because we never added one
1280 std::optional<DisplayViewport> hdmi2Viewport = mFakePolicy->getDisplayViewportByPort(hdmi2);
1281 ASSERT_FALSE(hdmi2Viewport);
1282}
1283
Michael Wrightd02c5b62014-02-10 15:10:22 -08001284// --- InputReaderTest ---
1285
1286class InputReaderTest : public testing::Test {
1287protected:
1288 sp<FakeInputListener> mFakeListener;
1289 sp<FakeInputReaderPolicy> mFakePolicy;
1290 sp<FakeEventHub> mFakeEventHub;
1291 sp<InstrumentedInputReader> mReader;
1292
1293 virtual void SetUp() {
1294 mFakeEventHub = new FakeEventHub();
1295 mFakePolicy = new FakeInputReaderPolicy();
1296 mFakeListener = new FakeInputListener();
1297
1298 mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener);
1299 }
1300
1301 virtual void TearDown() {
1302 mReader.clear();
1303
1304 mFakeListener.clear();
1305 mFakePolicy.clear();
1306 mFakeEventHub.clear();
1307 }
1308
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001309 void addDevice(int32_t deviceId, const std::string& name, uint32_t classes,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001310 const PropertyMap* configuration) {
1311 mFakeEventHub->addDevice(deviceId, name, classes);
1312
1313 if (configuration) {
1314 mFakeEventHub->addConfigurationMap(deviceId, configuration);
1315 }
1316 mFakeEventHub->finishDeviceScan();
1317 mReader->loopOnce();
1318 mReader->loopOnce();
1319 mFakeEventHub->assertQueueIsEmpty();
1320 }
1321
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001322 void disableDevice(int32_t deviceId, InputDevice* device) {
1323 mFakePolicy->addDisabledDevice(deviceId);
1324 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1325 }
1326
1327 void enableDevice(int32_t deviceId, InputDevice* device) {
1328 mFakePolicy->removeDisabledDevice(deviceId);
1329 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1330 }
1331
1332 void configureDevice(uint32_t changes, InputDevice* device) {
1333 device->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1334 }
1335
Michael Wrightd02c5b62014-02-10 15:10:22 -08001336 FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, int32_t controllerNumber,
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001337 const std::string& name, uint32_t classes, uint32_t sources,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001338 const PropertyMap* configuration) {
1339 InputDevice* device = mReader->newDevice(deviceId, controllerNumber, name, classes);
1340 FakeInputMapper* mapper = new FakeInputMapper(device, sources);
1341 device->addMapper(mapper);
1342 mReader->setNextDevice(device);
1343 addDevice(deviceId, name, classes, configuration);
1344 return mapper;
1345 }
1346};
1347
1348TEST_F(InputReaderTest, GetInputDevices) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001349 ASSERT_NO_FATAL_FAILURE(addDevice(1, "keyboard",
Yi Kong9b14ac62018-07-17 13:48:38 -07001350 INPUT_DEVICE_CLASS_KEYBOARD, nullptr));
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001351 ASSERT_NO_FATAL_FAILURE(addDevice(2, "ignored",
Yi Kong9b14ac62018-07-17 13:48:38 -07001352 0, nullptr)); // no classes so device will be ignored
Michael Wrightd02c5b62014-02-10 15:10:22 -08001353
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001354
Michael Wrightd02c5b62014-02-10 15:10:22 -08001355 Vector<InputDeviceInfo> inputDevices;
1356 mReader->getInputDevices(inputDevices);
1357
1358 ASSERT_EQ(1U, inputDevices.size());
1359 ASSERT_EQ(1, inputDevices[0].getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001360 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001361 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1362 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1363 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1364
1365 // Should also have received a notification describing the new input devices.
1366 inputDevices = mFakePolicy->getInputDevices();
1367 ASSERT_EQ(1U, inputDevices.size());
1368 ASSERT_EQ(1, inputDevices[0].getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001369 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001370 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1371 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1372 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1373}
1374
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001375TEST_F(InputReaderTest, WhenEnabledChanges_SendsDeviceResetNotification) {
1376 constexpr int32_t deviceId = 1;
1377 constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001378 InputDevice* device = mReader->newDevice(deviceId, 0, "fake", deviceClass);
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001379 // Must add at least one mapper or the device will be ignored!
1380 FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_KEYBOARD);
1381 device->addMapper(mapper);
1382 mReader->setNextDevice(device);
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001383 addDevice(deviceId, "fake", deviceClass, nullptr);
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001384
Yi Kong9b14ac62018-07-17 13:48:38 -07001385 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(nullptr));
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001386
1387 NotifyDeviceResetArgs resetArgs;
1388 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1389 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1390 ASSERT_EQ(deviceId, resetArgs.deviceId);
1391
1392 ASSERT_EQ(device->isEnabled(), true);
1393 disableDevice(deviceId, device);
1394 mReader->loopOnce();
1395
1396 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1397 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1398 ASSERT_EQ(deviceId, resetArgs.deviceId);
1399 ASSERT_EQ(device->isEnabled(), false);
1400
1401 disableDevice(deviceId, device);
1402 mReader->loopOnce();
1403 mFakeListener->assertNotifyDeviceResetWasNotCalled();
1404 mFakeListener->assertNotifyConfigurationChangedWasNotCalled();
1405 ASSERT_EQ(device->isEnabled(), false);
1406
1407 enableDevice(deviceId, device);
1408 mReader->loopOnce();
1409 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1410 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1411 ASSERT_EQ(deviceId, resetArgs.deviceId);
1412 ASSERT_EQ(device->isEnabled(), true);
1413}
1414
Michael Wrightd02c5b62014-02-10 15:10:22 -08001415TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001416 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001417 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001418 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001419 mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1420
1421 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
1422 AINPUT_SOURCE_ANY, AKEYCODE_A))
1423 << "Should return unknown when the device id is >= 0 but unknown.";
1424
1425 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
1426 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1427 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1428
1429 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
1430 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1431 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1432
1433 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
1434 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1435 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1436
1437 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
1438 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1439 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1440}
1441
1442TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001443 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001444 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001445 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001446 mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
1447
1448 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
1449 AINPUT_SOURCE_ANY, KEY_A))
1450 << "Should return unknown when the device id is >= 0 but unknown.";
1451
1452 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
1453 AINPUT_SOURCE_TRACKBALL, KEY_A))
1454 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1455
1456 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
1457 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1458 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1459
1460 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
1461 AINPUT_SOURCE_TRACKBALL, KEY_A))
1462 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1463
1464 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
1465 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1466 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1467}
1468
1469TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001470 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001471 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001472 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001473 mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
1474
1475 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
1476 AINPUT_SOURCE_ANY, SW_LID))
1477 << "Should return unknown when the device id is >= 0 but unknown.";
1478
1479 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
1480 AINPUT_SOURCE_TRACKBALL, SW_LID))
1481 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1482
1483 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
1484 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1485 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1486
1487 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
1488 AINPUT_SOURCE_TRACKBALL, SW_LID))
1489 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1490
1491 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
1492 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1493 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1494}
1495
1496TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001497 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001498 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001499 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001500
Michael Wrightd02c5b62014-02-10 15:10:22 -08001501 mapper->addSupportedKeyCode(AKEYCODE_A);
1502 mapper->addSupportedKeyCode(AKEYCODE_B);
1503
1504 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1505 uint8_t flags[4] = { 0, 0, 0, 1 };
1506
1507 ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
1508 << "Should return false when device id is >= 0 but unknown.";
1509 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1510
1511 flags[3] = 1;
1512 ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1513 << "Should return false when device id is valid but the sources are not supported by the device.";
1514 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1515
1516 flags[3] = 1;
1517 ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1518 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1519 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1520
1521 flags[3] = 1;
1522 ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1523 << "Should return false when the device id is < 0 but the sources are not supported by any device.";
1524 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1525
1526 flags[3] = 1;
1527 ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1528 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1529 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1530}
1531
1532TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001533 addDevice(1, "ignored", INPUT_DEVICE_CLASS_KEYBOARD, nullptr);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001534
1535 NotifyConfigurationChangedArgs args;
1536
1537 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args));
1538 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1539}
1540
1541TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001542 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001543 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001544 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001545
1546 mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1);
1547 mReader->loopOnce();
1548 ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
1549
1550 RawEvent event;
1551 ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
1552 ASSERT_EQ(0, event.when);
1553 ASSERT_EQ(1, event.deviceId);
1554 ASSERT_EQ(EV_KEY, event.type);
1555 ASSERT_EQ(KEY_A, event.code);
1556 ASSERT_EQ(1, event.value);
1557}
1558
1559
1560// --- InputDeviceTest ---
1561
1562class InputDeviceTest : public testing::Test {
1563protected:
1564 static const char* DEVICE_NAME;
1565 static const int32_t DEVICE_ID;
1566 static const int32_t DEVICE_GENERATION;
1567 static const int32_t DEVICE_CONTROLLER_NUMBER;
1568 static const uint32_t DEVICE_CLASSES;
1569
1570 sp<FakeEventHub> mFakeEventHub;
1571 sp<FakeInputReaderPolicy> mFakePolicy;
1572 sp<FakeInputListener> mFakeListener;
1573 FakeInputReaderContext* mFakeContext;
1574
1575 InputDevice* mDevice;
1576
1577 virtual void SetUp() {
1578 mFakeEventHub = new FakeEventHub();
1579 mFakePolicy = new FakeInputReaderPolicy();
1580 mFakeListener = new FakeInputListener();
1581 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1582
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001583 mFakeEventHub->addDevice(DEVICE_ID, DEVICE_NAME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001584 InputDeviceIdentifier identifier;
1585 identifier.name = DEVICE_NAME;
1586 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1587 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1588 }
1589
1590 virtual void TearDown() {
1591 delete mDevice;
1592
1593 delete mFakeContext;
1594 mFakeListener.clear();
1595 mFakePolicy.clear();
1596 mFakeEventHub.clear();
1597 }
1598};
1599
1600const char* InputDeviceTest::DEVICE_NAME = "device";
1601const int32_t InputDeviceTest::DEVICE_ID = 1;
1602const int32_t InputDeviceTest::DEVICE_GENERATION = 2;
1603const int32_t InputDeviceTest::DEVICE_CONTROLLER_NUMBER = 0;
1604const uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD
1605 | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK;
1606
1607TEST_F(InputDeviceTest, ImmutableProperties) {
1608 ASSERT_EQ(DEVICE_ID, mDevice->getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001609 ASSERT_STREQ(DEVICE_NAME, mDevice->getName().c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001610 ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses());
1611}
1612
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001613TEST_F(InputDeviceTest, WhenDeviceCreated_EnabledIsTrue) {
1614 ASSERT_EQ(mDevice->isEnabled(), true);
1615}
1616
Michael Wrightd02c5b62014-02-10 15:10:22 -08001617TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
1618 // Configuration.
1619 InputReaderConfiguration config;
1620 mDevice->configure(ARBITRARY_TIME, &config, 0);
1621
1622 // Reset.
1623 mDevice->reset(ARBITRARY_TIME);
1624
1625 NotifyDeviceResetArgs resetArgs;
1626 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1627 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1628 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1629
1630 // Metadata.
1631 ASSERT_TRUE(mDevice->isIgnored());
1632 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources());
1633
1634 InputDeviceInfo info;
1635 mDevice->getDeviceInfo(&info);
1636 ASSERT_EQ(DEVICE_ID, info.getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001637 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001638 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType());
1639 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
1640
1641 // State queries.
1642 ASSERT_EQ(0, mDevice->getMetaState());
1643
1644 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1645 << "Ignored device should return unknown key code state.";
1646 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1647 << "Ignored device should return unknown scan code state.";
1648 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
1649 << "Ignored device should return unknown switch state.";
1650
1651 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1652 uint8_t flags[2] = { 0, 1 };
1653 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
1654 << "Ignored device should never mark any key codes.";
1655 ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
1656 ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
1657}
1658
1659TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
1660 // Configuration.
1661 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value"));
1662
1663 FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
1664 mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1665 mapper1->setMetaState(AMETA_ALT_ON);
1666 mapper1->addSupportedKeyCode(AKEYCODE_A);
1667 mapper1->addSupportedKeyCode(AKEYCODE_B);
1668 mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1669 mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
1670 mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
1671 mapper1->setScanCodeState(3, AKEY_STATE_UP);
1672 mapper1->setSwitchState(4, AKEY_STATE_DOWN);
1673 mDevice->addMapper(mapper1);
1674
1675 FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
1676 mapper2->setMetaState(AMETA_SHIFT_ON);
1677 mDevice->addMapper(mapper2);
1678
1679 InputReaderConfiguration config;
1680 mDevice->configure(ARBITRARY_TIME, &config, 0);
1681
1682 String8 propertyValue;
1683 ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue))
1684 << "Device should have read configuration during configuration phase.";
1685 ASSERT_STREQ("value", propertyValue.string());
1686
1687 ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
1688 ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
1689
1690 // Reset
1691 mDevice->reset(ARBITRARY_TIME);
1692 ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
1693 ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
1694
1695 NotifyDeviceResetArgs resetArgs;
1696 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1697 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1698 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1699
1700 // Metadata.
1701 ASSERT_FALSE(mDevice->isIgnored());
1702 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
1703
1704 InputDeviceInfo info;
1705 mDevice->getDeviceInfo(&info);
1706 ASSERT_EQ(DEVICE_ID, info.getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001707 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001708 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
1709 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
1710
1711 // State queries.
1712 ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
1713 << "Should query mappers and combine meta states.";
1714
1715 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1716 << "Should return unknown key code state when source not supported.";
1717 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1718 << "Should return unknown scan code state when source not supported.";
1719 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1720 << "Should return unknown switch state when source not supported.";
1721
1722 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
1723 << "Should query mapper when source is supported.";
1724 ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
1725 << "Should query mapper when source is supported.";
1726 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
1727 << "Should query mapper when source is supported.";
1728
1729 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1730 uint8_t flags[4] = { 0, 0, 0, 1 };
1731 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1732 << "Should do nothing when source is unsupported.";
1733 ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
1734 ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
1735 ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
1736 ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
1737
1738 ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
1739 << "Should query mapper when source is supported.";
1740 ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
1741 ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
1742 ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
1743 ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
1744
1745 // Event handling.
1746 RawEvent event;
1747 mDevice->process(&event, 1);
1748
1749 ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
1750 ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
1751}
1752
1753
1754// --- InputMapperTest ---
1755
1756class InputMapperTest : public testing::Test {
1757protected:
1758 static const char* DEVICE_NAME;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001759 static const char* DEVICE_LOCATION;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001760 static const int32_t DEVICE_ID;
1761 static const int32_t DEVICE_GENERATION;
1762 static const int32_t DEVICE_CONTROLLER_NUMBER;
1763 static const uint32_t DEVICE_CLASSES;
1764
1765 sp<FakeEventHub> mFakeEventHub;
1766 sp<FakeInputReaderPolicy> mFakePolicy;
1767 sp<FakeInputListener> mFakeListener;
1768 FakeInputReaderContext* mFakeContext;
1769 InputDevice* mDevice;
1770
1771 virtual void SetUp() {
1772 mFakeEventHub = new FakeEventHub();
1773 mFakePolicy = new FakeInputReaderPolicy();
1774 mFakeListener = new FakeInputListener();
1775 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1776 InputDeviceIdentifier identifier;
1777 identifier.name = DEVICE_NAME;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001778 identifier.location = DEVICE_LOCATION;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001779 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1780 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1781
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001782 mFakeEventHub->addDevice(mDevice->getId(), DEVICE_NAME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001783 }
1784
1785 virtual void TearDown() {
1786 delete mDevice;
1787 delete mFakeContext;
1788 mFakeListener.clear();
1789 mFakePolicy.clear();
1790 mFakeEventHub.clear();
1791 }
1792
1793 void addConfigurationProperty(const char* key, const char* value) {
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001794 mFakeEventHub->addConfigurationProperty(mDevice->getId(), String8(key), String8(value));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001795 }
1796
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001797 void configureDevice(uint32_t changes) {
1798 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1799 }
1800
Michael Wrightd02c5b62014-02-10 15:10:22 -08001801 void addMapperAndConfigure(InputMapper* mapper) {
1802 mDevice->addMapper(mapper);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001803 configureDevice(0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001804 mDevice->reset(ARBITRARY_TIME);
1805 }
1806
1807 void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001808 int32_t orientation, const std::string& uniqueId,
1809 std::optional<uint8_t> physicalPort, ViewportType viewportType) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001810 mFakePolicy->addDisplayViewport(
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001811 displayId, width, height, orientation, uniqueId, physicalPort, viewportType);
Santos Cordonfa5cf462017-04-05 10:37:00 -07001812 configureDevice(InputReaderConfiguration::CHANGE_DISPLAY_INFO);
1813 }
1814
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001815 void clearViewports() {
1816 mFakePolicy->clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08001817 }
1818
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001819 static void process(InputMapper* mapper, nsecs_t when, int32_t type,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001820 int32_t code, int32_t value) {
1821 RawEvent event;
1822 event.when = when;
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001823 event.deviceId = mapper->getDeviceId();
Michael Wrightd02c5b62014-02-10 15:10:22 -08001824 event.type = type;
1825 event.code = code;
1826 event.value = value;
1827 mapper->process(&event);
1828 }
1829
1830 static void assertMotionRange(const InputDeviceInfo& info,
1831 int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
1832 const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
Yi Kong9b14ac62018-07-17 13:48:38 -07001833 ASSERT_TRUE(range != nullptr) << "Axis: " << axis << " Source: " << source;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001834 ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source;
1835 ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source;
1836 ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source;
1837 ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source;
1838 ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source;
1839 ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source;
1840 }
1841
1842 static void assertPointerCoords(const PointerCoords& coords,
1843 float x, float y, float pressure, float size,
1844 float touchMajor, float touchMinor, float toolMajor, float toolMinor,
1845 float orientation, float distance) {
1846 ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1);
1847 ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
1848 ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON);
1849 ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON);
1850 ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1);
1851 ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1);
1852 ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1);
1853 ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1);
1854 ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON);
1855 ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON);
1856 }
1857
1858 static void assertPosition(const sp<FakePointerController>& controller, float x, float y) {
1859 float actualX, actualY;
1860 controller->getPosition(&actualX, &actualY);
1861 ASSERT_NEAR(x, actualX, 1);
1862 ASSERT_NEAR(y, actualY, 1);
1863 }
1864};
1865
1866const char* InputMapperTest::DEVICE_NAME = "device";
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001867const char* InputMapperTest::DEVICE_LOCATION = "USB1";
Michael Wrightd02c5b62014-02-10 15:10:22 -08001868const int32_t InputMapperTest::DEVICE_ID = 1;
1869const int32_t InputMapperTest::DEVICE_GENERATION = 2;
1870const int32_t InputMapperTest::DEVICE_CONTROLLER_NUMBER = 0;
1871const uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests
1872
1873
1874// --- SwitchInputMapperTest ---
1875
1876class SwitchInputMapperTest : public InputMapperTest {
1877protected:
1878};
1879
1880TEST_F(SwitchInputMapperTest, GetSources) {
1881 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1882 addMapperAndConfigure(mapper);
1883
1884 ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources());
1885}
1886
1887TEST_F(SwitchInputMapperTest, GetSwitchState) {
1888 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1889 addMapperAndConfigure(mapper);
1890
1891 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
1892 ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1893
1894 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
1895 ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1896}
1897
1898TEST_F(SwitchInputMapperTest, Process) {
1899 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1900 addMapperAndConfigure(mapper);
1901
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001902 process(mapper, ARBITRARY_TIME, EV_SW, SW_LID, 1);
1903 process(mapper, ARBITRARY_TIME, EV_SW, SW_JACK_PHYSICAL_INSERT, 1);
1904 process(mapper, ARBITRARY_TIME, EV_SW, SW_HEADPHONE_INSERT, 0);
1905 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001906
1907 NotifySwitchArgs args;
1908 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args));
1909 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
Dan Albert1bd2fc02016-02-02 15:11:57 -08001910 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT), args.switchValues);
1911 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT) | (1 << SW_HEADPHONE_INSERT),
Michael Wrightd02c5b62014-02-10 15:10:22 -08001912 args.switchMask);
1913 ASSERT_EQ(uint32_t(0), args.policyFlags);
1914}
1915
1916
1917// --- KeyboardInputMapperTest ---
1918
1919class KeyboardInputMapperTest : public InputMapperTest {
1920protected:
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001921 const std::string UNIQUE_ID = "local:0";
1922
1923 void prepareDisplay(int32_t orientation);
1924
Michael Wrightd02c5b62014-02-10 15:10:22 -08001925 void testDPadKeyRotation(KeyboardInputMapper* mapper,
1926 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode);
1927};
1928
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001929/* Similar to setDisplayInfoAndReconfigure, but pre-populates all parameters except for the
1930 * orientation.
1931 */
1932void KeyboardInputMapperTest::prepareDisplay(int32_t orientation) {
1933 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001934 orientation, UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001935}
1936
Michael Wrightd02c5b62014-02-10 15:10:22 -08001937void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001938 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001939 NotifyKeyArgs args;
1940
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001941 process(mapper, ARBITRARY_TIME, EV_KEY, originalScanCode, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001942 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1943 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1944 ASSERT_EQ(originalScanCode, args.scanCode);
1945 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1946
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001947 process(mapper, ARBITRARY_TIME, EV_KEY, originalScanCode, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001948 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1949 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1950 ASSERT_EQ(originalScanCode, args.scanCode);
1951 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1952}
1953
1954
1955TEST_F(KeyboardInputMapperTest, GetSources) {
1956 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1957 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1958 addMapperAndConfigure(mapper);
1959
1960 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
1961}
1962
1963TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
1964 const int32_t USAGE_A = 0x070004;
1965 const int32_t USAGE_UNKNOWN = 0x07ffff;
1966 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
1967 mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
1968
1969 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1970 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1971 addMapperAndConfigure(mapper);
1972
1973 // Key down by scan code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001974 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_HOME, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001975 NotifyKeyArgs args;
1976 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1977 ASSERT_EQ(DEVICE_ID, args.deviceId);
1978 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1979 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1980 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1981 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1982 ASSERT_EQ(KEY_HOME, args.scanCode);
1983 ASSERT_EQ(AMETA_NONE, args.metaState);
1984 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1985 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1986 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1987
1988 // Key up by scan code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001989 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_HOME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001990 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1991 ASSERT_EQ(DEVICE_ID, args.deviceId);
1992 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1993 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1994 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1995 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1996 ASSERT_EQ(KEY_HOME, args.scanCode);
1997 ASSERT_EQ(AMETA_NONE, args.metaState);
1998 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1999 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2000 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2001
2002 // Key down by usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002003 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_A);
2004 process(mapper, ARBITRARY_TIME, EV_KEY, 0, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002005 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2006 ASSERT_EQ(DEVICE_ID, args.deviceId);
2007 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2008 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2009 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2010 ASSERT_EQ(AKEYCODE_A, args.keyCode);
2011 ASSERT_EQ(0, args.scanCode);
2012 ASSERT_EQ(AMETA_NONE, args.metaState);
2013 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2014 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2015 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2016
2017 // Key up by usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002018 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_A);
2019 process(mapper, ARBITRARY_TIME + 1, EV_KEY, 0, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002020 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2021 ASSERT_EQ(DEVICE_ID, args.deviceId);
2022 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2023 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2024 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2025 ASSERT_EQ(AKEYCODE_A, args.keyCode);
2026 ASSERT_EQ(0, args.scanCode);
2027 ASSERT_EQ(AMETA_NONE, args.metaState);
2028 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2029 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2030 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2031
2032 // Key down with unknown scan code or usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002033 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
2034 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UNKNOWN, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002035 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2036 ASSERT_EQ(DEVICE_ID, args.deviceId);
2037 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2038 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2039 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2040 ASSERT_EQ(0, args.keyCode);
2041 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
2042 ASSERT_EQ(AMETA_NONE, args.metaState);
2043 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2044 ASSERT_EQ(0U, args.policyFlags);
2045 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2046
2047 // Key up with unknown scan code or usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002048 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
2049 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_UNKNOWN, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002050 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2051 ASSERT_EQ(DEVICE_ID, args.deviceId);
2052 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2053 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2054 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2055 ASSERT_EQ(0, args.keyCode);
2056 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
2057 ASSERT_EQ(AMETA_NONE, args.metaState);
2058 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2059 ASSERT_EQ(0U, args.policyFlags);
2060 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2061}
2062
2063TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
2064 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
2065 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2066
2067 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2068 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2069 addMapperAndConfigure(mapper);
2070
2071 // Initial metastate.
2072 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2073
2074 // Metakey down.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002075 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_LEFTSHIFT, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002076 NotifyKeyArgs args;
2077 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2078 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2079 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2080 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
2081
2082 // Key down.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002083 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_A, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002084 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2085 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2086 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2087
2088 // Key up.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002089 process(mapper, ARBITRARY_TIME + 2, EV_KEY, KEY_A, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002090 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2091 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2092 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2093
2094 // Metakey up.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002095 process(mapper, ARBITRARY_TIME + 3, EV_KEY, KEY_LEFTSHIFT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002096 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2097 ASSERT_EQ(AMETA_NONE, args.metaState);
2098 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2099 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
2100}
2101
2102TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
2103 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2104 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
2105 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
2106 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
2107
2108 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2109 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2110 addMapperAndConfigure(mapper);
2111
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002112 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002113 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2114 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
2115 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2116 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
2117 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2118 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
2119 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2120 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
2121}
2122
2123TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
2124 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2125 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
2126 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
2127 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
2128
2129 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2130 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2131 addConfigurationProperty("keyboard.orientationAware", "1");
2132 addMapperAndConfigure(mapper);
2133
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002134 prepareDisplay(DISPLAY_ORIENTATION_0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002135 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2136 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
2137 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2138 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
2139 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2140 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
2141 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2142 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
2143
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002144 clearViewports();
2145 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002146 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2147 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT));
2148 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2149 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP));
2150 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2151 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT));
2152 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2153 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN));
2154
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002155 clearViewports();
2156 prepareDisplay(DISPLAY_ORIENTATION_180);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002157 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2158 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN));
2159 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2160 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT));
2161 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2162 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP));
2163 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2164 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT));
2165
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002166 clearViewports();
2167 prepareDisplay(DISPLAY_ORIENTATION_270);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002168 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2169 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT));
2170 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2171 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN));
2172 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2173 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT));
2174 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2175 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP));
2176
2177 // Special case: if orientation changes while key is down, we still emit the same keycode
2178 // in the key up as we did in the key down.
2179 NotifyKeyArgs args;
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002180 clearViewports();
2181 prepareDisplay(DISPLAY_ORIENTATION_270);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002182 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002183 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2184 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2185 ASSERT_EQ(KEY_UP, args.scanCode);
2186 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
2187
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002188 clearViewports();
2189 prepareDisplay(DISPLAY_ORIENTATION_180);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002190 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002191 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2192 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2193 ASSERT_EQ(KEY_UP, args.scanCode);
2194 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
2195}
2196
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002197TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_NotOrientationAware) {
2198 // If the keyboard is not orientation aware,
2199 // key events should not be associated with a specific display id
2200 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2201
2202 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2203 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2204 addMapperAndConfigure(mapper);
2205 NotifyKeyArgs args;
2206
2207 // Display id should be ADISPLAY_ID_NONE without any display configuration.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002208 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002209 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002210 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002211 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2212 ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2213
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002214 prepareDisplay(DISPLAY_ORIENTATION_0);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002215 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002216 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002217 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002218 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2219 ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2220}
2221
2222TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_OrientationAware) {
2223 // If the keyboard is orientation aware,
2224 // key events should be associated with the internal viewport
2225 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2226
2227 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2228 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2229 addConfigurationProperty("keyboard.orientationAware", "1");
2230 addMapperAndConfigure(mapper);
2231 NotifyKeyArgs args;
2232
2233 // Display id should be ADISPLAY_ID_NONE without any display configuration.
2234 // ^--- already checked by the previous test
2235
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002236 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002237 UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002238 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002239 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002240 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002241 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2242 ASSERT_EQ(DISPLAY_ID, args.displayId);
2243
2244 constexpr int32_t newDisplayId = 2;
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002245 clearViewports();
2246 setDisplayInfoAndReconfigure(newDisplayId, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002247 UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002248 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002249 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002250 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002251 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2252 ASSERT_EQ(newDisplayId, args.displayId);
2253}
2254
Michael Wrightd02c5b62014-02-10 15:10:22 -08002255TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
2256 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2257 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2258 addMapperAndConfigure(mapper);
2259
2260 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
2261 ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2262
2263 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
2264 ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2265}
2266
2267TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
2268 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2269 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2270 addMapperAndConfigure(mapper);
2271
2272 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
2273 ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2274
2275 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
2276 ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2277}
2278
2279TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
2280 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2281 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2282 addMapperAndConfigure(mapper);
2283
2284 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2285
2286 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
2287 uint8_t flags[2] = { 0, 0 };
2288 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
2289 ASSERT_TRUE(flags[0]);
2290 ASSERT_FALSE(flags[1]);
2291}
2292
2293TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
2294 mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/);
2295 mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/);
2296 mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/);
2297 mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
2298 mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
2299 mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
2300
2301 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2302 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2303 addMapperAndConfigure(mapper);
2304
2305 // Initialization should have turned all of the lights off.
2306 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2307 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2308 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2309
2310 // Toggle caps lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002311 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 1);
2312 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002313 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2314 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2315 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2316 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState());
2317
2318 // Toggle num lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002319 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 1);
2320 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002321 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2322 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2323 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2324 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState());
2325
2326 // Toggle caps lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002327 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 1);
2328 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002329 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2330 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2331 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2332 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState());
2333
2334 // Toggle scroll lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002335 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
2336 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002337 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2338 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2339 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2340 ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2341
2342 // Toggle num lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002343 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 1);
2344 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002345 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2346 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2347 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2348 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2349
2350 // Toggle scroll lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002351 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
2352 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002353 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2354 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2355 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2356 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2357}
2358
2359
2360// --- CursorInputMapperTest ---
2361
2362class CursorInputMapperTest : public InputMapperTest {
2363protected:
2364 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
2365
2366 sp<FakePointerController> mFakePointerController;
2367
2368 virtual void SetUp() {
2369 InputMapperTest::SetUp();
2370
2371 mFakePointerController = new FakePointerController();
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002372 mFakePolicy->setPointerController(mDevice->getId(), mFakePointerController);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002373 }
2374
2375 void testMotionRotation(CursorInputMapper* mapper,
2376 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002377
2378 void prepareDisplay(int32_t orientation) {
2379 const std::string uniqueId = "local:0";
2380 const ViewportType viewportType = ViewportType::VIEWPORT_INTERNAL;
2381 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
2382 orientation, uniqueId, NO_PORT, viewportType);
2383 }
Michael Wrightd02c5b62014-02-10 15:10:22 -08002384};
2385
2386const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
2387
2388void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
2389 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
2390 NotifyMotionArgs args;
2391
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002392 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, originalX);
2393 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, originalY);
2394 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002395 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2396 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2397 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2398 float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
2399 float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
2400 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2401}
2402
2403TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
2404 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2405 addConfigurationProperty("cursor.mode", "pointer");
2406 addMapperAndConfigure(mapper);
2407
2408 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
2409}
2410
2411TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
2412 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2413 addConfigurationProperty("cursor.mode", "navigation");
2414 addMapperAndConfigure(mapper);
2415
2416 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
2417}
2418
2419TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
2420 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2421 addConfigurationProperty("cursor.mode", "pointer");
2422 addMapperAndConfigure(mapper);
2423
2424 InputDeviceInfo info;
2425 mapper->populateDeviceInfo(&info);
2426
2427 // Initially there may not be a valid motion range.
Yi Kong9b14ac62018-07-17 13:48:38 -07002428 ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE));
2429 ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002430 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2431 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f));
2432
2433 // When the bounds are set, then there should be a valid motion range.
2434 mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1);
2435
2436 InputDeviceInfo info2;
2437 mapper->populateDeviceInfo(&info2);
2438
2439 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2440 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE,
2441 1, 800 - 1, 0.0f, 0.0f));
2442 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2443 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE,
2444 2, 480 - 1, 0.0f, 0.0f));
2445 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2446 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE,
2447 0.0f, 1.0f, 0.0f, 0.0f));
2448}
2449
2450TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
2451 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2452 addConfigurationProperty("cursor.mode", "navigation");
2453 addMapperAndConfigure(mapper);
2454
2455 InputDeviceInfo info;
2456 mapper->populateDeviceInfo(&info);
2457
2458 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2459 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL,
2460 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2461 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2462 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL,
2463 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2464 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2465 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL,
2466 0.0f, 1.0f, 0.0f, 0.0f));
2467}
2468
2469TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
2470 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2471 addConfigurationProperty("cursor.mode", "navigation");
2472 addMapperAndConfigure(mapper);
2473
2474 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2475
2476 NotifyMotionArgs args;
2477
2478 // Button press.
2479 // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002480 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2481 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002482 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2483 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2484 ASSERT_EQ(DEVICE_ID, args.deviceId);
2485 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2486 ASSERT_EQ(uint32_t(0), args.policyFlags);
2487 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2488 ASSERT_EQ(0, args.flags);
2489 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2490 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2491 ASSERT_EQ(0, args.edgeFlags);
2492 ASSERT_EQ(uint32_t(1), args.pointerCount);
2493 ASSERT_EQ(0, args.pointerProperties[0].id);
2494 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2495 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2496 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2497 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2498 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2499 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2500
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002501 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2502 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2503 ASSERT_EQ(DEVICE_ID, args.deviceId);
2504 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2505 ASSERT_EQ(uint32_t(0), args.policyFlags);
2506 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2507 ASSERT_EQ(0, args.flags);
2508 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2509 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2510 ASSERT_EQ(0, args.edgeFlags);
2511 ASSERT_EQ(uint32_t(1), args.pointerCount);
2512 ASSERT_EQ(0, args.pointerProperties[0].id);
2513 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2514 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2515 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2516 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2517 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2518 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2519
Michael Wrightd02c5b62014-02-10 15:10:22 -08002520 // Button release. Should have same down time.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002521 process(mapper, ARBITRARY_TIME + 1, EV_KEY, BTN_MOUSE, 0);
2522 process(mapper, ARBITRARY_TIME + 1, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002523 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2524 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2525 ASSERT_EQ(DEVICE_ID, args.deviceId);
2526 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2527 ASSERT_EQ(uint32_t(0), args.policyFlags);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002528 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2529 ASSERT_EQ(0, args.flags);
2530 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2531 ASSERT_EQ(0, args.buttonState);
2532 ASSERT_EQ(0, args.edgeFlags);
2533 ASSERT_EQ(uint32_t(1), args.pointerCount);
2534 ASSERT_EQ(0, args.pointerProperties[0].id);
2535 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2536 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2537 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2538 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2539 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2540 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2541
2542 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2543 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2544 ASSERT_EQ(DEVICE_ID, args.deviceId);
2545 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2546 ASSERT_EQ(uint32_t(0), args.policyFlags);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002547 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2548 ASSERT_EQ(0, args.flags);
2549 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2550 ASSERT_EQ(0, args.buttonState);
2551 ASSERT_EQ(0, args.edgeFlags);
2552 ASSERT_EQ(uint32_t(1), args.pointerCount);
2553 ASSERT_EQ(0, args.pointerProperties[0].id);
2554 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2555 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2556 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2557 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2558 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2559 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2560}
2561
2562TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
2563 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2564 addConfigurationProperty("cursor.mode", "navigation");
2565 addMapperAndConfigure(mapper);
2566
2567 NotifyMotionArgs args;
2568
2569 // Motion in X but not Y.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002570 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 1);
2571 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002572 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2573 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2574 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2575 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2576
2577 // Motion in Y but not X.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002578 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, -2);
2579 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002580 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2581 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2582 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2583 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2584}
2585
2586TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
2587 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2588 addConfigurationProperty("cursor.mode", "navigation");
2589 addMapperAndConfigure(mapper);
2590
2591 NotifyMotionArgs args;
2592
2593 // Button press.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002594 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2595 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002596 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2597 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2598 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2599 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2600
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002601 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2602 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2603 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2604 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2605
Michael Wrightd02c5b62014-02-10 15:10:22 -08002606 // Button release.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002607 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 0);
2608 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002609 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002610 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2611 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2612 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2613
2614 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002615 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2616 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2617 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2618}
2619
2620TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
2621 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2622 addConfigurationProperty("cursor.mode", "navigation");
2623 addMapperAndConfigure(mapper);
2624
2625 NotifyMotionArgs args;
2626
2627 // Combined X, Y and Button.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002628 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 1);
2629 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, -2);
2630 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2631 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002632 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2633 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2634 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2635 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2636 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2637
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002638 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2639 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2640 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2641 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2642 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2643
Michael Wrightd02c5b62014-02-10 15:10:22 -08002644 // Move X, Y a bit while pressed.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002645 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 2);
2646 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 1);
2647 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002648 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2649 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2650 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2651 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2652 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2653
2654 // Release Button.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002655 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 0);
2656 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002657 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002658 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2659 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2660 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2661
2662 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002663 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2664 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2665 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2666}
2667
2668TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
2669 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2670 addConfigurationProperty("cursor.mode", "navigation");
2671 addMapperAndConfigure(mapper);
2672
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002673 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002674 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2675 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2676 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2677 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2678 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2679 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2680 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2681 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2682}
2683
2684TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
2685 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2686 addConfigurationProperty("cursor.mode", "navigation");
2687 addConfigurationProperty("cursor.orientationAware", "1");
2688 addMapperAndConfigure(mapper);
2689
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002690 prepareDisplay(DISPLAY_ORIENTATION_0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002691 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2692 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2693 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2694 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2695 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2696 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2697 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2698 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2699
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002700 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002701 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0));
2702 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1));
2703 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1));
2704 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1));
2705 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0));
2706 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1));
2707 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1));
2708 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1));
2709
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002710 prepareDisplay(DISPLAY_ORIENTATION_180);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002711 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1));
2712 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1));
2713 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0));
2714 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1));
2715 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1));
2716 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1));
2717 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0));
2718 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1));
2719
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002720 prepareDisplay(DISPLAY_ORIENTATION_270);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002721 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0));
2722 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1));
2723 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1));
2724 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1));
2725 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0));
2726 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1));
2727 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1));
2728 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1));
2729}
2730
2731TEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) {
2732 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2733 addConfigurationProperty("cursor.mode", "pointer");
2734 addMapperAndConfigure(mapper);
2735
2736 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2737 mFakePointerController->setPosition(100, 200);
2738 mFakePointerController->setButtonState(0);
2739
2740 NotifyMotionArgs motionArgs;
2741 NotifyKeyArgs keyArgs;
2742
2743 // press BTN_LEFT, release BTN_LEFT
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002744 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_LEFT, 1);
2745 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002746 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2747 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2748 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2749 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2750 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2751 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2752
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002753 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2754 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2755 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2756 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2757 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2758 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2759
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002760 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_LEFT, 0);
2761 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002762 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002763 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002764 ASSERT_EQ(0, motionArgs.buttonState);
2765 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002766 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2767 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2768
2769 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002770 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002771 ASSERT_EQ(0, motionArgs.buttonState);
2772 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002773 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2774 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2775
2776 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002777 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002778 ASSERT_EQ(0, motionArgs.buttonState);
2779 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002780 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2781 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2782
2783 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002784 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_RIGHT, 1);
2785 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 1);
2786 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002787 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2788 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2789 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2790 motionArgs.buttonState);
2791 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2792 mFakePointerController->getButtonState());
2793 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2794 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2795
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002796 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2797 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2798 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2799 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2800 mFakePointerController->getButtonState());
2801 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2802 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2803
2804 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2805 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2806 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2807 motionArgs.buttonState);
2808 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2809 mFakePointerController->getButtonState());
2810 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2811 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2812
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002813 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_RIGHT, 0);
2814 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002815 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(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2818 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002819 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2820 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2821
2822 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002823 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002824 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2825 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002826 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2827 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2828
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002829 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 0);
2830 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002831 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002832 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2833 ASSERT_EQ(0, motionArgs.buttonState);
2834 ASSERT_EQ(0, mFakePointerController->getButtonState());
2835 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2836 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002837 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 0);
2838 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002839
2840 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002841 ASSERT_EQ(0, motionArgs.buttonState);
2842 ASSERT_EQ(0, mFakePointerController->getButtonState());
2843 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2844 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2845 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 -08002846
Michael Wrightd02c5b62014-02-10 15:10:22 -08002847 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2848 ASSERT_EQ(0, motionArgs.buttonState);
2849 ASSERT_EQ(0, mFakePointerController->getButtonState());
2850 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2851 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2852 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2853
2854 // press BTN_BACK, release BTN_BACK
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002855 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_BACK, 1);
2856 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002857 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2858 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2859 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002860
Michael Wrightd02c5b62014-02-10 15:10:22 -08002861 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002862 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002863 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2864 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002865 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2866 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2867
2868 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2869 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2870 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2871 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002872 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2873 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2874
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002875 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_BACK, 0);
2876 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002877 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002878 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002879 ASSERT_EQ(0, motionArgs.buttonState);
2880 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002881 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2882 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2883
2884 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002885 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002886 ASSERT_EQ(0, motionArgs.buttonState);
2887 ASSERT_EQ(0, mFakePointerController->getButtonState());
2888
Michael Wrightd02c5b62014-02-10 15:10:22 -08002889 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2890 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2891 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2892 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2893 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2894
2895 // press BTN_SIDE, release BTN_SIDE
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002896 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_SIDE, 1);
2897 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002898 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2899 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2900 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002901
Michael Wrightd02c5b62014-02-10 15:10:22 -08002902 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002903 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002904 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2905 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002906 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2907 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2908
2909 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2910 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2911 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2912 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002913 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2914 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2915
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002916 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_SIDE, 0);
2917 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002918 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002919 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002920 ASSERT_EQ(0, motionArgs.buttonState);
2921 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002922 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2923 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 -08002924
2925 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2926 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2927 ASSERT_EQ(0, motionArgs.buttonState);
2928 ASSERT_EQ(0, mFakePointerController->getButtonState());
2929 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2930 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2931
Michael Wrightd02c5b62014-02-10 15:10:22 -08002932 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2933 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2934 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2935
2936 // press BTN_FORWARD, release BTN_FORWARD
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002937 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_FORWARD, 1);
2938 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002939 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2940 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2941 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002942
Michael Wrightd02c5b62014-02-10 15:10:22 -08002943 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002944 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002945 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2946 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002947 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2948 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2949
2950 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2951 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2952 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2953 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002954 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2955 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2956
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002957 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_FORWARD, 0);
2958 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002959 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002960 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002961 ASSERT_EQ(0, motionArgs.buttonState);
2962 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002963 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2964 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 -08002965
2966 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2967 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2968 ASSERT_EQ(0, motionArgs.buttonState);
2969 ASSERT_EQ(0, mFakePointerController->getButtonState());
2970 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2971 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2972
Michael Wrightd02c5b62014-02-10 15:10:22 -08002973 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2974 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2975 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2976
2977 // press BTN_EXTRA, release BTN_EXTRA
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002978 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_EXTRA, 1);
2979 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002980 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2981 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2982 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002983
Michael Wrightd02c5b62014-02-10 15:10:22 -08002984 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002985 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002986 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2987 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002988 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2989 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2990
2991 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2992 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2993 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2994 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002995 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2996 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2997
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002998 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_EXTRA, 0);
2999 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003000 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003001 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003002 ASSERT_EQ(0, motionArgs.buttonState);
3003 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003004 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3005 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 -08003006
3007 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3008 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3009 ASSERT_EQ(0, motionArgs.buttonState);
3010 ASSERT_EQ(0, mFakePointerController->getButtonState());
3011 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3012 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3013
Michael Wrightd02c5b62014-02-10 15:10:22 -08003014 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3015 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3016 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3017}
3018
3019TEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) {
3020 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3021 addConfigurationProperty("cursor.mode", "pointer");
3022 addMapperAndConfigure(mapper);
3023
3024 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3025 mFakePointerController->setPosition(100, 200);
3026 mFakePointerController->setButtonState(0);
3027
3028 NotifyMotionArgs args;
3029
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003030 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3031 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3032 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003033 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003034 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
3035 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3036 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3037 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3038 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3039}
3040
3041TEST_F(CursorInputMapperTest, Process_PointerCapture) {
3042 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3043 addConfigurationProperty("cursor.mode", "pointer");
3044 mFakePolicy->setPointerCapture(true);
3045 addMapperAndConfigure(mapper);
3046
3047 NotifyDeviceResetArgs resetArgs;
3048 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
3049 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
3050 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
3051
3052 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3053 mFakePointerController->setPosition(100, 200);
3054 mFakePointerController->setButtonState(0);
3055
3056 NotifyMotionArgs args;
3057
3058 // Move.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003059 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3060 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3061 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003062 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3063 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3064 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
3065 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3066 10.0f, 20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3067 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
3068
3069 // Button press.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003070 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
3071 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003072 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3073 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3074 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
3075 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3076 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3077 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3078 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3079 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
3080 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3081 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3082
3083 // Button release.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003084 process(mapper, ARBITRARY_TIME + 2, EV_KEY, BTN_MOUSE, 0);
3085 process(mapper, ARBITRARY_TIME + 2, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003086 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3087 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3088 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
3089 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3090 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3091 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3092 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3093 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
3094 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3095 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3096
3097 // Another move.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003098 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 30);
3099 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 40);
3100 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003101 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3102 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3103 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
3104 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3105 30.0f, 40.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3106 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
3107
3108 // Disable pointer capture and check that the device generation got bumped
3109 // and events are generated the usual way.
3110 const uint32_t generation = mFakeContext->getGeneration();
3111 mFakePolicy->setPointerCapture(false);
3112 configureDevice(InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
3113 ASSERT_TRUE(mFakeContext->getGeneration() != generation);
3114
3115 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
3116 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
3117 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
3118
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003119 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3120 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3121 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003122 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3123 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003124 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3125 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3126 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3127 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3128}
3129
3130
3131// --- TouchInputMapperTest ---
3132
3133class TouchInputMapperTest : public InputMapperTest {
3134protected:
3135 static const int32_t RAW_X_MIN;
3136 static const int32_t RAW_X_MAX;
3137 static const int32_t RAW_Y_MIN;
3138 static const int32_t RAW_Y_MAX;
3139 static const int32_t RAW_TOUCH_MIN;
3140 static const int32_t RAW_TOUCH_MAX;
3141 static const int32_t RAW_TOOL_MIN;
3142 static const int32_t RAW_TOOL_MAX;
3143 static const int32_t RAW_PRESSURE_MIN;
3144 static const int32_t RAW_PRESSURE_MAX;
3145 static const int32_t RAW_ORIENTATION_MIN;
3146 static const int32_t RAW_ORIENTATION_MAX;
3147 static const int32_t RAW_DISTANCE_MIN;
3148 static const int32_t RAW_DISTANCE_MAX;
3149 static const int32_t RAW_TILT_MIN;
3150 static const int32_t RAW_TILT_MAX;
3151 static const int32_t RAW_ID_MIN;
3152 static const int32_t RAW_ID_MAX;
3153 static const int32_t RAW_SLOT_MIN;
3154 static const int32_t RAW_SLOT_MAX;
3155 static const float X_PRECISION;
3156 static const float Y_PRECISION;
Santos Cordonfa5cf462017-04-05 10:37:00 -07003157 static const float X_PRECISION_VIRTUAL;
3158 static const float Y_PRECISION_VIRTUAL;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003159
3160 static const float GEOMETRIC_SCALE;
Jason Gerecke489fda82012-09-07 17:19:40 -07003161 static const TouchAffineTransformation AFFINE_TRANSFORM;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003162
3163 static const VirtualKeyDefinition VIRTUAL_KEYS[2];
3164
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003165 const std::string UNIQUE_ID = "local:0";
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003166 const std::string SECONDARY_UNIQUE_ID = "local:1";
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003167
Michael Wrightd02c5b62014-02-10 15:10:22 -08003168 enum Axes {
3169 POSITION = 1 << 0,
3170 TOUCH = 1 << 1,
3171 TOOL = 1 << 2,
3172 PRESSURE = 1 << 3,
3173 ORIENTATION = 1 << 4,
3174 MINOR = 1 << 5,
3175 ID = 1 << 6,
3176 DISTANCE = 1 << 7,
3177 TILT = 1 << 8,
3178 SLOT = 1 << 9,
3179 TOOL_TYPE = 1 << 10,
3180 };
3181
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003182 void prepareDisplay(int32_t orientation, std::optional<uint8_t> port = NO_PORT);
3183 void prepareSecondaryDisplay(ViewportType type, std::optional<uint8_t> port = NO_PORT);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003184 void prepareVirtualDisplay(int32_t orientation);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003185 void prepareVirtualKeys();
Jason Gerecke489fda82012-09-07 17:19:40 -07003186 void prepareLocationCalibration();
Michael Wrightd02c5b62014-02-10 15:10:22 -08003187 int32_t toRawX(float displayX);
3188 int32_t toRawY(float displayY);
Jason Gerecke489fda82012-09-07 17:19:40 -07003189 float toCookedX(float rawX, float rawY);
3190 float toCookedY(float rawX, float rawY);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003191 float toDisplayX(int32_t rawX);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003192 float toDisplayX(int32_t rawX, int32_t displayWidth);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003193 float toDisplayY(int32_t rawY);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003194 float toDisplayY(int32_t rawY, int32_t displayHeight);
3195
Michael Wrightd02c5b62014-02-10 15:10:22 -08003196};
3197
3198const int32_t TouchInputMapperTest::RAW_X_MIN = 25;
3199const int32_t TouchInputMapperTest::RAW_X_MAX = 1019;
3200const int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
3201const int32_t TouchInputMapperTest::RAW_Y_MAX = 1009;
3202const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
3203const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
3204const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
3205const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
Michael Wrightaa449c92017-12-13 21:21:43 +00003206const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = 0;
3207const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = 255;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003208const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
3209const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
3210const int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0;
3211const int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7;
3212const int32_t TouchInputMapperTest::RAW_TILT_MIN = 0;
3213const int32_t TouchInputMapperTest::RAW_TILT_MAX = 150;
3214const int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
3215const int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
3216const int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0;
3217const int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9;
3218const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH;
3219const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT;
Santos Cordonfa5cf462017-04-05 10:37:00 -07003220const float TouchInputMapperTest::X_PRECISION_VIRTUAL =
3221 float(RAW_X_MAX - RAW_X_MIN + 1) / VIRTUAL_DISPLAY_WIDTH;
3222const float TouchInputMapperTest::Y_PRECISION_VIRTUAL =
3223 float(RAW_Y_MAX - RAW_Y_MIN + 1) / VIRTUAL_DISPLAY_HEIGHT;
Jason Gerecke489fda82012-09-07 17:19:40 -07003224const TouchAffineTransformation TouchInputMapperTest::AFFINE_TRANSFORM =
3225 TouchAffineTransformation(1, -2, 3, -4, 5, -6);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003226
3227const float TouchInputMapperTest::GEOMETRIC_SCALE =
3228 avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1),
3229 float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1));
3230
3231const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
3232 { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
3233 { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
3234};
3235
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003236void TouchInputMapperTest::prepareDisplay(int32_t orientation, std::optional<uint8_t> port) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003237 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003238 UNIQUE_ID, port, ViewportType::VIEWPORT_INTERNAL);
3239}
3240
3241void TouchInputMapperTest::prepareSecondaryDisplay(ViewportType type, std::optional<uint8_t> port) {
3242 setDisplayInfoAndReconfigure(SECONDARY_DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
3243 DISPLAY_ORIENTATION_0, SECONDARY_UNIQUE_ID, port, type);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003244}
3245
Santos Cordonfa5cf462017-04-05 10:37:00 -07003246void TouchInputMapperTest::prepareVirtualDisplay(int32_t orientation) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003247 setDisplayInfoAndReconfigure(VIRTUAL_DISPLAY_ID, VIRTUAL_DISPLAY_WIDTH,
3248 VIRTUAL_DISPLAY_HEIGHT, orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003249 VIRTUAL_DISPLAY_UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003250}
3251
Michael Wrightd02c5b62014-02-10 15:10:22 -08003252void TouchInputMapperTest::prepareVirtualKeys() {
3253 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]);
3254 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]);
3255 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
3256 mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE);
3257}
3258
Jason Gerecke489fda82012-09-07 17:19:40 -07003259void TouchInputMapperTest::prepareLocationCalibration() {
3260 mFakePolicy->setTouchAffineTransformation(AFFINE_TRANSFORM);
3261}
3262
Michael Wrightd02c5b62014-02-10 15:10:22 -08003263int32_t TouchInputMapperTest::toRawX(float displayX) {
3264 return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN);
3265}
3266
3267int32_t TouchInputMapperTest::toRawY(float displayY) {
3268 return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN);
3269}
3270
Jason Gerecke489fda82012-09-07 17:19:40 -07003271float TouchInputMapperTest::toCookedX(float rawX, float rawY) {
3272 AFFINE_TRANSFORM.applyTo(rawX, rawY);
3273 return rawX;
3274}
3275
3276float TouchInputMapperTest::toCookedY(float rawX, float rawY) {
3277 AFFINE_TRANSFORM.applyTo(rawX, rawY);
3278 return rawY;
3279}
3280
Michael Wrightd02c5b62014-02-10 15:10:22 -08003281float TouchInputMapperTest::toDisplayX(int32_t rawX) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07003282 return toDisplayX(rawX, DISPLAY_WIDTH);
3283}
3284
3285float TouchInputMapperTest::toDisplayX(int32_t rawX, int32_t displayWidth) {
3286 return float(rawX - RAW_X_MIN) * displayWidth / (RAW_X_MAX - RAW_X_MIN + 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003287}
3288
3289float TouchInputMapperTest::toDisplayY(int32_t rawY) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07003290 return toDisplayY(rawY, DISPLAY_HEIGHT);
3291}
3292
3293float TouchInputMapperTest::toDisplayY(int32_t rawY, int32_t displayHeight) {
3294 return float(rawY - RAW_Y_MIN) * displayHeight / (RAW_Y_MAX - RAW_Y_MIN + 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003295}
3296
3297
3298// --- SingleTouchInputMapperTest ---
3299
3300class SingleTouchInputMapperTest : public TouchInputMapperTest {
3301protected:
3302 void prepareButtons();
3303 void prepareAxes(int axes);
3304
3305 void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3306 void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3307 void processUp(SingleTouchInputMapper* mappery);
3308 void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
3309 void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
3310 void processDistance(SingleTouchInputMapper* mapper, int32_t distance);
3311 void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY);
3312 void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value);
3313 void processSync(SingleTouchInputMapper* mapper);
3314};
3315
3316void SingleTouchInputMapperTest::prepareButtons() {
3317 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
3318}
3319
3320void SingleTouchInputMapperTest::prepareAxes(int axes) {
3321 if (axes & POSITION) {
3322 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X,
3323 RAW_X_MIN, RAW_X_MAX, 0, 0);
3324 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y,
3325 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
3326 }
3327 if (axes & PRESSURE) {
3328 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE,
3329 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
3330 }
3331 if (axes & TOOL) {
3332 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH,
3333 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
3334 }
3335 if (axes & DISTANCE) {
3336 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE,
3337 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
3338 }
3339 if (axes & TILT) {
3340 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X,
3341 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3342 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y,
3343 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3344 }
3345}
3346
3347void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003348 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 1);
3349 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_X, x);
3350 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003351}
3352
3353void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003354 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_X, x);
3355 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003356}
3357
3358void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003359 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003360}
3361
3362void SingleTouchInputMapperTest::processPressure(
3363 SingleTouchInputMapper* mapper, int32_t pressure) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003364 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_PRESSURE, pressure);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003365}
3366
3367void SingleTouchInputMapperTest::processToolMajor(
3368 SingleTouchInputMapper* mapper, int32_t toolMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003369 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TOOL_WIDTH, toolMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003370}
3371
3372void SingleTouchInputMapperTest::processDistance(
3373 SingleTouchInputMapper* mapper, int32_t distance) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003374 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_DISTANCE, distance);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003375}
3376
3377void SingleTouchInputMapperTest::processTilt(
3378 SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003379 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TILT_X, tiltX);
3380 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TILT_Y, tiltY);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003381}
3382
3383void SingleTouchInputMapperTest::processKey(
3384 SingleTouchInputMapper* mapper, int32_t code, int32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003385 process(mapper, ARBITRARY_TIME, EV_KEY, code, value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003386}
3387
3388void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003389 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003390}
3391
3392
3393TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) {
3394 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3395 prepareButtons();
3396 prepareAxes(POSITION);
3397 addMapperAndConfigure(mapper);
3398
3399 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
3400}
3401
3402TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) {
3403 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3404 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X);
3405 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y);
3406 prepareButtons();
3407 prepareAxes(POSITION);
3408 addMapperAndConfigure(mapper);
3409
3410 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3411}
3412
3413TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) {
3414 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3415 prepareButtons();
3416 prepareAxes(POSITION);
3417 addConfigurationProperty("touch.deviceType", "touchPad");
3418 addMapperAndConfigure(mapper);
3419
3420 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3421}
3422
3423TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) {
3424 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3425 prepareButtons();
3426 prepareAxes(POSITION);
3427 addConfigurationProperty("touch.deviceType", "touchScreen");
3428 addMapperAndConfigure(mapper);
3429
3430 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
3431}
3432
3433TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
3434 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3435 addConfigurationProperty("touch.deviceType", "touchScreen");
3436 prepareDisplay(DISPLAY_ORIENTATION_0);
3437 prepareButtons();
3438 prepareAxes(POSITION);
3439 prepareVirtualKeys();
3440 addMapperAndConfigure(mapper);
3441
3442 // Unknown key.
3443 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
3444
3445 // Virtual key is down.
3446 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3447 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3448 processDown(mapper, x, y);
3449 processSync(mapper);
3450 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3451
3452 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3453
3454 // Virtual key is up.
3455 processUp(mapper);
3456 processSync(mapper);
3457 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3458
3459 ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3460}
3461
3462TEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
3463 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3464 addConfigurationProperty("touch.deviceType", "touchScreen");
3465 prepareDisplay(DISPLAY_ORIENTATION_0);
3466 prepareButtons();
3467 prepareAxes(POSITION);
3468 prepareVirtualKeys();
3469 addMapperAndConfigure(mapper);
3470
3471 // Unknown key.
3472 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
3473
3474 // Virtual key is down.
3475 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3476 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3477 processDown(mapper, x, y);
3478 processSync(mapper);
3479 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3480
3481 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3482
3483 // Virtual key is up.
3484 processUp(mapper);
3485 processSync(mapper);
3486 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3487
3488 ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3489}
3490
3491TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
3492 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3493 addConfigurationProperty("touch.deviceType", "touchScreen");
3494 prepareDisplay(DISPLAY_ORIENTATION_0);
3495 prepareButtons();
3496 prepareAxes(POSITION);
3497 prepareVirtualKeys();
3498 addMapperAndConfigure(mapper);
3499
3500 const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
3501 uint8_t flags[2] = { 0, 0 };
3502 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
3503 ASSERT_TRUE(flags[0]);
3504 ASSERT_FALSE(flags[1]);
3505}
3506
3507TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
3508 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3509 addConfigurationProperty("touch.deviceType", "touchScreen");
3510 prepareDisplay(DISPLAY_ORIENTATION_0);
3511 prepareButtons();
3512 prepareAxes(POSITION);
3513 prepareVirtualKeys();
3514 addMapperAndConfigure(mapper);
3515
3516 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3517
3518 NotifyKeyArgs args;
3519
3520 // Press virtual key.
3521 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3522 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3523 processDown(mapper, x, y);
3524 processSync(mapper);
3525
3526 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3527 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3528 ASSERT_EQ(DEVICE_ID, args.deviceId);
3529 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3530 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3531 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
3532 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3533 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3534 ASSERT_EQ(KEY_HOME, args.scanCode);
3535 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3536 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3537
3538 // Release virtual key.
3539 processUp(mapper);
3540 processSync(mapper);
3541
3542 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3543 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3544 ASSERT_EQ(DEVICE_ID, args.deviceId);
3545 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3546 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3547 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
3548 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3549 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3550 ASSERT_EQ(KEY_HOME, args.scanCode);
3551 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3552 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3553
3554 // Should not have sent any motions.
3555 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3556}
3557
3558TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
3559 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3560 addConfigurationProperty("touch.deviceType", "touchScreen");
3561 prepareDisplay(DISPLAY_ORIENTATION_0);
3562 prepareButtons();
3563 prepareAxes(POSITION);
3564 prepareVirtualKeys();
3565 addMapperAndConfigure(mapper);
3566
3567 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3568
3569 NotifyKeyArgs keyArgs;
3570
3571 // Press virtual key.
3572 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3573 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3574 processDown(mapper, x, y);
3575 processSync(mapper);
3576
3577 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3578 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3579 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3580 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3581 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3582 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3583 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
3584 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3585 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3586 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3587 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3588
3589 // Move out of bounds. This should generate a cancel and a pointer down since we moved
3590 // into the display area.
3591 y -= 100;
3592 processMove(mapper, x, y);
3593 processSync(mapper);
3594
3595 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3596 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3597 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3598 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3599 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3600 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3601 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
3602 | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
3603 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3604 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3605 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3606 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3607
3608 NotifyMotionArgs motionArgs;
3609 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3610 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3611 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3612 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3613 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3614 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3615 ASSERT_EQ(0, motionArgs.flags);
3616 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3617 ASSERT_EQ(0, motionArgs.buttonState);
3618 ASSERT_EQ(0, motionArgs.edgeFlags);
3619 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3620 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3621 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3622 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3623 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3624 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3625 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3626 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3627
3628 // Keep moving out of bounds. Should generate a pointer move.
3629 y -= 50;
3630 processMove(mapper, x, y);
3631 processSync(mapper);
3632
3633 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3634 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3635 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3636 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3637 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3638 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3639 ASSERT_EQ(0, motionArgs.flags);
3640 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3641 ASSERT_EQ(0, motionArgs.buttonState);
3642 ASSERT_EQ(0, motionArgs.edgeFlags);
3643 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3644 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3645 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3646 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3647 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3648 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3649 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3650 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3651
3652 // Release out of bounds. Should generate a pointer up.
3653 processUp(mapper);
3654 processSync(mapper);
3655
3656 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3657 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3658 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3659 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3660 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3661 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3662 ASSERT_EQ(0, motionArgs.flags);
3663 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3664 ASSERT_EQ(0, motionArgs.buttonState);
3665 ASSERT_EQ(0, motionArgs.edgeFlags);
3666 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3667 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3668 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3669 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3670 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3671 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3672 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3673 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3674
3675 // Should not have sent any more keys or motions.
3676 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3677 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3678}
3679
3680TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
3681 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3682 addConfigurationProperty("touch.deviceType", "touchScreen");
3683 prepareDisplay(DISPLAY_ORIENTATION_0);
3684 prepareButtons();
3685 prepareAxes(POSITION);
3686 prepareVirtualKeys();
3687 addMapperAndConfigure(mapper);
3688
3689 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3690
3691 NotifyMotionArgs motionArgs;
3692
3693 // Initially go down out of bounds.
3694 int32_t x = -10;
3695 int32_t y = -10;
3696 processDown(mapper, x, y);
3697 processSync(mapper);
3698
3699 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3700
3701 // Move into the display area. Should generate a pointer down.
3702 x = 50;
3703 y = 75;
3704 processMove(mapper, x, y);
3705 processSync(mapper);
3706
3707 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3708 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3709 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3710 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3711 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3712 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3713 ASSERT_EQ(0, motionArgs.flags);
3714 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3715 ASSERT_EQ(0, motionArgs.buttonState);
3716 ASSERT_EQ(0, motionArgs.edgeFlags);
3717 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3718 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3719 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3720 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3721 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3722 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3723 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3724 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3725
3726 // Release. Should generate a pointer up.
3727 processUp(mapper);
3728 processSync(mapper);
3729
3730 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3731 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3732 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3733 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3734 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3735 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3736 ASSERT_EQ(0, motionArgs.flags);
3737 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3738 ASSERT_EQ(0, motionArgs.buttonState);
3739 ASSERT_EQ(0, motionArgs.edgeFlags);
3740 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3741 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3742 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3743 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3744 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3745 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3746 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3747 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3748
3749 // Should not have sent any more keys or motions.
3750 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3751 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3752}
3753
Santos Cordonfa5cf462017-04-05 10:37:00 -07003754TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture_VirtualDisplay) {
3755 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3756 addConfigurationProperty("touch.deviceType", "touchScreen");
3757 addConfigurationProperty("touch.displayId", VIRTUAL_DISPLAY_UNIQUE_ID);
3758
3759 prepareVirtualDisplay(DISPLAY_ORIENTATION_0);
3760 prepareButtons();
3761 prepareAxes(POSITION);
3762 prepareVirtualKeys();
3763 addMapperAndConfigure(mapper);
3764
3765 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3766
3767 NotifyMotionArgs motionArgs;
3768
3769 // Down.
3770 int32_t x = 100;
3771 int32_t y = 125;
3772 processDown(mapper, x, y);
3773 processSync(mapper);
3774
3775 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3776 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3777 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3778 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3779 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3780 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3781 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3782 ASSERT_EQ(0, motionArgs.flags);
3783 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3784 ASSERT_EQ(0, motionArgs.buttonState);
3785 ASSERT_EQ(0, motionArgs.edgeFlags);
3786 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3787 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3788 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3789 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3790 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3791 1, 0, 0, 0, 0, 0, 0, 0));
3792 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3793 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3794 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3795
3796 // Move.
3797 x += 50;
3798 y += 75;
3799 processMove(mapper, x, y);
3800 processSync(mapper);
3801
3802 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3803 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3804 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3805 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3806 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3807 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3808 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3809 ASSERT_EQ(0, motionArgs.flags);
3810 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3811 ASSERT_EQ(0, motionArgs.buttonState);
3812 ASSERT_EQ(0, motionArgs.edgeFlags);
3813 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3814 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3815 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3816 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3817 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3818 1, 0, 0, 0, 0, 0, 0, 0));
3819 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3820 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3821 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3822
3823 // Up.
3824 processUp(mapper);
3825 processSync(mapper);
3826
3827 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3828 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3829 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3830 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3831 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3832 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3833 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3834 ASSERT_EQ(0, motionArgs.flags);
3835 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3836 ASSERT_EQ(0, motionArgs.buttonState);
3837 ASSERT_EQ(0, motionArgs.edgeFlags);
3838 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3839 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3840 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3841 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3842 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3843 1, 0, 0, 0, 0, 0, 0, 0));
3844 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3845 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3846 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3847
3848 // Should not have sent any more keys or motions.
3849 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3850 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3851}
3852
Michael Wrightd02c5b62014-02-10 15:10:22 -08003853TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
3854 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3855 addConfigurationProperty("touch.deviceType", "touchScreen");
3856 prepareDisplay(DISPLAY_ORIENTATION_0);
3857 prepareButtons();
3858 prepareAxes(POSITION);
3859 prepareVirtualKeys();
3860 addMapperAndConfigure(mapper);
3861
3862 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3863
3864 NotifyMotionArgs motionArgs;
3865
3866 // Down.
3867 int32_t x = 100;
3868 int32_t y = 125;
3869 processDown(mapper, x, y);
3870 processSync(mapper);
3871
3872 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3873 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3874 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3875 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3876 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3877 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3878 ASSERT_EQ(0, motionArgs.flags);
3879 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3880 ASSERT_EQ(0, motionArgs.buttonState);
3881 ASSERT_EQ(0, motionArgs.edgeFlags);
3882 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3883 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3884 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3885 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3886 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3887 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3888 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3889 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3890
3891 // Move.
3892 x += 50;
3893 y += 75;
3894 processMove(mapper, x, y);
3895 processSync(mapper);
3896
3897 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3898 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3899 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3900 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3901 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3902 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3903 ASSERT_EQ(0, motionArgs.flags);
3904 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3905 ASSERT_EQ(0, motionArgs.buttonState);
3906 ASSERT_EQ(0, motionArgs.edgeFlags);
3907 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3908 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3909 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3910 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3911 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3912 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3913 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3914 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3915
3916 // Up.
3917 processUp(mapper);
3918 processSync(mapper);
3919
3920 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3921 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3922 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3923 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3924 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3925 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3926 ASSERT_EQ(0, motionArgs.flags);
3927 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3928 ASSERT_EQ(0, motionArgs.buttonState);
3929 ASSERT_EQ(0, motionArgs.edgeFlags);
3930 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3931 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3932 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3933 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3934 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3935 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3936 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3937 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3938
3939 // Should not have sent any more keys or motions.
3940 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3941 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3942}
3943
3944TEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) {
3945 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3946 addConfigurationProperty("touch.deviceType", "touchScreen");
3947 prepareButtons();
3948 prepareAxes(POSITION);
3949 addConfigurationProperty("touch.orientationAware", "0");
3950 addMapperAndConfigure(mapper);
3951
3952 NotifyMotionArgs args;
3953
3954 // Rotation 90.
3955 prepareDisplay(DISPLAY_ORIENTATION_90);
3956 processDown(mapper, toRawX(50), toRawY(75));
3957 processSync(mapper);
3958
3959 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3960 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3961 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3962
3963 processUp(mapper);
3964 processSync(mapper);
3965 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3966}
3967
3968TEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) {
3969 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3970 addConfigurationProperty("touch.deviceType", "touchScreen");
3971 prepareButtons();
3972 prepareAxes(POSITION);
3973 addMapperAndConfigure(mapper);
3974
3975 NotifyMotionArgs args;
3976
3977 // Rotation 0.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003978 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08003979 prepareDisplay(DISPLAY_ORIENTATION_0);
3980 processDown(mapper, toRawX(50), toRawY(75));
3981 processSync(mapper);
3982
3983 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3984 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3985 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3986
3987 processUp(mapper);
3988 processSync(mapper);
3989 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3990
3991 // Rotation 90.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003992 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08003993 prepareDisplay(DISPLAY_ORIENTATION_90);
3994 processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50));
3995 processSync(mapper);
3996
3997 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3998 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3999 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4000
4001 processUp(mapper);
4002 processSync(mapper);
4003 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4004
4005 // Rotation 180.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004006 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004007 prepareDisplay(DISPLAY_ORIENTATION_180);
4008 processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN);
4009 processSync(mapper);
4010
4011 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4012 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4013 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4014
4015 processUp(mapper);
4016 processSync(mapper);
4017 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4018
4019 // Rotation 270.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004020 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004021 prepareDisplay(DISPLAY_ORIENTATION_270);
4022 processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN);
4023 processSync(mapper);
4024
4025 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4026 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4027 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4028
4029 processUp(mapper);
4030 processSync(mapper);
4031 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4032}
4033
4034TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
4035 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4036 addConfigurationProperty("touch.deviceType", "touchScreen");
4037 prepareDisplay(DISPLAY_ORIENTATION_0);
4038 prepareButtons();
4039 prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT);
4040 addMapperAndConfigure(mapper);
4041
4042 // These calculations are based on the input device calibration documentation.
4043 int32_t rawX = 100;
4044 int32_t rawY = 200;
4045 int32_t rawPressure = 10;
4046 int32_t rawToolMajor = 12;
4047 int32_t rawDistance = 2;
4048 int32_t rawTiltX = 30;
4049 int32_t rawTiltY = 110;
4050
4051 float x = toDisplayX(rawX);
4052 float y = toDisplayY(rawY);
4053 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
4054 float size = float(rawToolMajor) / RAW_TOOL_MAX;
4055 float tool = float(rawToolMajor) * GEOMETRIC_SCALE;
4056 float distance = float(rawDistance);
4057
4058 float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f;
4059 float tiltScale = M_PI / 180;
4060 float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale;
4061 float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale;
4062 float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle));
4063 float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle));
4064
4065 processDown(mapper, rawX, rawY);
4066 processPressure(mapper, rawPressure);
4067 processToolMajor(mapper, rawToolMajor);
4068 processDistance(mapper, rawDistance);
4069 processTilt(mapper, rawTiltX, rawTiltY);
4070 processSync(mapper);
4071
4072 NotifyMotionArgs args;
4073 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4074 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4075 x, y, pressure, size, tool, tool, tool, tool, orientation, distance));
4076 ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT));
4077}
4078
Jason Gerecke489fda82012-09-07 17:19:40 -07004079TEST_F(SingleTouchInputMapperTest, Process_XYAxes_AffineCalibration) {
4080 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4081 addConfigurationProperty("touch.deviceType", "touchScreen");
4082 prepareDisplay(DISPLAY_ORIENTATION_0);
4083 prepareLocationCalibration();
4084 prepareButtons();
4085 prepareAxes(POSITION);
4086 addMapperAndConfigure(mapper);
4087
4088 int32_t rawX = 100;
4089 int32_t rawY = 200;
4090
4091 float x = toDisplayX(toCookedX(rawX, rawY));
4092 float y = toDisplayY(toCookedY(rawX, rawY));
4093
4094 processDown(mapper, rawX, rawY);
4095 processSync(mapper);
4096
4097 NotifyMotionArgs args;
4098 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4099 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4100 x, y, 1, 0, 0, 0, 0, 0, 0, 0));
4101}
4102
Michael Wrightd02c5b62014-02-10 15:10:22 -08004103TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) {
4104 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4105 addConfigurationProperty("touch.deviceType", "touchScreen");
4106 prepareDisplay(DISPLAY_ORIENTATION_0);
4107 prepareButtons();
4108 prepareAxes(POSITION);
4109 addMapperAndConfigure(mapper);
4110
4111 NotifyMotionArgs motionArgs;
4112 NotifyKeyArgs keyArgs;
4113
4114 processDown(mapper, 100, 200);
4115 processSync(mapper);
4116 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4117 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4118 ASSERT_EQ(0, motionArgs.buttonState);
4119
4120 // press BTN_LEFT, release BTN_LEFT
4121 processKey(mapper, BTN_LEFT, 1);
4122 processSync(mapper);
4123 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4124 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4125 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4126
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004127 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4128 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4129 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4130
Michael Wrightd02c5b62014-02-10 15:10:22 -08004131 processKey(mapper, BTN_LEFT, 0);
4132 processSync(mapper);
4133 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004134 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004135 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004136
4137 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004138 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004139 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004140
4141 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
4142 processKey(mapper, BTN_RIGHT, 1);
4143 processKey(mapper, BTN_MIDDLE, 1);
4144 processSync(mapper);
4145 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4146 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4147 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4148 motionArgs.buttonState);
4149
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004150 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4151 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4152 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4153
4154 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4155 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4156 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4157 motionArgs.buttonState);
4158
Michael Wrightd02c5b62014-02-10 15:10:22 -08004159 processKey(mapper, BTN_RIGHT, 0);
4160 processSync(mapper);
4161 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004162 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004163 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004164
4165 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004166 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004167 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004168
4169 processKey(mapper, BTN_MIDDLE, 0);
4170 processSync(mapper);
4171 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004172 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004173 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004174
4175 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004176 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004177 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004178
4179 // press BTN_BACK, release BTN_BACK
4180 processKey(mapper, BTN_BACK, 1);
4181 processSync(mapper);
4182 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4183 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4184 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004185
Michael Wrightd02c5b62014-02-10 15:10:22 -08004186 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004187 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004188 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4189
4190 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4191 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4192 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004193
4194 processKey(mapper, BTN_BACK, 0);
4195 processSync(mapper);
4196 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004197 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004198 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004199
4200 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004201 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004202 ASSERT_EQ(0, motionArgs.buttonState);
4203
Michael Wrightd02c5b62014-02-10 15:10:22 -08004204 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4205 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4206 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4207
4208 // press BTN_SIDE, release BTN_SIDE
4209 processKey(mapper, BTN_SIDE, 1);
4210 processSync(mapper);
4211 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4212 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4213 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004214
Michael Wrightd02c5b62014-02-10 15:10:22 -08004215 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004216 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004217 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4218
4219 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4220 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4221 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004222
4223 processKey(mapper, BTN_SIDE, 0);
4224 processSync(mapper);
4225 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004226 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004227 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004228
4229 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004230 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004231 ASSERT_EQ(0, motionArgs.buttonState);
4232
Michael Wrightd02c5b62014-02-10 15:10:22 -08004233 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4234 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4235 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4236
4237 // press BTN_FORWARD, release BTN_FORWARD
4238 processKey(mapper, BTN_FORWARD, 1);
4239 processSync(mapper);
4240 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4241 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4242 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004243
Michael Wrightd02c5b62014-02-10 15:10:22 -08004244 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004245 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004246 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4247
4248 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4249 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4250 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004251
4252 processKey(mapper, BTN_FORWARD, 0);
4253 processSync(mapper);
4254 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004255 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004256 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004257
4258 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004259 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004260 ASSERT_EQ(0, motionArgs.buttonState);
4261
Michael Wrightd02c5b62014-02-10 15:10:22 -08004262 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4263 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4264 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4265
4266 // press BTN_EXTRA, release BTN_EXTRA
4267 processKey(mapper, BTN_EXTRA, 1);
4268 processSync(mapper);
4269 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4270 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4271 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004272
Michael Wrightd02c5b62014-02-10 15:10:22 -08004273 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004274 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004275 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4276
4277 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4278 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4279 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004280
4281 processKey(mapper, BTN_EXTRA, 0);
4282 processSync(mapper);
4283 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004284 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004285 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004286
4287 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004288 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004289 ASSERT_EQ(0, motionArgs.buttonState);
4290
Michael Wrightd02c5b62014-02-10 15:10:22 -08004291 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4292 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4293 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4294
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004295 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4296
Michael Wrightd02c5b62014-02-10 15:10:22 -08004297 // press BTN_STYLUS, release BTN_STYLUS
4298 processKey(mapper, BTN_STYLUS, 1);
4299 processSync(mapper);
4300 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4301 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004302 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
4303
4304 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4305 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4306 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004307
4308 processKey(mapper, BTN_STYLUS, 0);
4309 processSync(mapper);
4310 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004311 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004312 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004313
4314 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004315 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004316 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004317
4318 // press BTN_STYLUS2, release BTN_STYLUS2
4319 processKey(mapper, BTN_STYLUS2, 1);
4320 processSync(mapper);
4321 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4322 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004323 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
4324
4325 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4326 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4327 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004328
4329 processKey(mapper, BTN_STYLUS2, 0);
4330 processSync(mapper);
4331 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004332 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004333 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004334
4335 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004336 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004337 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004338
4339 // release touch
4340 processUp(mapper);
4341 processSync(mapper);
4342 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4343 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4344 ASSERT_EQ(0, motionArgs.buttonState);
4345}
4346
4347TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
4348 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4349 addConfigurationProperty("touch.deviceType", "touchScreen");
4350 prepareDisplay(DISPLAY_ORIENTATION_0);
4351 prepareButtons();
4352 prepareAxes(POSITION);
4353 addMapperAndConfigure(mapper);
4354
4355 NotifyMotionArgs motionArgs;
4356
4357 // default tool type is finger
4358 processDown(mapper, 100, 200);
4359 processSync(mapper);
4360 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4361 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4362 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4363
4364 // eraser
4365 processKey(mapper, BTN_TOOL_RUBBER, 1);
4366 processSync(mapper);
4367 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4368 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4369 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4370
4371 // stylus
4372 processKey(mapper, BTN_TOOL_RUBBER, 0);
4373 processKey(mapper, BTN_TOOL_PEN, 1);
4374 processSync(mapper);
4375 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4376 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4377 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4378
4379 // brush
4380 processKey(mapper, BTN_TOOL_PEN, 0);
4381 processKey(mapper, BTN_TOOL_BRUSH, 1);
4382 processSync(mapper);
4383 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4384 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4385 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4386
4387 // pencil
4388 processKey(mapper, BTN_TOOL_BRUSH, 0);
4389 processKey(mapper, BTN_TOOL_PENCIL, 1);
4390 processSync(mapper);
4391 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4392 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4393 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4394
4395 // airbrush
4396 processKey(mapper, BTN_TOOL_PENCIL, 0);
4397 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
4398 processSync(mapper);
4399 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4400 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4401 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4402
4403 // mouse
4404 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
4405 processKey(mapper, BTN_TOOL_MOUSE, 1);
4406 processSync(mapper);
4407 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4408 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4409 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4410
4411 // lens
4412 processKey(mapper, BTN_TOOL_MOUSE, 0);
4413 processKey(mapper, BTN_TOOL_LENS, 1);
4414 processSync(mapper);
4415 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4416 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4417 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4418
4419 // double-tap
4420 processKey(mapper, BTN_TOOL_LENS, 0);
4421 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
4422 processSync(mapper);
4423 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4424 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4425 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4426
4427 // triple-tap
4428 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
4429 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
4430 processSync(mapper);
4431 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4432 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4433 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4434
4435 // quad-tap
4436 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
4437 processKey(mapper, BTN_TOOL_QUADTAP, 1);
4438 processSync(mapper);
4439 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4440 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4441 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4442
4443 // finger
4444 processKey(mapper, BTN_TOOL_QUADTAP, 0);
4445 processKey(mapper, BTN_TOOL_FINGER, 1);
4446 processSync(mapper);
4447 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4448 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4449 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4450
4451 // stylus trumps finger
4452 processKey(mapper, BTN_TOOL_PEN, 1);
4453 processSync(mapper);
4454 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4455 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4456 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4457
4458 // eraser trumps stylus
4459 processKey(mapper, BTN_TOOL_RUBBER, 1);
4460 processSync(mapper);
4461 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4462 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4463 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4464
4465 // mouse trumps eraser
4466 processKey(mapper, BTN_TOOL_MOUSE, 1);
4467 processSync(mapper);
4468 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4469 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4470 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4471
4472 // back to default tool type
4473 processKey(mapper, BTN_TOOL_MOUSE, 0);
4474 processKey(mapper, BTN_TOOL_RUBBER, 0);
4475 processKey(mapper, BTN_TOOL_PEN, 0);
4476 processKey(mapper, BTN_TOOL_FINGER, 0);
4477 processSync(mapper);
4478 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4479 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4480 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4481}
4482
4483TEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
4484 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4485 addConfigurationProperty("touch.deviceType", "touchScreen");
4486 prepareDisplay(DISPLAY_ORIENTATION_0);
4487 prepareButtons();
4488 prepareAxes(POSITION);
4489 mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0);
4490 addMapperAndConfigure(mapper);
4491
4492 NotifyMotionArgs motionArgs;
4493
4494 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
4495 processKey(mapper, BTN_TOOL_FINGER, 1);
4496 processMove(mapper, 100, 200);
4497 processSync(mapper);
4498 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4499 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4500 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4501 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4502
4503 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4504 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4505 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4506 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4507
4508 // move a little
4509 processMove(mapper, 150, 250);
4510 processSync(mapper);
4511 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4512 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4513 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4514 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4515
4516 // down when BTN_TOUCH is pressed, pressure defaults to 1
4517 processKey(mapper, BTN_TOUCH, 1);
4518 processSync(mapper);
4519 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4520 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4521 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4522 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4523
4524 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4525 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4526 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4527 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4528
4529 // up when BTN_TOUCH is released, hover restored
4530 processKey(mapper, BTN_TOUCH, 0);
4531 processSync(mapper);
4532 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4533 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4534 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4535 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4536
4537 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4538 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4539 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4540 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4541
4542 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4543 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4544 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4545 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4546
4547 // exit hover when pointer goes away
4548 processKey(mapper, BTN_TOOL_FINGER, 0);
4549 processSync(mapper);
4550 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4551 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4552 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4553 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4554}
4555
4556TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) {
4557 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4558 addConfigurationProperty("touch.deviceType", "touchScreen");
4559 prepareDisplay(DISPLAY_ORIENTATION_0);
4560 prepareButtons();
4561 prepareAxes(POSITION | PRESSURE);
4562 addMapperAndConfigure(mapper);
4563
4564 NotifyMotionArgs motionArgs;
4565
4566 // initially hovering because pressure is 0
4567 processDown(mapper, 100, 200);
4568 processPressure(mapper, 0);
4569 processSync(mapper);
4570 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4571 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4572 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4573 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4574
4575 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4576 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4577 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4578 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4579
4580 // move a little
4581 processMove(mapper, 150, 250);
4582 processSync(mapper);
4583 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4584 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4585 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4586 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4587
4588 // down when pressure is non-zero
4589 processPressure(mapper, RAW_PRESSURE_MAX);
4590 processSync(mapper);
4591 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4592 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4593 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4594 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4595
4596 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4597 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4598 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4599 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4600
4601 // up when pressure becomes 0, hover restored
4602 processPressure(mapper, 0);
4603 processSync(mapper);
4604 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4605 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4606 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4607 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4608
4609 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4610 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4611 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4612 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4613
4614 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4615 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4616 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4617 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4618
4619 // exit hover when pointer goes away
4620 processUp(mapper);
4621 processSync(mapper);
4622 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4623 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4624 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4625 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4626}
4627
4628
4629// --- MultiTouchInputMapperTest ---
4630
4631class MultiTouchInputMapperTest : public TouchInputMapperTest {
4632protected:
4633 void prepareAxes(int axes);
4634
4635 void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
4636 void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
4637 void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
4638 void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
4639 void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
4640 void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
4641 void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
4642 void processDistance(MultiTouchInputMapper* mapper, int32_t distance);
4643 void processId(MultiTouchInputMapper* mapper, int32_t id);
4644 void processSlot(MultiTouchInputMapper* mapper, int32_t slot);
4645 void processToolType(MultiTouchInputMapper* mapper, int32_t toolType);
4646 void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value);
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004647 void processTimestamp(MultiTouchInputMapper* mapper, uint32_t value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004648 void processMTSync(MultiTouchInputMapper* mapper);
4649 void processSync(MultiTouchInputMapper* mapper);
4650};
4651
4652void MultiTouchInputMapperTest::prepareAxes(int axes) {
4653 if (axes & POSITION) {
4654 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X,
4655 RAW_X_MIN, RAW_X_MAX, 0, 0);
4656 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y,
4657 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
4658 }
4659 if (axes & TOUCH) {
4660 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR,
4661 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4662 if (axes & MINOR) {
4663 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
4664 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4665 }
4666 }
4667 if (axes & TOOL) {
4668 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR,
4669 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
4670 if (axes & MINOR) {
4671 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
4672 RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
4673 }
4674 }
4675 if (axes & ORIENTATION) {
4676 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION,
4677 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
4678 }
4679 if (axes & PRESSURE) {
4680 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE,
4681 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
4682 }
4683 if (axes & DISTANCE) {
4684 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE,
4685 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
4686 }
4687 if (axes & ID) {
4688 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
4689 RAW_ID_MIN, RAW_ID_MAX, 0, 0);
4690 }
4691 if (axes & SLOT) {
4692 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT,
4693 RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0);
4694 mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0);
4695 }
4696 if (axes & TOOL_TYPE) {
4697 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE,
4698 0, MT_TOOL_MAX, 0, 0);
4699 }
4700}
4701
4702void MultiTouchInputMapperTest::processPosition(
4703 MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004704 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, x);
4705 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004706}
4707
4708void MultiTouchInputMapperTest::processTouchMajor(
4709 MultiTouchInputMapper* mapper, int32_t touchMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004710 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004711}
4712
4713void MultiTouchInputMapperTest::processTouchMinor(
4714 MultiTouchInputMapper* mapper, int32_t touchMinor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004715 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004716}
4717
4718void MultiTouchInputMapperTest::processToolMajor(
4719 MultiTouchInputMapper* mapper, int32_t toolMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004720 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004721}
4722
4723void MultiTouchInputMapperTest::processToolMinor(
4724 MultiTouchInputMapper* mapper, int32_t toolMinor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004725 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004726}
4727
4728void MultiTouchInputMapperTest::processOrientation(
4729 MultiTouchInputMapper* mapper, int32_t orientation) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004730 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_ORIENTATION, orientation);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004731}
4732
4733void MultiTouchInputMapperTest::processPressure(
4734 MultiTouchInputMapper* mapper, int32_t pressure) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004735 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_PRESSURE, pressure);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004736}
4737
4738void MultiTouchInputMapperTest::processDistance(
4739 MultiTouchInputMapper* mapper, int32_t distance) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004740 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_DISTANCE, distance);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004741}
4742
4743void MultiTouchInputMapperTest::processId(
4744 MultiTouchInputMapper* mapper, int32_t id) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004745 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, id);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004746}
4747
4748void MultiTouchInputMapperTest::processSlot(
4749 MultiTouchInputMapper* mapper, int32_t slot) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004750 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, slot);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004751}
4752
4753void MultiTouchInputMapperTest::processToolType(
4754 MultiTouchInputMapper* mapper, int32_t toolType) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004755 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, toolType);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004756}
4757
4758void MultiTouchInputMapperTest::processKey(
4759 MultiTouchInputMapper* mapper, int32_t code, int32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004760 process(mapper, ARBITRARY_TIME, EV_KEY, code, value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004761}
4762
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004763void MultiTouchInputMapperTest::processTimestamp(MultiTouchInputMapper* mapper, uint32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004764 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_TIMESTAMP, value);
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004765}
4766
Michael Wrightd02c5b62014-02-10 15:10:22 -08004767void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004768 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_MT_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004769}
4770
4771void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004772 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004773}
4774
4775
4776TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) {
4777 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4778 addConfigurationProperty("touch.deviceType", "touchScreen");
4779 prepareDisplay(DISPLAY_ORIENTATION_0);
4780 prepareAxes(POSITION);
4781 prepareVirtualKeys();
4782 addMapperAndConfigure(mapper);
4783
4784 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4785
4786 NotifyMotionArgs motionArgs;
4787
4788 // Two fingers down at once.
4789 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4790 processPosition(mapper, x1, y1);
4791 processMTSync(mapper);
4792 processPosition(mapper, x2, y2);
4793 processMTSync(mapper);
4794 processSync(mapper);
4795
4796 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4797 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4798 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4799 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4800 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4801 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4802 ASSERT_EQ(0, motionArgs.flags);
4803 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4804 ASSERT_EQ(0, motionArgs.buttonState);
4805 ASSERT_EQ(0, motionArgs.edgeFlags);
4806 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4807 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4808 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4809 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4810 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4811 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4812 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4813 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4814
4815 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4816 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4817 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4818 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4819 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4820 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4821 motionArgs.action);
4822 ASSERT_EQ(0, motionArgs.flags);
4823 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4824 ASSERT_EQ(0, motionArgs.buttonState);
4825 ASSERT_EQ(0, motionArgs.edgeFlags);
4826 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4827 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4828 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4829 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4830 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4831 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4832 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4833 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4834 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4835 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4836 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4837 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4838
4839 // Move.
4840 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4841 processPosition(mapper, x1, y1);
4842 processMTSync(mapper);
4843 processPosition(mapper, x2, y2);
4844 processMTSync(mapper);
4845 processSync(mapper);
4846
4847 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4848 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4849 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4850 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4851 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4852 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4853 ASSERT_EQ(0, motionArgs.flags);
4854 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4855 ASSERT_EQ(0, motionArgs.buttonState);
4856 ASSERT_EQ(0, motionArgs.edgeFlags);
4857 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4858 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4859 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4860 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4861 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4862 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4863 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4864 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4865 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4866 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4867 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4868 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4869
4870 // First finger up.
4871 x2 += 15; y2 -= 20;
4872 processPosition(mapper, x2, y2);
4873 processMTSync(mapper);
4874 processSync(mapper);
4875
4876 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4877 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4878 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4879 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4880 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4881 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4882 motionArgs.action);
4883 ASSERT_EQ(0, motionArgs.flags);
4884 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4885 ASSERT_EQ(0, motionArgs.buttonState);
4886 ASSERT_EQ(0, motionArgs.edgeFlags);
4887 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4888 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4889 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4890 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4891 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4892 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4893 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4894 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4895 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4896 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4897 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4898 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4899
4900 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4901 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4902 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4903 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4904 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4905 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4906 ASSERT_EQ(0, motionArgs.flags);
4907 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4908 ASSERT_EQ(0, motionArgs.buttonState);
4909 ASSERT_EQ(0, motionArgs.edgeFlags);
4910 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4911 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4912 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4913 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4914 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4915 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4916 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4917 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4918
4919 // Move.
4920 x2 += 20; y2 -= 25;
4921 processPosition(mapper, x2, y2);
4922 processMTSync(mapper);
4923 processSync(mapper);
4924
4925 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4926 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4927 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4928 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4929 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4930 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4931 ASSERT_EQ(0, motionArgs.flags);
4932 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4933 ASSERT_EQ(0, motionArgs.buttonState);
4934 ASSERT_EQ(0, motionArgs.edgeFlags);
4935 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4936 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4937 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4938 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4939 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4940 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4941 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4942 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4943
4944 // New finger down.
4945 int32_t x3 = 700, y3 = 300;
4946 processPosition(mapper, x2, y2);
4947 processMTSync(mapper);
4948 processPosition(mapper, x3, y3);
4949 processMTSync(mapper);
4950 processSync(mapper);
4951
4952 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4953 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4954 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4955 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4956 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4957 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4958 motionArgs.action);
4959 ASSERT_EQ(0, motionArgs.flags);
4960 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4961 ASSERT_EQ(0, motionArgs.buttonState);
4962 ASSERT_EQ(0, motionArgs.edgeFlags);
4963 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4964 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4965 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4966 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4967 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4968 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4969 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4970 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4971 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4972 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4973 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4974 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4975
4976 // Second finger up.
4977 x3 += 30; y3 -= 20;
4978 processPosition(mapper, x3, y3);
4979 processMTSync(mapper);
4980 processSync(mapper);
4981
4982 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4983 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4984 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4985 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4986 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4987 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4988 motionArgs.action);
4989 ASSERT_EQ(0, motionArgs.flags);
4990 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4991 ASSERT_EQ(0, motionArgs.buttonState);
4992 ASSERT_EQ(0, motionArgs.edgeFlags);
4993 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4994 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4995 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4996 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4997 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4998 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4999 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5000 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5001 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5002 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5003 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5004 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5005
5006 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5007 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5008 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5009 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5010 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5011 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5012 ASSERT_EQ(0, motionArgs.flags);
5013 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5014 ASSERT_EQ(0, motionArgs.buttonState);
5015 ASSERT_EQ(0, motionArgs.edgeFlags);
5016 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5017 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5018 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5019 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5020 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5021 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5022 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5023 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5024
5025 // Last finger up.
5026 processMTSync(mapper);
5027 processSync(mapper);
5028
5029 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5030 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5031 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5032 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5033 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5034 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5035 ASSERT_EQ(0, motionArgs.flags);
5036 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5037 ASSERT_EQ(0, motionArgs.buttonState);
5038 ASSERT_EQ(0, motionArgs.edgeFlags);
5039 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5040 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5041 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5042 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5043 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5044 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5045 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5046 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5047
5048 // Should not have sent any more keys or motions.
5049 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5050 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5051}
5052
5053TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
5054 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5055 addConfigurationProperty("touch.deviceType", "touchScreen");
5056 prepareDisplay(DISPLAY_ORIENTATION_0);
5057 prepareAxes(POSITION | ID);
5058 prepareVirtualKeys();
5059 addMapperAndConfigure(mapper);
5060
5061 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5062
5063 NotifyMotionArgs motionArgs;
5064
5065 // Two fingers down at once.
5066 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5067 processPosition(mapper, x1, y1);
5068 processId(mapper, 1);
5069 processMTSync(mapper);
5070 processPosition(mapper, x2, y2);
5071 processId(mapper, 2);
5072 processMTSync(mapper);
5073 processSync(mapper);
5074
5075 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5076 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5077 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5078 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5079 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5080 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5081 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5082
5083 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5084 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5085 motionArgs.action);
5086 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5087 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5088 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5089 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5090 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5091 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5092 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5093 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5094 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5095
5096 // Move.
5097 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5098 processPosition(mapper, x1, y1);
5099 processId(mapper, 1);
5100 processMTSync(mapper);
5101 processPosition(mapper, x2, y2);
5102 processId(mapper, 2);
5103 processMTSync(mapper);
5104 processSync(mapper);
5105
5106 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5107 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5108 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5109 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5110 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5111 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5112 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5113 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5114 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5115 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5116 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5117
5118 // First finger up.
5119 x2 += 15; y2 -= 20;
5120 processPosition(mapper, x2, y2);
5121 processId(mapper, 2);
5122 processMTSync(mapper);
5123 processSync(mapper);
5124
5125 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5126 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5127 motionArgs.action);
5128 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5129 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5130 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5131 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5132 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5133 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5134 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5135 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5136 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5137
5138 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5139 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5140 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5141 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5142 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5143 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5144 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5145
5146 // Move.
5147 x2 += 20; y2 -= 25;
5148 processPosition(mapper, x2, y2);
5149 processId(mapper, 2);
5150 processMTSync(mapper);
5151 processSync(mapper);
5152
5153 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5154 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5155 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5156 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5157 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5158 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5159 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5160
5161 // New finger down.
5162 int32_t x3 = 700, y3 = 300;
5163 processPosition(mapper, x2, y2);
5164 processId(mapper, 2);
5165 processMTSync(mapper);
5166 processPosition(mapper, x3, y3);
5167 processId(mapper, 3);
5168 processMTSync(mapper);
5169 processSync(mapper);
5170
5171 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5172 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5173 motionArgs.action);
5174 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5175 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5176 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5177 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5178 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5179 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5180 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5181 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5182 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5183
5184 // Second finger up.
5185 x3 += 30; y3 -= 20;
5186 processPosition(mapper, x3, y3);
5187 processId(mapper, 3);
5188 processMTSync(mapper);
5189 processSync(mapper);
5190
5191 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5192 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5193 motionArgs.action);
5194 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5195 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5196 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5197 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5198 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5199 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5200 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5201 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5202 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5203
5204 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5205 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5206 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5207 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5208 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5209 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5210 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5211
5212 // Last finger up.
5213 processMTSync(mapper);
5214 processSync(mapper);
5215
5216 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5217 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5218 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5219 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5220 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5221 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5222 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5223
5224 // Should not have sent any more keys or motions.
5225 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5226 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5227}
5228
5229TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) {
5230 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5231 addConfigurationProperty("touch.deviceType", "touchScreen");
5232 prepareDisplay(DISPLAY_ORIENTATION_0);
5233 prepareAxes(POSITION | ID | SLOT);
5234 prepareVirtualKeys();
5235 addMapperAndConfigure(mapper);
5236
5237 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5238
5239 NotifyMotionArgs motionArgs;
5240
5241 // Two fingers down at once.
5242 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5243 processPosition(mapper, x1, y1);
5244 processId(mapper, 1);
5245 processSlot(mapper, 1);
5246 processPosition(mapper, x2, y2);
5247 processId(mapper, 2);
5248 processSync(mapper);
5249
5250 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5251 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5252 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5253 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5254 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5255 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5256 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5257
5258 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5259 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5260 motionArgs.action);
5261 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5262 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5263 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5264 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5265 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5266 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5267 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5268 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5269 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5270
5271 // Move.
5272 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5273 processSlot(mapper, 0);
5274 processPosition(mapper, x1, y1);
5275 processSlot(mapper, 1);
5276 processPosition(mapper, x2, y2);
5277 processSync(mapper);
5278
5279 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5280 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5281 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5282 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5283 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5284 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5285 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5286 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5287 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5288 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5289 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5290
5291 // First finger up.
5292 x2 += 15; y2 -= 20;
5293 processSlot(mapper, 0);
5294 processId(mapper, -1);
5295 processSlot(mapper, 1);
5296 processPosition(mapper, x2, y2);
5297 processSync(mapper);
5298
5299 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5300 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5301 motionArgs.action);
5302 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5303 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5304 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5305 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5306 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5307 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5308 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5309 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5310 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5311
5312 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5313 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5314 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5315 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5316 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5317 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5318 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5319
5320 // Move.
5321 x2 += 20; y2 -= 25;
5322 processPosition(mapper, x2, y2);
5323 processSync(mapper);
5324
5325 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5326 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5327 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5328 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5329 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5330 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5331 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5332
5333 // New finger down.
5334 int32_t x3 = 700, y3 = 300;
5335 processPosition(mapper, x2, y2);
5336 processSlot(mapper, 0);
5337 processId(mapper, 3);
5338 processPosition(mapper, x3, y3);
5339 processSync(mapper);
5340
5341 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5342 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5343 motionArgs.action);
5344 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5345 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5346 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5347 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5348 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5349 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5350 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5351 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5352 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5353
5354 // Second finger up.
5355 x3 += 30; y3 -= 20;
5356 processSlot(mapper, 1);
5357 processId(mapper, -1);
5358 processSlot(mapper, 0);
5359 processPosition(mapper, x3, y3);
5360 processSync(mapper);
5361
5362 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5363 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5364 motionArgs.action);
5365 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5366 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5367 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5368 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5369 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5370 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5371 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5372 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5373 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5374
5375 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5376 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5377 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5378 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5379 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5380 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5381 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5382
5383 // Last finger up.
5384 processId(mapper, -1);
5385 processSync(mapper);
5386
5387 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5388 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5389 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5390 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5391 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5392 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5393 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5394
5395 // Should not have sent any more keys or motions.
5396 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5397 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5398}
5399
5400TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
5401 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5402 addConfigurationProperty("touch.deviceType", "touchScreen");
5403 prepareDisplay(DISPLAY_ORIENTATION_0);
5404 prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE);
5405 addMapperAndConfigure(mapper);
5406
5407 // These calculations are based on the input device calibration documentation.
5408 int32_t rawX = 100;
5409 int32_t rawY = 200;
5410 int32_t rawTouchMajor = 7;
5411 int32_t rawTouchMinor = 6;
5412 int32_t rawToolMajor = 9;
5413 int32_t rawToolMinor = 8;
5414 int32_t rawPressure = 11;
5415 int32_t rawDistance = 0;
5416 int32_t rawOrientation = 3;
5417 int32_t id = 5;
5418
5419 float x = toDisplayX(rawX);
5420 float y = toDisplayY(rawY);
5421 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
5422 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5423 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5424 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5425 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5426 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5427 float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
5428 float distance = float(rawDistance);
5429
5430 processPosition(mapper, rawX, rawY);
5431 processTouchMajor(mapper, rawTouchMajor);
5432 processTouchMinor(mapper, rawTouchMinor);
5433 processToolMajor(mapper, rawToolMajor);
5434 processToolMinor(mapper, rawToolMinor);
5435 processPressure(mapper, rawPressure);
5436 processOrientation(mapper, rawOrientation);
5437 processDistance(mapper, rawDistance);
5438 processId(mapper, id);
5439 processMTSync(mapper);
5440 processSync(mapper);
5441
5442 NotifyMotionArgs args;
5443 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5444 ASSERT_EQ(0, args.pointerProperties[0].id);
5445 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5446 x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor,
5447 orientation, distance));
5448}
5449
5450TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
5451 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5452 addConfigurationProperty("touch.deviceType", "touchScreen");
5453 prepareDisplay(DISPLAY_ORIENTATION_0);
5454 prepareAxes(POSITION | TOUCH | TOOL | MINOR);
5455 addConfigurationProperty("touch.size.calibration", "geometric");
5456 addMapperAndConfigure(mapper);
5457
5458 // These calculations are based on the input device calibration documentation.
5459 int32_t rawX = 100;
5460 int32_t rawY = 200;
5461 int32_t rawTouchMajor = 140;
5462 int32_t rawTouchMinor = 120;
5463 int32_t rawToolMajor = 180;
5464 int32_t rawToolMinor = 160;
5465
5466 float x = toDisplayX(rawX);
5467 float y = toDisplayY(rawY);
5468 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5469 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5470 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5471 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5472 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5473
5474 processPosition(mapper, rawX, rawY);
5475 processTouchMajor(mapper, rawTouchMajor);
5476 processTouchMinor(mapper, rawTouchMinor);
5477 processToolMajor(mapper, rawToolMajor);
5478 processToolMinor(mapper, rawToolMinor);
5479 processMTSync(mapper);
5480 processSync(mapper);
5481
5482 NotifyMotionArgs args;
5483 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5484 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5485 x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0));
5486}
5487
5488TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) {
5489 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5490 addConfigurationProperty("touch.deviceType", "touchScreen");
5491 prepareDisplay(DISPLAY_ORIENTATION_0);
5492 prepareAxes(POSITION | TOUCH | TOOL);
5493 addConfigurationProperty("touch.size.calibration", "diameter");
5494 addConfigurationProperty("touch.size.scale", "10");
5495 addConfigurationProperty("touch.size.bias", "160");
5496 addConfigurationProperty("touch.size.isSummed", "1");
5497 addMapperAndConfigure(mapper);
5498
5499 // These calculations are based on the input device calibration documentation.
5500 // Note: We only provide a single common touch/tool value because the device is assumed
5501 // not to emit separate values for each pointer (isSummed = 1).
5502 int32_t rawX = 100;
5503 int32_t rawY = 200;
5504 int32_t rawX2 = 150;
5505 int32_t rawY2 = 250;
5506 int32_t rawTouchMajor = 5;
5507 int32_t rawToolMajor = 8;
5508
5509 float x = toDisplayX(rawX);
5510 float y = toDisplayY(rawY);
5511 float x2 = toDisplayX(rawX2);
5512 float y2 = toDisplayY(rawY2);
5513 float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX;
5514 float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f;
5515 float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f;
5516
5517 processPosition(mapper, rawX, rawY);
5518 processTouchMajor(mapper, rawTouchMajor);
5519 processToolMajor(mapper, rawToolMajor);
5520 processMTSync(mapper);
5521 processPosition(mapper, rawX2, rawY2);
5522 processTouchMajor(mapper, rawTouchMajor);
5523 processToolMajor(mapper, rawToolMajor);
5524 processMTSync(mapper);
5525 processSync(mapper);
5526
5527 NotifyMotionArgs args;
5528 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5529 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
5530
5531 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5532 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5533 args.action);
5534 ASSERT_EQ(size_t(2), args.pointerCount);
5535 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5536 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5537 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
5538 x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0));
5539}
5540
5541TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) {
5542 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5543 addConfigurationProperty("touch.deviceType", "touchScreen");
5544 prepareDisplay(DISPLAY_ORIENTATION_0);
5545 prepareAxes(POSITION | TOUCH | TOOL);
5546 addConfigurationProperty("touch.size.calibration", "area");
5547 addConfigurationProperty("touch.size.scale", "43");
5548 addConfigurationProperty("touch.size.bias", "3");
5549 addMapperAndConfigure(mapper);
5550
5551 // These calculations are based on the input device calibration documentation.
5552 int32_t rawX = 100;
5553 int32_t rawY = 200;
5554 int32_t rawTouchMajor = 5;
5555 int32_t rawToolMajor = 8;
5556
5557 float x = toDisplayX(rawX);
5558 float y = toDisplayY(rawY);
5559 float size = float(rawTouchMajor) / RAW_TOUCH_MAX;
5560 float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f;
5561 float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f;
5562
5563 processPosition(mapper, rawX, rawY);
5564 processTouchMajor(mapper, rawTouchMajor);
5565 processToolMajor(mapper, rawToolMajor);
5566 processMTSync(mapper);
5567 processSync(mapper);
5568
5569 NotifyMotionArgs args;
5570 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5571 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5572 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5573}
5574
5575TEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) {
5576 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5577 addConfigurationProperty("touch.deviceType", "touchScreen");
5578 prepareDisplay(DISPLAY_ORIENTATION_0);
5579 prepareAxes(POSITION | PRESSURE);
5580 addConfigurationProperty("touch.pressure.calibration", "amplitude");
5581 addConfigurationProperty("touch.pressure.scale", "0.01");
5582 addMapperAndConfigure(mapper);
5583
Michael Wrightaa449c92017-12-13 21:21:43 +00005584 InputDeviceInfo info;
5585 mapper->populateDeviceInfo(&info);
5586 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
5587 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TOUCHSCREEN,
5588 0.0f, RAW_PRESSURE_MAX * 0.01, 0.0f, 0.0f));
5589
Michael Wrightd02c5b62014-02-10 15:10:22 -08005590 // These calculations are based on the input device calibration documentation.
5591 int32_t rawX = 100;
5592 int32_t rawY = 200;
5593 int32_t rawPressure = 60;
5594
5595 float x = toDisplayX(rawX);
5596 float y = toDisplayY(rawY);
5597 float pressure = float(rawPressure) * 0.01f;
5598
5599 processPosition(mapper, rawX, rawY);
5600 processPressure(mapper, rawPressure);
5601 processMTSync(mapper);
5602 processSync(mapper);
5603
5604 NotifyMotionArgs args;
5605 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5606 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5607 x, y, pressure, 0, 0, 0, 0, 0, 0, 0));
5608}
5609
5610TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) {
5611 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5612 addConfigurationProperty("touch.deviceType", "touchScreen");
5613 prepareDisplay(DISPLAY_ORIENTATION_0);
5614 prepareAxes(POSITION | ID | SLOT);
5615 addMapperAndConfigure(mapper);
5616
5617 NotifyMotionArgs motionArgs;
5618 NotifyKeyArgs keyArgs;
5619
5620 processId(mapper, 1);
5621 processPosition(mapper, 100, 200);
5622 processSync(mapper);
5623 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5624 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5625 ASSERT_EQ(0, motionArgs.buttonState);
5626
5627 // press BTN_LEFT, release BTN_LEFT
5628 processKey(mapper, BTN_LEFT, 1);
5629 processSync(mapper);
5630 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5631 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5632 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5633
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005634 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5635 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5636 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5637
Michael Wrightd02c5b62014-02-10 15:10:22 -08005638 processKey(mapper, BTN_LEFT, 0);
5639 processSync(mapper);
5640 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005641 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005642 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005643
5644 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005645 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005646 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005647
5648 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
5649 processKey(mapper, BTN_RIGHT, 1);
5650 processKey(mapper, BTN_MIDDLE, 1);
5651 processSync(mapper);
5652 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5653 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5654 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5655 motionArgs.buttonState);
5656
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005657 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5658 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5659 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
5660
5661 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5662 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5663 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5664 motionArgs.buttonState);
5665
Michael Wrightd02c5b62014-02-10 15:10:22 -08005666 processKey(mapper, BTN_RIGHT, 0);
5667 processSync(mapper);
5668 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005669 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005670 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005671
5672 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005673 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005674 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005675
5676 processKey(mapper, BTN_MIDDLE, 0);
5677 processSync(mapper);
5678 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005679 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005680 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005681
5682 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005683 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005684 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005685
5686 // press BTN_BACK, release BTN_BACK
5687 processKey(mapper, BTN_BACK, 1);
5688 processSync(mapper);
5689 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5690 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5691 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005692
Michael Wrightd02c5b62014-02-10 15:10:22 -08005693 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005694 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005695 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5696
5697 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5698 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5699 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005700
5701 processKey(mapper, BTN_BACK, 0);
5702 processSync(mapper);
5703 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005704 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005705 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005706
5707 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005708 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005709 ASSERT_EQ(0, motionArgs.buttonState);
5710
Michael Wrightd02c5b62014-02-10 15:10:22 -08005711 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5712 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5713 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5714
5715 // press BTN_SIDE, release BTN_SIDE
5716 processKey(mapper, BTN_SIDE, 1);
5717 processSync(mapper);
5718 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5719 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5720 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005721
Michael Wrightd02c5b62014-02-10 15:10:22 -08005722 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005723 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005724 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5725
5726 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5727 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5728 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005729
5730 processKey(mapper, BTN_SIDE, 0);
5731 processSync(mapper);
5732 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005733 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005734 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005735
5736 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005737 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005738 ASSERT_EQ(0, motionArgs.buttonState);
5739
Michael Wrightd02c5b62014-02-10 15:10:22 -08005740 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5741 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5742 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5743
5744 // press BTN_FORWARD, release BTN_FORWARD
5745 processKey(mapper, BTN_FORWARD, 1);
5746 processSync(mapper);
5747 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5748 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5749 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005750
Michael Wrightd02c5b62014-02-10 15:10:22 -08005751 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005752 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005753 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5754
5755 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5756 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5757 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005758
5759 processKey(mapper, BTN_FORWARD, 0);
5760 processSync(mapper);
5761 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005762 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005763 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005764
5765 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005766 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005767 ASSERT_EQ(0, motionArgs.buttonState);
5768
Michael Wrightd02c5b62014-02-10 15:10:22 -08005769 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5770 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5771 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5772
5773 // press BTN_EXTRA, release BTN_EXTRA
5774 processKey(mapper, BTN_EXTRA, 1);
5775 processSync(mapper);
5776 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5777 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5778 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005779
Michael Wrightd02c5b62014-02-10 15:10:22 -08005780 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005781 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005782 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5783
5784 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5785 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5786 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005787
5788 processKey(mapper, BTN_EXTRA, 0);
5789 processSync(mapper);
5790 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005791 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005792 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005793
5794 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005795 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005796 ASSERT_EQ(0, motionArgs.buttonState);
5797
Michael Wrightd02c5b62014-02-10 15:10:22 -08005798 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5799 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5800 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5801
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005802 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5803
Michael Wrightd02c5b62014-02-10 15:10:22 -08005804 // press BTN_STYLUS, release BTN_STYLUS
5805 processKey(mapper, BTN_STYLUS, 1);
5806 processSync(mapper);
5807 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5808 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005809 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
5810
5811 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5812 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5813 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005814
5815 processKey(mapper, BTN_STYLUS, 0);
5816 processSync(mapper);
5817 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005818 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005819 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005820
5821 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005822 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005823 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005824
5825 // press BTN_STYLUS2, release BTN_STYLUS2
5826 processKey(mapper, BTN_STYLUS2, 1);
5827 processSync(mapper);
5828 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5829 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005830 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
5831
5832 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5833 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5834 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005835
5836 processKey(mapper, BTN_STYLUS2, 0);
5837 processSync(mapper);
5838 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005839 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005840 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005841
5842 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005843 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005844 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005845
5846 // release touch
5847 processId(mapper, -1);
5848 processSync(mapper);
5849 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5850 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5851 ASSERT_EQ(0, motionArgs.buttonState);
5852}
5853
5854TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
5855 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5856 addConfigurationProperty("touch.deviceType", "touchScreen");
5857 prepareDisplay(DISPLAY_ORIENTATION_0);
5858 prepareAxes(POSITION | ID | SLOT | TOOL_TYPE);
5859 addMapperAndConfigure(mapper);
5860
5861 NotifyMotionArgs motionArgs;
5862
5863 // default tool type is finger
5864 processId(mapper, 1);
5865 processPosition(mapper, 100, 200);
5866 processSync(mapper);
5867 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5868 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5869 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5870
5871 // eraser
5872 processKey(mapper, BTN_TOOL_RUBBER, 1);
5873 processSync(mapper);
5874 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5875 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5876 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
5877
5878 // stylus
5879 processKey(mapper, BTN_TOOL_RUBBER, 0);
5880 processKey(mapper, BTN_TOOL_PEN, 1);
5881 processSync(mapper);
5882 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5883 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5884 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5885
5886 // brush
5887 processKey(mapper, BTN_TOOL_PEN, 0);
5888 processKey(mapper, BTN_TOOL_BRUSH, 1);
5889 processSync(mapper);
5890 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5891 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5892 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5893
5894 // pencil
5895 processKey(mapper, BTN_TOOL_BRUSH, 0);
5896 processKey(mapper, BTN_TOOL_PENCIL, 1);
5897 processSync(mapper);
5898 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5899 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5900 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5901
5902 // airbrush
5903 processKey(mapper, BTN_TOOL_PENCIL, 0);
5904 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
5905 processSync(mapper);
5906 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5907 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5908 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5909
5910 // mouse
5911 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
5912 processKey(mapper, BTN_TOOL_MOUSE, 1);
5913 processSync(mapper);
5914 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5915 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5916 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5917
5918 // lens
5919 processKey(mapper, BTN_TOOL_MOUSE, 0);
5920 processKey(mapper, BTN_TOOL_LENS, 1);
5921 processSync(mapper);
5922 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5923 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5924 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5925
5926 // double-tap
5927 processKey(mapper, BTN_TOOL_LENS, 0);
5928 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
5929 processSync(mapper);
5930 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5931 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5932 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5933
5934 // triple-tap
5935 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
5936 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
5937 processSync(mapper);
5938 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5939 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5940 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5941
5942 // quad-tap
5943 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
5944 processKey(mapper, BTN_TOOL_QUADTAP, 1);
5945 processSync(mapper);
5946 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5947 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5948 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5949
5950 // finger
5951 processKey(mapper, BTN_TOOL_QUADTAP, 0);
5952 processKey(mapper, BTN_TOOL_FINGER, 1);
5953 processSync(mapper);
5954 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5955 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5956 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5957
5958 // stylus trumps finger
5959 processKey(mapper, BTN_TOOL_PEN, 1);
5960 processSync(mapper);
5961 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5962 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5963 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5964
5965 // eraser trumps stylus
5966 processKey(mapper, BTN_TOOL_RUBBER, 1);
5967 processSync(mapper);
5968 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5969 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5970 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
5971
5972 // mouse trumps eraser
5973 processKey(mapper, BTN_TOOL_MOUSE, 1);
5974 processSync(mapper);
5975 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5976 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5977 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5978
5979 // MT tool type trumps BTN tool types: MT_TOOL_FINGER
5980 processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE
5981 processSync(mapper);
5982 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5983 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5984 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5985
5986 // MT tool type trumps BTN tool types: MT_TOOL_PEN
5987 processToolType(mapper, MT_TOOL_PEN);
5988 processSync(mapper);
5989 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5990 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5991 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5992
5993 // back to default tool type
5994 processToolType(mapper, -1); // use a deliberately undefined tool type, for testing
5995 processKey(mapper, BTN_TOOL_MOUSE, 0);
5996 processKey(mapper, BTN_TOOL_RUBBER, 0);
5997 processKey(mapper, BTN_TOOL_PEN, 0);
5998 processKey(mapper, BTN_TOOL_FINGER, 0);
5999 processSync(mapper);
6000 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6001 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6002 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6003}
6004
6005TEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
6006 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6007 addConfigurationProperty("touch.deviceType", "touchScreen");
6008 prepareDisplay(DISPLAY_ORIENTATION_0);
6009 prepareAxes(POSITION | ID | SLOT);
6010 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
6011 addMapperAndConfigure(mapper);
6012
6013 NotifyMotionArgs motionArgs;
6014
6015 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
6016 processId(mapper, 1);
6017 processPosition(mapper, 100, 200);
6018 processSync(mapper);
6019 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6020 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6021 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6022 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6023
6024 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6025 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6026 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6027 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6028
6029 // move a little
6030 processPosition(mapper, 150, 250);
6031 processSync(mapper);
6032 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6033 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6034 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6035 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6036
6037 // down when BTN_TOUCH is pressed, pressure defaults to 1
6038 processKey(mapper, BTN_TOUCH, 1);
6039 processSync(mapper);
6040 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6041 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6042 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6043 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6044
6045 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6046 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
6047 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6048 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6049
6050 // up when BTN_TOUCH is released, hover restored
6051 processKey(mapper, BTN_TOUCH, 0);
6052 processSync(mapper);
6053 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6054 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
6055 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6056 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6057
6058 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6059 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6060 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6061 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6062
6063 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6064 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6065 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6066 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6067
6068 // exit hover when pointer goes away
6069 processId(mapper, -1);
6070 processSync(mapper);
6071 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6072 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6073 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6074 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6075}
6076
6077TEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) {
6078 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6079 addConfigurationProperty("touch.deviceType", "touchScreen");
6080 prepareDisplay(DISPLAY_ORIENTATION_0);
6081 prepareAxes(POSITION | ID | SLOT | PRESSURE);
6082 addMapperAndConfigure(mapper);
6083
6084 NotifyMotionArgs motionArgs;
6085
6086 // initially hovering because pressure is 0
6087 processId(mapper, 1);
6088 processPosition(mapper, 100, 200);
6089 processPressure(mapper, 0);
6090 processSync(mapper);
6091 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6092 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6093 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6094 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6095
6096 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6097 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6098 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6099 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6100
6101 // move a little
6102 processPosition(mapper, 150, 250);
6103 processSync(mapper);
6104 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6105 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6106 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6107 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6108
6109 // down when pressure becomes non-zero
6110 processPressure(mapper, RAW_PRESSURE_MAX);
6111 processSync(mapper);
6112 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6113 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6114 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6115 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6116
6117 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6118 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
6119 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6120 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6121
6122 // up when pressure becomes 0, hover restored
6123 processPressure(mapper, 0);
6124 processSync(mapper);
6125 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6126 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
6127 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6128 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6129
6130 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6131 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6132 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6133 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6134
6135 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6136 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6137 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6138 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6139
6140 // exit hover when pointer goes away
6141 processId(mapper, -1);
6142 processSync(mapper);
6143 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6144 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6145 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6146 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6147}
6148
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08006149TEST_F(MultiTouchInputMapperTest, Process_HandlesTimestamp) {
6150 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6151
6152 addConfigurationProperty("touch.deviceType", "touchScreen");
6153 prepareDisplay(DISPLAY_ORIENTATION_0);
6154 prepareAxes(POSITION);
6155 addMapperAndConfigure(mapper);
6156 NotifyMotionArgs args;
6157
6158 // By default, deviceTimestamp should be zero
6159 processPosition(mapper, 100, 100);
6160 processMTSync(mapper);
6161 processSync(mapper);
6162 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6163 ASSERT_EQ(0U, args.deviceTimestamp);
6164
6165 // Now the timestamp of 1000 is reported by evdev and should appear in MotionArgs
6166 processPosition(mapper, 0, 0);
6167 processTimestamp(mapper, 1000);
6168 processMTSync(mapper);
6169 processSync(mapper);
6170 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6171 ASSERT_EQ(1000U, args.deviceTimestamp);
6172}
6173
Siarhei Vishniakoueaf7acd2018-01-09 12:35:51 -08006174TEST_F(MultiTouchInputMapperTest, WhenMapperIsReset_TimestampIsCleared) {
6175 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6176
6177 addConfigurationProperty("touch.deviceType", "touchScreen");
6178 prepareDisplay(DISPLAY_ORIENTATION_0);
6179 prepareAxes(POSITION);
6180 addMapperAndConfigure(mapper);
6181 NotifyMotionArgs args;
6182
6183 // Send a touch event with a timestamp
6184 processPosition(mapper, 100, 100);
6185 processTimestamp(mapper, 1);
6186 processMTSync(mapper);
6187 processSync(mapper);
6188 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6189 ASSERT_EQ(1U, args.deviceTimestamp);
6190
6191 // Since the data accumulates, and new timestamp has not arrived, deviceTimestamp won't change
6192 processPosition(mapper, 100, 200);
6193 processMTSync(mapper);
6194 processSync(mapper);
6195 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6196 ASSERT_EQ(1U, args.deviceTimestamp);
6197
6198 mapper->reset(/* when */ 0);
6199 // After the mapper is reset, deviceTimestamp should become zero again
6200 processPosition(mapper, 100, 300);
6201 processMTSync(mapper);
6202 processSync(mapper);
6203 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6204 ASSERT_EQ(0U, args.deviceTimestamp);
6205}
6206
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07006207/**
6208 * Set the input device port <--> display port associations, and check that the
6209 * events are routed to the display that matches the display port.
6210 * This can be checked by looking at the displayId of the resulting NotifyMotionArgs.
6211 */
6212TEST_F(MultiTouchInputMapperTest, Configure_AssignsDisplayPort) {
6213 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6214 const std::string usb2 = "USB2";
6215 const uint8_t hdmi1 = 0;
6216 const uint8_t hdmi2 = 1;
6217 const std::string secondaryUniqueId = "uniqueId2";
6218 constexpr ViewportType type = ViewportType::VIEWPORT_EXTERNAL;
6219
6220 addConfigurationProperty("touch.deviceType", "touchScreen");
6221 prepareAxes(POSITION);
6222 addMapperAndConfigure(mapper);
6223
6224 mFakePolicy->addInputPortAssociation(DEVICE_LOCATION, hdmi1);
6225 mFakePolicy->addInputPortAssociation(usb2, hdmi2);
6226
6227 // We are intentionally not adding the viewport for display 1 yet. Since the port association
6228 // for this input device is specified, and the matching viewport is not present,
6229 // the input device should be disabled (at the mapper level).
6230
6231 // Add viewport for display 2 on hdmi2
6232 prepareSecondaryDisplay(type, hdmi2);
6233 // Send a touch event
6234 processPosition(mapper, 100, 100);
6235 processSync(mapper);
6236 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
6237
6238 // Add viewport for display 1 on hdmi1
6239 prepareDisplay(DISPLAY_ORIENTATION_0, hdmi1);
6240 // Send a touch event again
6241 processPosition(mapper, 100, 100);
6242 processSync(mapper);
6243
6244 NotifyMotionArgs args;
6245 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6246 ASSERT_EQ(DISPLAY_ID, args.displayId);
6247}
Michael Wrightd02c5b62014-02-10 15:10:22 -08006248
6249} // namespace android