blob: 84f416869a6e80e7832c0721c3a2e6c24462d0b5 [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;
Arthur Hungc7ad2d02018-12-18 17:41:29 +080060 int32_t mDisplayId;
Michael Wrightd02c5b62014-02-10 15:10:22 -080061
62protected:
63 virtual ~FakePointerController() { }
64
65public:
66 FakePointerController() :
67 mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0),
Arthur Hungc7ad2d02018-12-18 17:41:29 +080068 mButtonState(0), mDisplayId(ADISPLAY_ID_DEFAULT) {
Michael Wrightd02c5b62014-02-10 15:10:22 -080069 }
70
71 void setBounds(float minX, float minY, float maxX, float maxY) {
72 mHaveBounds = true;
73 mMinX = minX;
74 mMinY = minY;
75 mMaxX = maxX;
76 mMaxY = maxY;
77 }
78
Arthur Hungc7ad2d02018-12-18 17:41:29 +080079 void setDisplayId(int32_t displayId) {
80 mDisplayId = displayId;
81 }
82
Michael Wrightd02c5b62014-02-10 15:10:22 -080083 virtual void setPosition(float x, float y) {
84 mX = x;
85 mY = y;
86 }
87
88 virtual void setButtonState(int32_t buttonState) {
89 mButtonState = buttonState;
90 }
91
92 virtual int32_t getButtonState() const {
93 return mButtonState;
94 }
95
96 virtual void getPosition(float* outX, float* outY) const {
97 *outX = mX;
98 *outY = mY;
99 }
100
Arthur Hungc7ad2d02018-12-18 17:41:29 +0800101 virtual int32_t getDisplayId() const {
102 return mDisplayId;
103 }
104
Arthur Hung7c645402019-01-25 17:45:42 +0800105 const std::map<int32_t, std::vector<int32_t>>& getSpots() {
106 return mSpotsByDisplay;
107 }
108
Michael Wrightd02c5b62014-02-10 15:10:22 -0800109private:
110 virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
111 *outMinX = mMinX;
112 *outMinY = mMinY;
113 *outMaxX = mMaxX;
114 *outMaxY = mMaxY;
115 return mHaveBounds;
116 }
117
118 virtual void move(float deltaX, float deltaY) {
119 mX += deltaX;
120 if (mX < mMinX) mX = mMinX;
121 if (mX > mMaxX) mX = mMaxX;
122 mY += deltaY;
123 if (mY < mMinY) mY = mMinY;
124 if (mY > mMaxY) mY = mMaxY;
125 }
126
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100127 virtual void fade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800128 }
129
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100130 virtual void unfade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800131 }
132
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100133 virtual void setPresentation(Presentation) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800134 }
135
Arthur Hung7c645402019-01-25 17:45:42 +0800136 virtual void setSpots(const PointerCoords*, const uint32_t*, BitSet32 spotIdBits,
137 int32_t displayId) {
138 std::vector<int32_t> newSpots;
139 // Add spots for fingers that are down.
140 for (BitSet32 idBits(spotIdBits); !idBits.isEmpty(); ) {
141 uint32_t id = idBits.clearFirstMarkedBit();
142 newSpots.push_back(id);
143 }
144
145 mSpotsByDisplay[displayId] = newSpots;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800146 }
147
148 virtual void clearSpots() {
149 }
Arthur Hung7c645402019-01-25 17:45:42 +0800150
151 std::map<int32_t, std::vector<int32_t>> mSpotsByDisplay;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800152};
153
154
155// --- FakeInputReaderPolicy ---
156
157class FakeInputReaderPolicy : public InputReaderPolicyInterface {
158 InputReaderConfiguration mConfig;
159 KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
160 Vector<InputDeviceInfo> mInputDevices;
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100161 std::vector<DisplayViewport> mViewports;
Jason Gerecke489fda82012-09-07 17:19:40 -0700162 TouchAffineTransformation transform;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800163
164protected:
165 virtual ~FakeInputReaderPolicy() { }
166
167public:
168 FakeInputReaderPolicy() {
169 }
170
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700171 virtual void clearViewports() {
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100172 mViewports.clear();
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100173 mConfig.setDisplayViewports(mViewports);
Santos Cordonfa5cf462017-04-05 10:37:00 -0700174 }
175
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700176 std::optional<DisplayViewport> getDisplayViewportByUniqueId(const std::string& uniqueId) const {
177 return mConfig.getDisplayViewportByUniqueId(uniqueId);
178 }
179 std::optional<DisplayViewport> getDisplayViewportByType(ViewportType type) const {
180 return mConfig.getDisplayViewportByType(type);
181 }
182
183 std::optional<DisplayViewport> getDisplayViewportByPort(uint8_t displayPort) const {
184 return mConfig.getDisplayViewportByPort(displayPort);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700185 }
186
187 void addDisplayViewport(int32_t displayId, int32_t width, int32_t height, int32_t orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700188 const std::string& uniqueId, std::optional<uint8_t> physicalPort,
189 ViewportType viewportType) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700190 const DisplayViewport viewport = createDisplayViewport(displayId, width, height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700191 orientation, uniqueId, physicalPort, viewportType);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700192 mViewports.push_back(viewport);
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100193 mConfig.setDisplayViewports(mViewports);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800194 }
195
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100196 void addExcludedDeviceName(const std::string& deviceName) {
197 mConfig.excludedDeviceNames.push_back(deviceName);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800198 }
199
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700200 void addInputPortAssociation(const std::string& inputPort, uint8_t displayPort) {
201 mConfig.portAssociations.insert({inputPort, displayPort});
202 }
203
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700204 void addDisabledDevice(int32_t deviceId) {
205 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
206 bool currentlyEnabled = index < 0;
207 if (currentlyEnabled) {
208 mConfig.disabledDevices.add(deviceId);
209 }
210 }
211
212 void removeDisabledDevice(int32_t deviceId) {
213 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
214 bool currentlyEnabled = index < 0;
215 if (!currentlyEnabled) {
216 mConfig.disabledDevices.remove(deviceId);
217 }
218 }
219
Michael Wrightd02c5b62014-02-10 15:10:22 -0800220 void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
221 mPointerControllers.add(deviceId, controller);
222 }
223
224 const InputReaderConfiguration* getReaderConfiguration() const {
225 return &mConfig;
226 }
227
228 const Vector<InputDeviceInfo>& getInputDevices() const {
229 return mInputDevices;
230 }
231
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100232 TouchAffineTransformation getTouchAffineTransformation(const std::string& inputDeviceDescriptor,
Jason Gerecke71b16e82014-03-10 09:47:59 -0700233 int32_t surfaceRotation) {
Jason Gerecke489fda82012-09-07 17:19:40 -0700234 return transform;
235 }
236
237 void setTouchAffineTransformation(const TouchAffineTransformation t) {
238 transform = t;
Jason Gerecke12d6baa2014-01-27 18:34:20 -0800239 }
240
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800241 void setPointerCapture(bool enabled) {
242 mConfig.pointerCapture = enabled;
243 }
244
Arthur Hung7c645402019-01-25 17:45:42 +0800245 void setShowTouches(bool enabled) {
246 mConfig.showTouches = enabled;
247 }
248
Michael Wrightd02c5b62014-02-10 15:10:22 -0800249private:
Santos Cordonfa5cf462017-04-05 10:37:00 -0700250 DisplayViewport createDisplayViewport(int32_t displayId, int32_t width, int32_t height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700251 int32_t orientation, const std::string& uniqueId, std::optional<uint8_t> physicalPort,
252 ViewportType type) {
Santos Cordonfa5cf462017-04-05 10:37:00 -0700253 bool isRotated = (orientation == DISPLAY_ORIENTATION_90
254 || orientation == DISPLAY_ORIENTATION_270);
255 DisplayViewport v;
256 v.displayId = displayId;
257 v.orientation = orientation;
258 v.logicalLeft = 0;
259 v.logicalTop = 0;
260 v.logicalRight = isRotated ? height : width;
261 v.logicalBottom = isRotated ? width : height;
262 v.physicalLeft = 0;
263 v.physicalTop = 0;
264 v.physicalRight = isRotated ? height : width;
265 v.physicalBottom = isRotated ? width : height;
266 v.deviceWidth = isRotated ? height : width;
267 v.deviceHeight = isRotated ? width : height;
268 v.uniqueId = uniqueId;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700269 v.physicalPort = physicalPort;
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100270 v.type = type;
Santos Cordonfa5cf462017-04-05 10:37:00 -0700271 return v;
272 }
273
Michael Wrightd02c5b62014-02-10 15:10:22 -0800274 virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) {
275 *outConfig = mConfig;
276 }
277
278 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
279 return mPointerControllers.valueFor(deviceId);
280 }
281
282 virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) {
283 mInputDevices = inputDevices;
284 }
285
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100286 virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const InputDeviceIdentifier&) {
Yi Kong9b14ac62018-07-17 13:48:38 -0700287 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800288 }
289
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100290 virtual std::string getDeviceAlias(const InputDeviceIdentifier&) {
291 return "";
Michael Wrightd02c5b62014-02-10 15:10:22 -0800292 }
293};
294
295
296// --- FakeInputListener ---
297
298class FakeInputListener : public InputListenerInterface {
299private:
300 List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue;
301 List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue;
302 List<NotifyKeyArgs> mNotifyKeyArgsQueue;
303 List<NotifyMotionArgs> mNotifyMotionArgsQueue;
304 List<NotifySwitchArgs> mNotifySwitchArgsQueue;
305
306protected:
307 virtual ~FakeInputListener() { }
308
309public:
310 FakeInputListener() {
311 }
312
313 void assertNotifyConfigurationChangedWasCalled(
Yi Kong9b14ac62018-07-17 13:48:38 -0700314 NotifyConfigurationChangedArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800315 ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty())
316 << "Expected notifyConfigurationChanged() to have been called.";
317 if (outEventArgs) {
318 *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin();
319 }
320 mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin());
321 }
322
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700323 void assertNotifyConfigurationChangedWasNotCalled() {
324 ASSERT_TRUE(mNotifyConfigurationChangedArgsQueue.empty())
325 << "Expected notifyConfigurationChanged() to not have been called.";
326 }
327
Michael Wrightd02c5b62014-02-10 15:10:22 -0800328 void assertNotifyDeviceResetWasCalled(
Yi Kong9b14ac62018-07-17 13:48:38 -0700329 NotifyDeviceResetArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800330 ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty())
331 << "Expected notifyDeviceReset() to have been called.";
332 if (outEventArgs) {
333 *outEventArgs = *mNotifyDeviceResetArgsQueue.begin();
334 }
335 mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin());
336 }
337
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700338 void assertNotifyDeviceResetWasNotCalled() {
339 ASSERT_TRUE(mNotifyDeviceResetArgsQueue.empty())
340 << "Expected notifyDeviceReset() to not have been called.";
341 }
342
Yi Kong9b14ac62018-07-17 13:48:38 -0700343 void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800344 ASSERT_FALSE(mNotifyKeyArgsQueue.empty())
345 << "Expected notifyKey() to have been called.";
346 if (outEventArgs) {
347 *outEventArgs = *mNotifyKeyArgsQueue.begin();
348 }
349 mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin());
350 }
351
352 void assertNotifyKeyWasNotCalled() {
353 ASSERT_TRUE(mNotifyKeyArgsQueue.empty())
354 << "Expected notifyKey() to not have been called.";
355 }
356
Yi Kong9b14ac62018-07-17 13:48:38 -0700357 void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800358 ASSERT_FALSE(mNotifyMotionArgsQueue.empty())
359 << "Expected notifyMotion() to have been called.";
360 if (outEventArgs) {
361 *outEventArgs = *mNotifyMotionArgsQueue.begin();
362 }
363 mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin());
364 }
365
366 void assertNotifyMotionWasNotCalled() {
367 ASSERT_TRUE(mNotifyMotionArgsQueue.empty())
368 << "Expected notifyMotion() to not have been called.";
369 }
370
Yi Kong9b14ac62018-07-17 13:48:38 -0700371 void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800372 ASSERT_FALSE(mNotifySwitchArgsQueue.empty())
373 << "Expected notifySwitch() to have been called.";
374 if (outEventArgs) {
375 *outEventArgs = *mNotifySwitchArgsQueue.begin();
376 }
377 mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin());
378 }
379
380private:
381 virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
382 mNotifyConfigurationChangedArgsQueue.push_back(*args);
383 }
384
385 virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) {
386 mNotifyDeviceResetArgsQueue.push_back(*args);
387 }
388
389 virtual void notifyKey(const NotifyKeyArgs* args) {
390 mNotifyKeyArgsQueue.push_back(*args);
391 }
392
393 virtual void notifyMotion(const NotifyMotionArgs* args) {
394 mNotifyMotionArgsQueue.push_back(*args);
395 }
396
397 virtual void notifySwitch(const NotifySwitchArgs* args) {
398 mNotifySwitchArgsQueue.push_back(*args);
399 }
400};
401
402
403// --- FakeEventHub ---
404
405class FakeEventHub : public EventHubInterface {
406 struct KeyInfo {
407 int32_t keyCode;
408 uint32_t flags;
409 };
410
411 struct Device {
412 InputDeviceIdentifier identifier;
413 uint32_t classes;
414 PropertyMap configuration;
415 KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
416 KeyedVector<int, bool> relativeAxes;
417 KeyedVector<int32_t, int32_t> keyCodeStates;
418 KeyedVector<int32_t, int32_t> scanCodeStates;
419 KeyedVector<int32_t, int32_t> switchStates;
420 KeyedVector<int32_t, int32_t> absoluteAxisValue;
421 KeyedVector<int32_t, KeyInfo> keysByScanCode;
422 KeyedVector<int32_t, KeyInfo> keysByUsageCode;
423 KeyedVector<int32_t, bool> leds;
424 Vector<VirtualKeyDefinition> virtualKeys;
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700425 bool enabled;
426
427 status_t enable() {
428 enabled = true;
429 return OK;
430 }
431
432 status_t disable() {
433 enabled = false;
434 return OK;
435 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800436
Chih-Hung Hsieh6ca70ef2016-04-29 16:23:55 -0700437 explicit Device(uint32_t classes) :
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700438 classes(classes), enabled(true) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800439 }
440 };
441
442 KeyedVector<int32_t, Device*> mDevices;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100443 std::vector<std::string> mExcludedDevices;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800444 List<RawEvent> mEvents;
445
446protected:
447 virtual ~FakeEventHub() {
448 for (size_t i = 0; i < mDevices.size(); i++) {
449 delete mDevices.valueAt(i);
450 }
451 }
452
453public:
454 FakeEventHub() { }
455
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100456 void addDevice(int32_t deviceId, const std::string& name, uint32_t classes) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800457 Device* device = new Device(classes);
458 device->identifier.name = name;
459 mDevices.add(deviceId, device);
460
461 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0);
462 }
463
464 void removeDevice(int32_t deviceId) {
465 delete mDevices.valueFor(deviceId);
466 mDevices.removeItem(deviceId);
467
468 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0);
469 }
470
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700471 bool isDeviceEnabled(int32_t deviceId) {
472 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700473 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700474 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
475 return false;
476 }
477 return device->enabled;
478 }
479
480 status_t enableDevice(int32_t deviceId) {
481 status_t result;
482 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700483 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700484 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
485 return BAD_VALUE;
486 }
487 if (device->enabled) {
488 ALOGW("Duplicate call to %s, device %" PRId32 " already enabled", __func__, deviceId);
489 return OK;
490 }
491 result = device->enable();
492 return result;
493 }
494
495 status_t disableDevice(int32_t deviceId) {
496 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700497 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700498 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
499 return BAD_VALUE;
500 }
501 if (!device->enabled) {
502 ALOGW("Duplicate call to %s, device %" PRId32 " already disabled", __func__, deviceId);
503 return OK;
504 }
505 return device->disable();
506 }
507
Michael Wrightd02c5b62014-02-10 15:10:22 -0800508 void finishDeviceScan() {
509 enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0);
510 }
511
512 void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) {
513 Device* device = getDevice(deviceId);
514 device->configuration.addProperty(key, value);
515 }
516
517 void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
518 Device* device = getDevice(deviceId);
519 device->configuration.addAll(configuration);
520 }
521
522 void addAbsoluteAxis(int32_t deviceId, int axis,
523 int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) {
524 Device* device = getDevice(deviceId);
525
526 RawAbsoluteAxisInfo info;
527 info.valid = true;
528 info.minValue = minValue;
529 info.maxValue = maxValue;
530 info.flat = flat;
531 info.fuzz = fuzz;
532 info.resolution = resolution;
533 device->absoluteAxes.add(axis, info);
534 }
535
536 void addRelativeAxis(int32_t deviceId, int32_t axis) {
537 Device* device = getDevice(deviceId);
538 device->relativeAxes.add(axis, true);
539 }
540
541 void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
542 Device* device = getDevice(deviceId);
543 device->keyCodeStates.replaceValueFor(keyCode, state);
544 }
545
546 void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
547 Device* device = getDevice(deviceId);
548 device->scanCodeStates.replaceValueFor(scanCode, state);
549 }
550
551 void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
552 Device* device = getDevice(deviceId);
553 device->switchStates.replaceValueFor(switchCode, state);
554 }
555
556 void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) {
557 Device* device = getDevice(deviceId);
558 device->absoluteAxisValue.replaceValueFor(axis, value);
559 }
560
561 void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
562 int32_t keyCode, uint32_t flags) {
563 Device* device = getDevice(deviceId);
564 KeyInfo info;
565 info.keyCode = keyCode;
566 info.flags = flags;
567 if (scanCode) {
568 device->keysByScanCode.add(scanCode, info);
569 }
570 if (usageCode) {
571 device->keysByUsageCode.add(usageCode, info);
572 }
573 }
574
575 void addLed(int32_t deviceId, int32_t led, bool initialState) {
576 Device* device = getDevice(deviceId);
577 device->leds.add(led, initialState);
578 }
579
580 bool getLedState(int32_t deviceId, int32_t led) {
581 Device* device = getDevice(deviceId);
582 return device->leds.valueFor(led);
583 }
584
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100585 std::vector<std::string>& getExcludedDevices() {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800586 return mExcludedDevices;
587 }
588
589 void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) {
590 Device* device = getDevice(deviceId);
591 device->virtualKeys.push(definition);
592 }
593
594 void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
595 int32_t code, int32_t value) {
596 RawEvent event;
597 event.when = when;
598 event.deviceId = deviceId;
599 event.type = type;
600 event.code = code;
601 event.value = value;
602 mEvents.push_back(event);
603
604 if (type == EV_ABS) {
605 setAbsoluteAxisValue(deviceId, code, value);
606 }
607 }
608
609 void assertQueueIsEmpty() {
610 ASSERT_EQ(size_t(0), mEvents.size())
611 << "Expected the event queue to be empty (fully consumed).";
612 }
613
614private:
615 Device* getDevice(int32_t deviceId) const {
616 ssize_t index = mDevices.indexOfKey(deviceId);
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100617 return index >= 0 ? mDevices.valueAt(index) : nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800618 }
619
620 virtual uint32_t getDeviceClasses(int32_t deviceId) const {
621 Device* device = getDevice(deviceId);
622 return device ? device->classes : 0;
623 }
624
625 virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
626 Device* device = getDevice(deviceId);
627 return device ? device->identifier : InputDeviceIdentifier();
628 }
629
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100630 virtual int32_t getDeviceControllerNumber(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800631 return 0;
632 }
633
634 virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
635 Device* device = getDevice(deviceId);
636 if (device) {
637 *outConfiguration = device->configuration;
638 }
639 }
640
641 virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
642 RawAbsoluteAxisInfo* outAxisInfo) const {
643 Device* device = getDevice(deviceId);
644 if (device) {
645 ssize_t index = device->absoluteAxes.indexOfKey(axis);
646 if (index >= 0) {
647 *outAxisInfo = device->absoluteAxes.valueAt(index);
648 return OK;
649 }
650 }
651 outAxisInfo->clear();
652 return -1;
653 }
654
655 virtual bool hasRelativeAxis(int32_t deviceId, int axis) const {
656 Device* device = getDevice(deviceId);
657 if (device) {
658 return device->relativeAxes.indexOfKey(axis) >= 0;
659 }
660 return false;
661 }
662
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100663 virtual bool hasInputProperty(int32_t, int) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800664 return false;
665 }
666
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700667 virtual status_t mapKey(int32_t deviceId,
668 int32_t scanCode, int32_t usageCode, int32_t metaState,
669 int32_t* outKeycode, int32_t *outMetaState, uint32_t* outFlags) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800670 Device* device = getDevice(deviceId);
671 if (device) {
672 const KeyInfo* key = getKey(device, scanCode, usageCode);
673 if (key) {
674 if (outKeycode) {
675 *outKeycode = key->keyCode;
676 }
677 if (outFlags) {
678 *outFlags = key->flags;
679 }
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700680 if (outMetaState) {
681 *outMetaState = metaState;
682 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800683 return OK;
684 }
685 }
686 return NAME_NOT_FOUND;
687 }
688
689 const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const {
690 if (usageCode) {
691 ssize_t index = device->keysByUsageCode.indexOfKey(usageCode);
692 if (index >= 0) {
693 return &device->keysByUsageCode.valueAt(index);
694 }
695 }
696 if (scanCode) {
697 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
698 if (index >= 0) {
699 return &device->keysByScanCode.valueAt(index);
700 }
701 }
Yi Kong9b14ac62018-07-17 13:48:38 -0700702 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800703 }
704
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100705 virtual status_t mapAxis(int32_t, int32_t, AxisInfo*) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800706 return NAME_NOT_FOUND;
707 }
708
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100709 virtual void setExcludedDevices(const std::vector<std::string>& devices) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800710 mExcludedDevices = devices;
711 }
712
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100713 virtual size_t getEvents(int, RawEvent* buffer, size_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800714 if (mEvents.empty()) {
715 return 0;
716 }
717
718 *buffer = *mEvents.begin();
719 mEvents.erase(mEvents.begin());
720 return 1;
721 }
722
Siarhei Vishniakouadd89292018-12-13 19:23:36 -0800723 virtual std::vector<TouchVideoFrame> getVideoFrames(int32_t deviceId) {
724 return {};
725 }
726
Michael Wrightd02c5b62014-02-10 15:10:22 -0800727 virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
728 Device* device = getDevice(deviceId);
729 if (device) {
730 ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
731 if (index >= 0) {
732 return device->scanCodeStates.valueAt(index);
733 }
734 }
735 return AKEY_STATE_UNKNOWN;
736 }
737
738 virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const {
739 Device* device = getDevice(deviceId);
740 if (device) {
741 ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
742 if (index >= 0) {
743 return device->keyCodeStates.valueAt(index);
744 }
745 }
746 return AKEY_STATE_UNKNOWN;
747 }
748
749 virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const {
750 Device* device = getDevice(deviceId);
751 if (device) {
752 ssize_t index = device->switchStates.indexOfKey(sw);
753 if (index >= 0) {
754 return device->switchStates.valueAt(index);
755 }
756 }
757 return AKEY_STATE_UNKNOWN;
758 }
759
760 virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis,
761 int32_t* outValue) const {
762 Device* device = getDevice(deviceId);
763 if (device) {
764 ssize_t index = device->absoluteAxisValue.indexOfKey(axis);
765 if (index >= 0) {
766 *outValue = device->absoluteAxisValue.valueAt(index);
767 return OK;
768 }
769 }
770 *outValue = 0;
771 return -1;
772 }
773
774 virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
775 uint8_t* outFlags) const {
776 bool result = false;
777 Device* device = getDevice(deviceId);
778 if (device) {
779 for (size_t i = 0; i < numCodes; i++) {
780 for (size_t j = 0; j < device->keysByScanCode.size(); j++) {
781 if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) {
782 outFlags[i] = 1;
783 result = true;
784 }
785 }
786 for (size_t j = 0; j < device->keysByUsageCode.size(); j++) {
787 if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) {
788 outFlags[i] = 1;
789 result = true;
790 }
791 }
792 }
793 }
794 return result;
795 }
796
797 virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const {
798 Device* device = getDevice(deviceId);
799 if (device) {
800 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
801 return index >= 0;
802 }
803 return false;
804 }
805
806 virtual bool hasLed(int32_t deviceId, int32_t led) const {
807 Device* device = getDevice(deviceId);
808 return device && device->leds.indexOfKey(led) >= 0;
809 }
810
811 virtual void setLedState(int32_t deviceId, int32_t led, bool on) {
812 Device* device = getDevice(deviceId);
813 if (device) {
814 ssize_t index = device->leds.indexOfKey(led);
815 if (index >= 0) {
816 device->leds.replaceValueAt(led, on);
817 } else {
818 ADD_FAILURE()
819 << "Attempted to set the state of an LED that the EventHub declared "
820 "was not present. led=" << led;
821 }
822 }
823 }
824
825 virtual void getVirtualKeyDefinitions(int32_t deviceId,
826 Vector<VirtualKeyDefinition>& outVirtualKeys) const {
827 outVirtualKeys.clear();
828
829 Device* device = getDevice(deviceId);
830 if (device) {
831 outVirtualKeys.appendVector(device->virtualKeys);
832 }
833 }
834
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100835 virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t) const {
Yi Kong9b14ac62018-07-17 13:48:38 -0700836 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800837 }
838
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100839 virtual bool setKeyboardLayoutOverlay(int32_t, const sp<KeyCharacterMap>&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800840 return false;
841 }
842
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100843 virtual void vibrate(int32_t, nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800844 }
845
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100846 virtual void cancelVibrate(int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800847 }
848
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100849 virtual bool isExternal(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800850 return false;
851 }
852
Siarhei Vishniakouf93fcf42017-11-22 16:00:14 -0800853 virtual void dump(std::string&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800854 }
855
856 virtual void monitor() {
857 }
858
859 virtual void requestReopenDevices() {
860 }
861
862 virtual void wake() {
863 }
864};
865
866
867// --- FakeInputReaderContext ---
868
869class FakeInputReaderContext : public InputReaderContext {
870 sp<EventHubInterface> mEventHub;
871 sp<InputReaderPolicyInterface> mPolicy;
872 sp<InputListenerInterface> mListener;
873 int32_t mGlobalMetaState;
874 bool mUpdateGlobalMetaStateWasCalled;
875 int32_t mGeneration;
Prabir Pradhan42611e02018-11-27 14:04:02 -0800876 uint32_t mNextSequenceNum;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800877
878public:
879 FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
880 const sp<InputReaderPolicyInterface>& policy,
881 const sp<InputListenerInterface>& listener) :
882 mEventHub(eventHub), mPolicy(policy), mListener(listener),
Prabir Pradhan42611e02018-11-27 14:04:02 -0800883 mGlobalMetaState(0), mNextSequenceNum(1) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800884 }
885
886 virtual ~FakeInputReaderContext() { }
887
888 void assertUpdateGlobalMetaStateWasCalled() {
889 ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
890 << "Expected updateGlobalMetaState() to have been called.";
891 mUpdateGlobalMetaStateWasCalled = false;
892 }
893
894 void setGlobalMetaState(int32_t state) {
895 mGlobalMetaState = state;
896 }
897
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800898 uint32_t getGeneration() {
899 return mGeneration;
900 }
901
Michael Wrightd02c5b62014-02-10 15:10:22 -0800902private:
903 virtual void updateGlobalMetaState() {
904 mUpdateGlobalMetaStateWasCalled = true;
905 }
906
907 virtual int32_t getGlobalMetaState() {
908 return mGlobalMetaState;
909 }
910
911 virtual EventHubInterface* getEventHub() {
912 return mEventHub.get();
913 }
914
915 virtual InputReaderPolicyInterface* getPolicy() {
916 return mPolicy.get();
917 }
918
919 virtual InputListenerInterface* getListener() {
920 return mListener.get();
921 }
922
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100923 virtual void disableVirtualKeysUntil(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800924 }
925
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100926 virtual bool shouldDropVirtualKey(nsecs_t, InputDevice*, int32_t, int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800927 return false;
928 }
929
930 virtual void fadePointer() {
931 }
932
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100933 virtual void requestTimeoutAtTime(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800934 }
935
936 virtual int32_t bumpGeneration() {
937 return ++mGeneration;
938 }
Michael Wright842500e2015-03-13 17:32:02 -0700939
940 virtual void getExternalStylusDevices(Vector<InputDeviceInfo>& outDevices) {
941
942 }
943
944 virtual void dispatchExternalStylusState(const StylusState&) {
945
946 }
Prabir Pradhan42611e02018-11-27 14:04:02 -0800947
948 virtual uint32_t getNextSequenceNum() {
949 return mNextSequenceNum++;
950 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800951};
952
953
954// --- FakeInputMapper ---
955
956class FakeInputMapper : public InputMapper {
957 uint32_t mSources;
958 int32_t mKeyboardType;
959 int32_t mMetaState;
960 KeyedVector<int32_t, int32_t> mKeyCodeStates;
961 KeyedVector<int32_t, int32_t> mScanCodeStates;
962 KeyedVector<int32_t, int32_t> mSwitchStates;
963 Vector<int32_t> mSupportedKeyCodes;
964 RawEvent mLastEvent;
965
966 bool mConfigureWasCalled;
967 bool mResetWasCalled;
968 bool mProcessWasCalled;
969
970public:
971 FakeInputMapper(InputDevice* device, uint32_t sources) :
972 InputMapper(device),
973 mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
974 mMetaState(0),
975 mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
976 }
977
978 virtual ~FakeInputMapper() { }
979
980 void setKeyboardType(int32_t keyboardType) {
981 mKeyboardType = keyboardType;
982 }
983
984 void setMetaState(int32_t metaState) {
985 mMetaState = metaState;
986 }
987
988 void assertConfigureWasCalled() {
989 ASSERT_TRUE(mConfigureWasCalled)
990 << "Expected configure() to have been called.";
991 mConfigureWasCalled = false;
992 }
993
994 void assertResetWasCalled() {
995 ASSERT_TRUE(mResetWasCalled)
996 << "Expected reset() to have been called.";
997 mResetWasCalled = false;
998 }
999
Yi Kong9b14ac62018-07-17 13:48:38 -07001000 void assertProcessWasCalled(RawEvent* outLastEvent = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001001 ASSERT_TRUE(mProcessWasCalled)
1002 << "Expected process() to have been called.";
1003 if (outLastEvent) {
1004 *outLastEvent = mLastEvent;
1005 }
1006 mProcessWasCalled = false;
1007 }
1008
1009 void setKeyCodeState(int32_t keyCode, int32_t state) {
1010 mKeyCodeStates.replaceValueFor(keyCode, state);
1011 }
1012
1013 void setScanCodeState(int32_t scanCode, int32_t state) {
1014 mScanCodeStates.replaceValueFor(scanCode, state);
1015 }
1016
1017 void setSwitchState(int32_t switchCode, int32_t state) {
1018 mSwitchStates.replaceValueFor(switchCode, state);
1019 }
1020
1021 void addSupportedKeyCode(int32_t keyCode) {
1022 mSupportedKeyCodes.add(keyCode);
1023 }
1024
1025private:
1026 virtual uint32_t getSources() {
1027 return mSources;
1028 }
1029
1030 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
1031 InputMapper::populateDeviceInfo(deviceInfo);
1032
1033 if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
1034 deviceInfo->setKeyboardType(mKeyboardType);
1035 }
1036 }
1037
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001038 virtual void configure(nsecs_t, const InputReaderConfiguration*, uint32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001039 mConfigureWasCalled = true;
1040 }
1041
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001042 virtual void reset(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001043 mResetWasCalled = true;
1044 }
1045
1046 virtual void process(const RawEvent* rawEvent) {
1047 mLastEvent = *rawEvent;
1048 mProcessWasCalled = true;
1049 }
1050
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001051 virtual int32_t getKeyCodeState(uint32_t, int32_t keyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001052 ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
1053 return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1054 }
1055
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001056 virtual int32_t getScanCodeState(uint32_t, int32_t scanCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001057 ssize_t index = mScanCodeStates.indexOfKey(scanCode);
1058 return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1059 }
1060
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001061 virtual int32_t getSwitchState(uint32_t, int32_t switchCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001062 ssize_t index = mSwitchStates.indexOfKey(switchCode);
1063 return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1064 }
1065
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001066 virtual bool markSupportedKeyCodes(uint32_t, size_t numCodes,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001067 const int32_t* keyCodes, uint8_t* outFlags) {
1068 bool result = false;
1069 for (size_t i = 0; i < numCodes; i++) {
1070 for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
1071 if (keyCodes[i] == mSupportedKeyCodes[j]) {
1072 outFlags[i] = 1;
1073 result = true;
1074 }
1075 }
1076 }
1077 return result;
1078 }
1079
1080 virtual int32_t getMetaState() {
1081 return mMetaState;
1082 }
1083
1084 virtual void fadePointer() {
1085 }
1086};
1087
1088
1089// --- InstrumentedInputReader ---
1090
1091class InstrumentedInputReader : public InputReader {
1092 InputDevice* mNextDevice;
1093
1094public:
1095 InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
1096 const sp<InputReaderPolicyInterface>& policy,
1097 const sp<InputListenerInterface>& listener) :
1098 InputReader(eventHub, policy, listener),
Yi Kong9b14ac62018-07-17 13:48:38 -07001099 mNextDevice(nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001100 }
1101
1102 virtual ~InstrumentedInputReader() {
1103 if (mNextDevice) {
1104 delete mNextDevice;
1105 }
1106 }
1107
1108 void setNextDevice(InputDevice* device) {
1109 mNextDevice = device;
1110 }
1111
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001112 InputDevice* newDevice(int32_t deviceId, int32_t controllerNumber, const std::string& name,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001113 uint32_t classes) {
1114 InputDeviceIdentifier identifier;
1115 identifier.name = name;
1116 int32_t generation = deviceId + 1;
1117 return new InputDevice(&mContext, deviceId, generation, controllerNumber, identifier,
1118 classes);
1119 }
1120
1121protected:
1122 virtual InputDevice* createDeviceLocked(int32_t deviceId, int32_t controllerNumber,
1123 const InputDeviceIdentifier& identifier, uint32_t classes) {
1124 if (mNextDevice) {
1125 InputDevice* device = mNextDevice;
Yi Kong9b14ac62018-07-17 13:48:38 -07001126 mNextDevice = nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001127 return device;
1128 }
1129 return InputReader::createDeviceLocked(deviceId, controllerNumber, identifier, classes);
1130 }
1131
1132 friend class InputReaderTest;
1133};
1134
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001135// --- InputReaderPolicyTest ---
1136class InputReaderPolicyTest : public testing::Test {
Siarhei Vishniakoucd7ac1e2018-10-15 13:39:50 -07001137protected:
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001138 sp<FakeInputReaderPolicy> mFakePolicy;
1139
1140 virtual void SetUp() {
1141 mFakePolicy = new FakeInputReaderPolicy();
1142 }
1143 virtual void TearDown() {
1144 mFakePolicy.clear();
1145 }
1146};
1147
1148/**
1149 * Check that empty set of viewports is an acceptable configuration.
1150 * Also try to get internal viewport two different ways - by type and by uniqueId.
1151 *
1152 * There will be confusion if two viewports with empty uniqueId and identical type are present.
1153 * Such configuration is not currently allowed.
1154 */
1155TEST_F(InputReaderPolicyTest, Viewports_GetCleared) {
Siarhei Vishniakoucd7ac1e2018-10-15 13:39:50 -07001156 static const std::string uniqueId = "local:0";
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001157
1158 // We didn't add any viewports yet, so there shouldn't be any.
1159 std::optional<DisplayViewport> internalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001160 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001161 ASSERT_FALSE(internalViewport);
1162
1163 // Add an internal viewport, then clear it
1164 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001165 DISPLAY_ORIENTATION_0, uniqueId, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001166
1167 // Check matching by uniqueId
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001168 internalViewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001169 ASSERT_TRUE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001170 ASSERT_EQ(ViewportType::VIEWPORT_INTERNAL, internalViewport->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001171
1172 // Check matching by viewport type
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001173 internalViewport = mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001174 ASSERT_TRUE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001175 ASSERT_EQ(uniqueId, internalViewport->uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001176
1177 mFakePolicy->clearViewports();
1178 // Make sure nothing is found after clear
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001179 internalViewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001180 ASSERT_FALSE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001181 internalViewport = mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001182 ASSERT_FALSE(internalViewport);
1183}
1184
1185TEST_F(InputReaderPolicyTest, Viewports_GetByType) {
1186 const std::string internalUniqueId = "local:0";
1187 const std::string externalUniqueId = "local:1";
1188 const std::string virtualUniqueId1 = "virtual:2";
1189 const std::string virtualUniqueId2 = "virtual:3";
1190 constexpr int32_t virtualDisplayId1 = 2;
1191 constexpr int32_t virtualDisplayId2 = 3;
1192
1193 // Add an internal viewport
1194 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001195 DISPLAY_ORIENTATION_0, internalUniqueId, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001196 // Add an external viewport
1197 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001198 DISPLAY_ORIENTATION_0, externalUniqueId, NO_PORT, ViewportType::VIEWPORT_EXTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001199 // Add an virtual viewport
1200 mFakePolicy->addDisplayViewport(virtualDisplayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001201 DISPLAY_ORIENTATION_0, virtualUniqueId1, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001202 // Add another virtual viewport
1203 mFakePolicy->addDisplayViewport(virtualDisplayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001204 DISPLAY_ORIENTATION_0, virtualUniqueId2, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001205
1206 // Check matching by type for internal
1207 std::optional<DisplayViewport> internalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001208 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001209 ASSERT_TRUE(internalViewport);
1210 ASSERT_EQ(internalUniqueId, internalViewport->uniqueId);
1211
1212 // Check matching by type for external
1213 std::optional<DisplayViewport> externalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001214 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_EXTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001215 ASSERT_TRUE(externalViewport);
1216 ASSERT_EQ(externalUniqueId, externalViewport->uniqueId);
1217
1218 // Check matching by uniqueId for virtual viewport #1
1219 std::optional<DisplayViewport> virtualViewport1 =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001220 mFakePolicy->getDisplayViewportByUniqueId(virtualUniqueId1);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001221 ASSERT_TRUE(virtualViewport1);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001222 ASSERT_EQ(ViewportType::VIEWPORT_VIRTUAL, virtualViewport1->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001223 ASSERT_EQ(virtualUniqueId1, virtualViewport1->uniqueId);
1224 ASSERT_EQ(virtualDisplayId1, virtualViewport1->displayId);
1225
1226 // Check matching by uniqueId for virtual viewport #2
1227 std::optional<DisplayViewport> virtualViewport2 =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001228 mFakePolicy->getDisplayViewportByUniqueId(virtualUniqueId2);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001229 ASSERT_TRUE(virtualViewport2);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001230 ASSERT_EQ(ViewportType::VIEWPORT_VIRTUAL, virtualViewport2->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001231 ASSERT_EQ(virtualUniqueId2, virtualViewport2->uniqueId);
1232 ASSERT_EQ(virtualDisplayId2, virtualViewport2->displayId);
1233}
1234
1235
1236/**
1237 * We can have 2 viewports of the same kind. We can distinguish them by uniqueId, and confirm
1238 * that lookup works by checking display id.
1239 * Check that 2 viewports of each kind is possible, for all existing viewport types.
1240 */
1241TEST_F(InputReaderPolicyTest, Viewports_TwoOfSameType) {
1242 const std::string uniqueId1 = "uniqueId1";
1243 const std::string uniqueId2 = "uniqueId2";
1244 constexpr int32_t displayId1 = 2;
1245 constexpr int32_t displayId2 = 3;
1246
1247 std::vector<ViewportType> types = {ViewportType::VIEWPORT_INTERNAL,
1248 ViewportType::VIEWPORT_EXTERNAL, ViewportType::VIEWPORT_VIRTUAL};
1249 for (const ViewportType& type : types) {
1250 mFakePolicy->clearViewports();
1251 // Add a viewport
1252 mFakePolicy->addDisplayViewport(displayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001253 DISPLAY_ORIENTATION_0, uniqueId1, NO_PORT, type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001254 // Add another viewport
1255 mFakePolicy->addDisplayViewport(displayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001256 DISPLAY_ORIENTATION_0, uniqueId2, NO_PORT, type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001257
1258 // Check that correct display viewport was returned by comparing the display IDs.
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001259 std::optional<DisplayViewport> viewport1 =
1260 mFakePolicy->getDisplayViewportByUniqueId(uniqueId1);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001261 ASSERT_TRUE(viewport1);
1262 ASSERT_EQ(displayId1, viewport1->displayId);
1263 ASSERT_EQ(type, viewport1->type);
1264
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001265 std::optional<DisplayViewport> viewport2 =
1266 mFakePolicy->getDisplayViewportByUniqueId(uniqueId2);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001267 ASSERT_TRUE(viewport2);
1268 ASSERT_EQ(displayId2, viewport2->displayId);
1269 ASSERT_EQ(type, viewport2->type);
1270
1271 // When there are multiple viewports of the same kind, and uniqueId is not specified
1272 // in the call to getDisplayViewport, then that situation is not supported.
1273 // The viewports can be stored in any order, so we cannot rely on the order, since that
1274 // is just implementation detail.
1275 // However, we can check that it still returns *a* viewport, we just cannot assert
1276 // which one specifically is returned.
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001277 std::optional<DisplayViewport> someViewport = mFakePolicy->getDisplayViewportByType(type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001278 ASSERT_TRUE(someViewport);
1279 }
1280}
Michael Wrightd02c5b62014-02-10 15:10:22 -08001281
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001282/**
1283 * Check getDisplayViewportByPort
1284 */
1285TEST_F(InputReaderPolicyTest, Viewports_GetByPort) {
1286 constexpr ViewportType type = ViewportType::VIEWPORT_EXTERNAL;
1287 const std::string uniqueId1 = "uniqueId1";
1288 const std::string uniqueId2 = "uniqueId2";
1289 constexpr int32_t displayId1 = 1;
1290 constexpr int32_t displayId2 = 2;
1291 const uint8_t hdmi1 = 0;
1292 const uint8_t hdmi2 = 1;
1293 const uint8_t hdmi3 = 2;
1294
1295 mFakePolicy->clearViewports();
1296 // Add a viewport that's associated with some display port that's not of interest.
1297 mFakePolicy->addDisplayViewport(displayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1298 DISPLAY_ORIENTATION_0, uniqueId1, hdmi3, type);
1299 // Add another viewport, connected to HDMI1 port
1300 mFakePolicy->addDisplayViewport(displayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1301 DISPLAY_ORIENTATION_0, uniqueId2, hdmi1, type);
1302
1303 // Check that correct display viewport was returned by comparing the display ports.
1304 std::optional<DisplayViewport> hdmi1Viewport = mFakePolicy->getDisplayViewportByPort(hdmi1);
1305 ASSERT_TRUE(hdmi1Viewport);
1306 ASSERT_EQ(displayId2, hdmi1Viewport->displayId);
1307 ASSERT_EQ(uniqueId2, hdmi1Viewport->uniqueId);
1308
1309 // Check that we can still get the same viewport using the uniqueId
1310 hdmi1Viewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId2);
1311 ASSERT_TRUE(hdmi1Viewport);
1312 ASSERT_EQ(displayId2, hdmi1Viewport->displayId);
1313 ASSERT_EQ(uniqueId2, hdmi1Viewport->uniqueId);
1314 ASSERT_EQ(type, hdmi1Viewport->type);
1315
1316 // Check that we cannot find a port with "HDMI2", because we never added one
1317 std::optional<DisplayViewport> hdmi2Viewport = mFakePolicy->getDisplayViewportByPort(hdmi2);
1318 ASSERT_FALSE(hdmi2Viewport);
1319}
1320
Michael Wrightd02c5b62014-02-10 15:10:22 -08001321// --- InputReaderTest ---
1322
1323class InputReaderTest : public testing::Test {
1324protected:
1325 sp<FakeInputListener> mFakeListener;
1326 sp<FakeInputReaderPolicy> mFakePolicy;
1327 sp<FakeEventHub> mFakeEventHub;
1328 sp<InstrumentedInputReader> mReader;
1329
1330 virtual void SetUp() {
1331 mFakeEventHub = new FakeEventHub();
1332 mFakePolicy = new FakeInputReaderPolicy();
1333 mFakeListener = new FakeInputListener();
1334
1335 mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener);
1336 }
1337
1338 virtual void TearDown() {
1339 mReader.clear();
1340
1341 mFakeListener.clear();
1342 mFakePolicy.clear();
1343 mFakeEventHub.clear();
1344 }
1345
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001346 void addDevice(int32_t deviceId, const std::string& name, uint32_t classes,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001347 const PropertyMap* configuration) {
1348 mFakeEventHub->addDevice(deviceId, name, classes);
1349
1350 if (configuration) {
1351 mFakeEventHub->addConfigurationMap(deviceId, configuration);
1352 }
1353 mFakeEventHub->finishDeviceScan();
1354 mReader->loopOnce();
1355 mReader->loopOnce();
1356 mFakeEventHub->assertQueueIsEmpty();
1357 }
1358
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001359 void disableDevice(int32_t deviceId, InputDevice* device) {
1360 mFakePolicy->addDisabledDevice(deviceId);
1361 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1362 }
1363
1364 void enableDevice(int32_t deviceId, InputDevice* device) {
1365 mFakePolicy->removeDisabledDevice(deviceId);
1366 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1367 }
1368
1369 void configureDevice(uint32_t changes, InputDevice* device) {
1370 device->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1371 }
1372
Michael Wrightd02c5b62014-02-10 15:10:22 -08001373 FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, int32_t controllerNumber,
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001374 const std::string& name, uint32_t classes, uint32_t sources,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001375 const PropertyMap* configuration) {
1376 InputDevice* device = mReader->newDevice(deviceId, controllerNumber, name, classes);
1377 FakeInputMapper* mapper = new FakeInputMapper(device, sources);
1378 device->addMapper(mapper);
1379 mReader->setNextDevice(device);
1380 addDevice(deviceId, name, classes, configuration);
1381 return mapper;
1382 }
1383};
1384
1385TEST_F(InputReaderTest, GetInputDevices) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001386 ASSERT_NO_FATAL_FAILURE(addDevice(1, "keyboard",
Yi Kong9b14ac62018-07-17 13:48:38 -07001387 INPUT_DEVICE_CLASS_KEYBOARD, nullptr));
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001388 ASSERT_NO_FATAL_FAILURE(addDevice(2, "ignored",
Yi Kong9b14ac62018-07-17 13:48:38 -07001389 0, nullptr)); // no classes so device will be ignored
Michael Wrightd02c5b62014-02-10 15:10:22 -08001390
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001391
Michael Wrightd02c5b62014-02-10 15:10:22 -08001392 Vector<InputDeviceInfo> inputDevices;
1393 mReader->getInputDevices(inputDevices);
1394
1395 ASSERT_EQ(1U, inputDevices.size());
1396 ASSERT_EQ(1, inputDevices[0].getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001397 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001398 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1399 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1400 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1401
1402 // Should also have received a notification describing the new input devices.
1403 inputDevices = mFakePolicy->getInputDevices();
1404 ASSERT_EQ(1U, inputDevices.size());
1405 ASSERT_EQ(1, inputDevices[0].getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001406 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001407 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1408 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1409 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1410}
1411
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001412TEST_F(InputReaderTest, WhenEnabledChanges_SendsDeviceResetNotification) {
1413 constexpr int32_t deviceId = 1;
1414 constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001415 InputDevice* device = mReader->newDevice(deviceId, 0, "fake", deviceClass);
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001416 // Must add at least one mapper or the device will be ignored!
1417 FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_KEYBOARD);
1418 device->addMapper(mapper);
1419 mReader->setNextDevice(device);
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001420 addDevice(deviceId, "fake", deviceClass, nullptr);
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001421
Yi Kong9b14ac62018-07-17 13:48:38 -07001422 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(nullptr));
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001423
1424 NotifyDeviceResetArgs resetArgs;
1425 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1426 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1427 ASSERT_EQ(deviceId, resetArgs.deviceId);
1428
1429 ASSERT_EQ(device->isEnabled(), true);
1430 disableDevice(deviceId, device);
1431 mReader->loopOnce();
1432
1433 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1434 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1435 ASSERT_EQ(deviceId, resetArgs.deviceId);
1436 ASSERT_EQ(device->isEnabled(), false);
1437
1438 disableDevice(deviceId, device);
1439 mReader->loopOnce();
1440 mFakeListener->assertNotifyDeviceResetWasNotCalled();
1441 mFakeListener->assertNotifyConfigurationChangedWasNotCalled();
1442 ASSERT_EQ(device->isEnabled(), false);
1443
1444 enableDevice(deviceId, device);
1445 mReader->loopOnce();
1446 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1447 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1448 ASSERT_EQ(deviceId, resetArgs.deviceId);
1449 ASSERT_EQ(device->isEnabled(), true);
1450}
1451
Michael Wrightd02c5b62014-02-10 15:10:22 -08001452TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001453 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001454 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001455 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001456 mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1457
1458 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
1459 AINPUT_SOURCE_ANY, AKEYCODE_A))
1460 << "Should return unknown when the device id is >= 0 but unknown.";
1461
1462 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
1463 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1464 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1465
1466 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
1467 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1468 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1469
1470 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
1471 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1472 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1473
1474 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
1475 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1476 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1477}
1478
1479TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001480 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001481 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001482 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001483 mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
1484
1485 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
1486 AINPUT_SOURCE_ANY, KEY_A))
1487 << "Should return unknown when the device id is >= 0 but unknown.";
1488
1489 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
1490 AINPUT_SOURCE_TRACKBALL, KEY_A))
1491 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1492
1493 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
1494 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1495 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1496
1497 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
1498 AINPUT_SOURCE_TRACKBALL, KEY_A))
1499 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1500
1501 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
1502 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1503 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1504}
1505
1506TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001507 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001508 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001509 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001510 mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
1511
1512 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
1513 AINPUT_SOURCE_ANY, SW_LID))
1514 << "Should return unknown when the device id is >= 0 but unknown.";
1515
1516 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
1517 AINPUT_SOURCE_TRACKBALL, SW_LID))
1518 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1519
1520 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
1521 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1522 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1523
1524 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
1525 AINPUT_SOURCE_TRACKBALL, SW_LID))
1526 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1527
1528 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
1529 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1530 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1531}
1532
1533TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001534 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001535 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001536 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001537
Michael Wrightd02c5b62014-02-10 15:10:22 -08001538 mapper->addSupportedKeyCode(AKEYCODE_A);
1539 mapper->addSupportedKeyCode(AKEYCODE_B);
1540
1541 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1542 uint8_t flags[4] = { 0, 0, 0, 1 };
1543
1544 ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
1545 << "Should return false when device id is >= 0 but unknown.";
1546 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1547
1548 flags[3] = 1;
1549 ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1550 << "Should return false when device id is valid but the sources are not supported by the device.";
1551 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1552
1553 flags[3] = 1;
1554 ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1555 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1556 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1557
1558 flags[3] = 1;
1559 ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1560 << "Should return false when the device id is < 0 but the sources are not supported by any device.";
1561 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1562
1563 flags[3] = 1;
1564 ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1565 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1566 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1567}
1568
1569TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001570 addDevice(1, "ignored", INPUT_DEVICE_CLASS_KEYBOARD, nullptr);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001571
1572 NotifyConfigurationChangedArgs args;
1573
1574 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args));
1575 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1576}
1577
1578TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001579 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001580 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001581 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001582
1583 mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1);
1584 mReader->loopOnce();
1585 ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
1586
1587 RawEvent event;
1588 ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
1589 ASSERT_EQ(0, event.when);
1590 ASSERT_EQ(1, event.deviceId);
1591 ASSERT_EQ(EV_KEY, event.type);
1592 ASSERT_EQ(KEY_A, event.code);
1593 ASSERT_EQ(1, event.value);
1594}
1595
Prabir Pradhan42611e02018-11-27 14:04:02 -08001596TEST_F(InputReaderTest, DeviceReset_IncrementsSequenceNumber) {
1597 constexpr int32_t deviceId = 1;
1598 constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
1599 InputDevice* device = mReader->newDevice(deviceId, 0, "fake", deviceClass);
1600 // Must add at least one mapper or the device will be ignored!
1601 FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_KEYBOARD);
1602 device->addMapper(mapper);
1603 mReader->setNextDevice(device);
1604 addDevice(deviceId, "fake", deviceClass, nullptr);
1605
1606 NotifyDeviceResetArgs resetArgs;
1607 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1608 uint32_t prevSequenceNum = resetArgs.sequenceNum;
1609
1610 disableDevice(deviceId, device);
1611 mReader->loopOnce();
1612 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1613 ASSERT_TRUE(prevSequenceNum < resetArgs.sequenceNum);
1614 prevSequenceNum = resetArgs.sequenceNum;
1615
1616 enableDevice(deviceId, device);
1617 mReader->loopOnce();
1618 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1619 ASSERT_TRUE(prevSequenceNum < resetArgs.sequenceNum);
1620 prevSequenceNum = resetArgs.sequenceNum;
1621
1622 disableDevice(deviceId, device);
1623 mReader->loopOnce();
1624 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1625 ASSERT_TRUE(prevSequenceNum < resetArgs.sequenceNum);
1626 prevSequenceNum = resetArgs.sequenceNum;
1627}
1628
Michael Wrightd02c5b62014-02-10 15:10:22 -08001629
1630// --- InputDeviceTest ---
1631
1632class InputDeviceTest : public testing::Test {
1633protected:
1634 static const char* DEVICE_NAME;
1635 static const int32_t DEVICE_ID;
1636 static const int32_t DEVICE_GENERATION;
1637 static const int32_t DEVICE_CONTROLLER_NUMBER;
1638 static const uint32_t DEVICE_CLASSES;
1639
1640 sp<FakeEventHub> mFakeEventHub;
1641 sp<FakeInputReaderPolicy> mFakePolicy;
1642 sp<FakeInputListener> mFakeListener;
1643 FakeInputReaderContext* mFakeContext;
1644
1645 InputDevice* mDevice;
1646
1647 virtual void SetUp() {
1648 mFakeEventHub = new FakeEventHub();
1649 mFakePolicy = new FakeInputReaderPolicy();
1650 mFakeListener = new FakeInputListener();
1651 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1652
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001653 mFakeEventHub->addDevice(DEVICE_ID, DEVICE_NAME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001654 InputDeviceIdentifier identifier;
1655 identifier.name = DEVICE_NAME;
1656 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1657 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1658 }
1659
1660 virtual void TearDown() {
1661 delete mDevice;
1662
1663 delete mFakeContext;
1664 mFakeListener.clear();
1665 mFakePolicy.clear();
1666 mFakeEventHub.clear();
1667 }
1668};
1669
1670const char* InputDeviceTest::DEVICE_NAME = "device";
1671const int32_t InputDeviceTest::DEVICE_ID = 1;
1672const int32_t InputDeviceTest::DEVICE_GENERATION = 2;
1673const int32_t InputDeviceTest::DEVICE_CONTROLLER_NUMBER = 0;
1674const uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD
1675 | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK;
1676
1677TEST_F(InputDeviceTest, ImmutableProperties) {
1678 ASSERT_EQ(DEVICE_ID, mDevice->getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001679 ASSERT_STREQ(DEVICE_NAME, mDevice->getName().c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001680 ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses());
1681}
1682
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001683TEST_F(InputDeviceTest, WhenDeviceCreated_EnabledIsTrue) {
1684 ASSERT_EQ(mDevice->isEnabled(), true);
1685}
1686
Michael Wrightd02c5b62014-02-10 15:10:22 -08001687TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
1688 // Configuration.
1689 InputReaderConfiguration config;
1690 mDevice->configure(ARBITRARY_TIME, &config, 0);
1691
1692 // Reset.
1693 mDevice->reset(ARBITRARY_TIME);
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_TRUE(mDevice->isIgnored());
1702 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, 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_NONE, info.getKeyboardType());
1709 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
1710
1711 // State queries.
1712 ASSERT_EQ(0, mDevice->getMetaState());
1713
1714 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1715 << "Ignored device should return unknown key code state.";
1716 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1717 << "Ignored device should return unknown scan code state.";
1718 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
1719 << "Ignored device should return unknown switch state.";
1720
1721 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1722 uint8_t flags[2] = { 0, 1 };
1723 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
1724 << "Ignored device should never mark any key codes.";
1725 ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
1726 ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
1727}
1728
1729TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
1730 // Configuration.
1731 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value"));
1732
1733 FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
1734 mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1735 mapper1->setMetaState(AMETA_ALT_ON);
1736 mapper1->addSupportedKeyCode(AKEYCODE_A);
1737 mapper1->addSupportedKeyCode(AKEYCODE_B);
1738 mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1739 mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
1740 mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
1741 mapper1->setScanCodeState(3, AKEY_STATE_UP);
1742 mapper1->setSwitchState(4, AKEY_STATE_DOWN);
1743 mDevice->addMapper(mapper1);
1744
1745 FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
1746 mapper2->setMetaState(AMETA_SHIFT_ON);
1747 mDevice->addMapper(mapper2);
1748
1749 InputReaderConfiguration config;
1750 mDevice->configure(ARBITRARY_TIME, &config, 0);
1751
1752 String8 propertyValue;
1753 ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue))
1754 << "Device should have read configuration during configuration phase.";
1755 ASSERT_STREQ("value", propertyValue.string());
1756
1757 ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
1758 ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
1759
1760 // Reset
1761 mDevice->reset(ARBITRARY_TIME);
1762 ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
1763 ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
1764
1765 NotifyDeviceResetArgs resetArgs;
1766 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1767 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1768 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1769
1770 // Metadata.
1771 ASSERT_FALSE(mDevice->isIgnored());
1772 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
1773
1774 InputDeviceInfo info;
1775 mDevice->getDeviceInfo(&info);
1776 ASSERT_EQ(DEVICE_ID, info.getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001777 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001778 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
1779 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
1780
1781 // State queries.
1782 ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
1783 << "Should query mappers and combine meta states.";
1784
1785 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1786 << "Should return unknown key code state when source not supported.";
1787 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1788 << "Should return unknown scan code state when source not supported.";
1789 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1790 << "Should return unknown switch state when source not supported.";
1791
1792 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
1793 << "Should query mapper when source is supported.";
1794 ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
1795 << "Should query mapper when source is supported.";
1796 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
1797 << "Should query mapper when source is supported.";
1798
1799 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1800 uint8_t flags[4] = { 0, 0, 0, 1 };
1801 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1802 << "Should do nothing when source is unsupported.";
1803 ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
1804 ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
1805 ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
1806 ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
1807
1808 ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
1809 << "Should query mapper when source is supported.";
1810 ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
1811 ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
1812 ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
1813 ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
1814
1815 // Event handling.
1816 RawEvent event;
1817 mDevice->process(&event, 1);
1818
1819 ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
1820 ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
1821}
1822
1823
1824// --- InputMapperTest ---
1825
1826class InputMapperTest : public testing::Test {
1827protected:
1828 static const char* DEVICE_NAME;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001829 static const char* DEVICE_LOCATION;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001830 static const int32_t DEVICE_ID;
1831 static const int32_t DEVICE_GENERATION;
1832 static const int32_t DEVICE_CONTROLLER_NUMBER;
1833 static const uint32_t DEVICE_CLASSES;
1834
1835 sp<FakeEventHub> mFakeEventHub;
1836 sp<FakeInputReaderPolicy> mFakePolicy;
1837 sp<FakeInputListener> mFakeListener;
1838 FakeInputReaderContext* mFakeContext;
1839 InputDevice* mDevice;
1840
1841 virtual void SetUp() {
1842 mFakeEventHub = new FakeEventHub();
1843 mFakePolicy = new FakeInputReaderPolicy();
1844 mFakeListener = new FakeInputListener();
1845 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1846 InputDeviceIdentifier identifier;
1847 identifier.name = DEVICE_NAME;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001848 identifier.location = DEVICE_LOCATION;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001849 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1850 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1851
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001852 mFakeEventHub->addDevice(mDevice->getId(), DEVICE_NAME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001853 }
1854
1855 virtual void TearDown() {
1856 delete mDevice;
1857 delete mFakeContext;
1858 mFakeListener.clear();
1859 mFakePolicy.clear();
1860 mFakeEventHub.clear();
1861 }
1862
1863 void addConfigurationProperty(const char* key, const char* value) {
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001864 mFakeEventHub->addConfigurationProperty(mDevice->getId(), String8(key), String8(value));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001865 }
1866
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001867 void configureDevice(uint32_t changes) {
1868 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1869 }
1870
Michael Wrightd02c5b62014-02-10 15:10:22 -08001871 void addMapperAndConfigure(InputMapper* mapper) {
1872 mDevice->addMapper(mapper);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001873 configureDevice(0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001874 mDevice->reset(ARBITRARY_TIME);
1875 }
1876
1877 void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001878 int32_t orientation, const std::string& uniqueId,
1879 std::optional<uint8_t> physicalPort, ViewportType viewportType) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001880 mFakePolicy->addDisplayViewport(
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001881 displayId, width, height, orientation, uniqueId, physicalPort, viewportType);
Santos Cordonfa5cf462017-04-05 10:37:00 -07001882 configureDevice(InputReaderConfiguration::CHANGE_DISPLAY_INFO);
1883 }
1884
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001885 void clearViewports() {
1886 mFakePolicy->clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08001887 }
1888
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001889 static void process(InputMapper* mapper, nsecs_t when, int32_t type,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001890 int32_t code, int32_t value) {
1891 RawEvent event;
1892 event.when = when;
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001893 event.deviceId = mapper->getDeviceId();
Michael Wrightd02c5b62014-02-10 15:10:22 -08001894 event.type = type;
1895 event.code = code;
1896 event.value = value;
1897 mapper->process(&event);
1898 }
1899
1900 static void assertMotionRange(const InputDeviceInfo& info,
1901 int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
1902 const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
Yi Kong9b14ac62018-07-17 13:48:38 -07001903 ASSERT_TRUE(range != nullptr) << "Axis: " << axis << " Source: " << source;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001904 ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source;
1905 ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source;
1906 ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source;
1907 ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source;
1908 ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source;
1909 ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source;
1910 }
1911
1912 static void assertPointerCoords(const PointerCoords& coords,
1913 float x, float y, float pressure, float size,
1914 float touchMajor, float touchMinor, float toolMajor, float toolMinor,
1915 float orientation, float distance) {
1916 ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1);
1917 ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
1918 ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON);
1919 ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON);
1920 ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1);
1921 ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1);
1922 ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1);
1923 ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1);
1924 ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON);
1925 ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON);
1926 }
1927
1928 static void assertPosition(const sp<FakePointerController>& controller, float x, float y) {
1929 float actualX, actualY;
1930 controller->getPosition(&actualX, &actualY);
1931 ASSERT_NEAR(x, actualX, 1);
1932 ASSERT_NEAR(y, actualY, 1);
1933 }
1934};
1935
1936const char* InputMapperTest::DEVICE_NAME = "device";
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001937const char* InputMapperTest::DEVICE_LOCATION = "USB1";
Michael Wrightd02c5b62014-02-10 15:10:22 -08001938const int32_t InputMapperTest::DEVICE_ID = 1;
1939const int32_t InputMapperTest::DEVICE_GENERATION = 2;
1940const int32_t InputMapperTest::DEVICE_CONTROLLER_NUMBER = 0;
1941const uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests
1942
1943
1944// --- SwitchInputMapperTest ---
1945
1946class SwitchInputMapperTest : public InputMapperTest {
1947protected:
1948};
1949
1950TEST_F(SwitchInputMapperTest, GetSources) {
1951 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1952 addMapperAndConfigure(mapper);
1953
1954 ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources());
1955}
1956
1957TEST_F(SwitchInputMapperTest, GetSwitchState) {
1958 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1959 addMapperAndConfigure(mapper);
1960
1961 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
1962 ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1963
1964 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
1965 ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1966}
1967
1968TEST_F(SwitchInputMapperTest, Process) {
1969 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1970 addMapperAndConfigure(mapper);
1971
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001972 process(mapper, ARBITRARY_TIME, EV_SW, SW_LID, 1);
1973 process(mapper, ARBITRARY_TIME, EV_SW, SW_JACK_PHYSICAL_INSERT, 1);
1974 process(mapper, ARBITRARY_TIME, EV_SW, SW_HEADPHONE_INSERT, 0);
1975 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001976
1977 NotifySwitchArgs args;
1978 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args));
1979 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
Dan Albert1bd2fc02016-02-02 15:11:57 -08001980 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT), args.switchValues);
1981 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT) | (1 << SW_HEADPHONE_INSERT),
Michael Wrightd02c5b62014-02-10 15:10:22 -08001982 args.switchMask);
1983 ASSERT_EQ(uint32_t(0), args.policyFlags);
1984}
1985
1986
1987// --- KeyboardInputMapperTest ---
1988
1989class KeyboardInputMapperTest : public InputMapperTest {
1990protected:
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001991 const std::string UNIQUE_ID = "local:0";
1992
1993 void prepareDisplay(int32_t orientation);
1994
Michael Wrightd02c5b62014-02-10 15:10:22 -08001995 void testDPadKeyRotation(KeyboardInputMapper* mapper,
1996 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode);
1997};
1998
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001999/* Similar to setDisplayInfoAndReconfigure, but pre-populates all parameters except for the
2000 * orientation.
2001 */
2002void KeyboardInputMapperTest::prepareDisplay(int32_t orientation) {
2003 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002004 orientation, UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002005}
2006
Michael Wrightd02c5b62014-02-10 15:10:22 -08002007void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002008 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08002009 NotifyKeyArgs args;
2010
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002011 process(mapper, ARBITRARY_TIME, EV_KEY, originalScanCode, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002012 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2013 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2014 ASSERT_EQ(originalScanCode, args.scanCode);
2015 ASSERT_EQ(rotatedKeyCode, args.keyCode);
2016
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002017 process(mapper, ARBITRARY_TIME, EV_KEY, originalScanCode, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002018 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2019 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2020 ASSERT_EQ(originalScanCode, args.scanCode);
2021 ASSERT_EQ(rotatedKeyCode, args.keyCode);
2022}
2023
2024
2025TEST_F(KeyboardInputMapperTest, GetSources) {
2026 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2027 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2028 addMapperAndConfigure(mapper);
2029
2030 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
2031}
2032
2033TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
2034 const int32_t USAGE_A = 0x070004;
2035 const int32_t USAGE_UNKNOWN = 0x07ffff;
2036 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
2037 mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
2038
2039 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2040 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2041 addMapperAndConfigure(mapper);
2042
2043 // Key down by scan code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002044 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_HOME, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002045 NotifyKeyArgs args;
2046 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2047 ASSERT_EQ(DEVICE_ID, args.deviceId);
2048 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2049 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2050 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2051 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2052 ASSERT_EQ(KEY_HOME, args.scanCode);
2053 ASSERT_EQ(AMETA_NONE, args.metaState);
2054 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2055 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2056 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2057
2058 // Key up by scan code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002059 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_HOME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002060 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2061 ASSERT_EQ(DEVICE_ID, args.deviceId);
2062 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2063 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2064 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2065 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2066 ASSERT_EQ(KEY_HOME, args.scanCode);
2067 ASSERT_EQ(AMETA_NONE, args.metaState);
2068 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2069 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2070 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2071
2072 // Key down by usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002073 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_A);
2074 process(mapper, ARBITRARY_TIME, EV_KEY, 0, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002075 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2076 ASSERT_EQ(DEVICE_ID, args.deviceId);
2077 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2078 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2079 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2080 ASSERT_EQ(AKEYCODE_A, args.keyCode);
2081 ASSERT_EQ(0, args.scanCode);
2082 ASSERT_EQ(AMETA_NONE, args.metaState);
2083 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2084 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2085 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2086
2087 // Key up by usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002088 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_A);
2089 process(mapper, ARBITRARY_TIME + 1, EV_KEY, 0, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002090 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2091 ASSERT_EQ(DEVICE_ID, args.deviceId);
2092 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2093 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2094 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2095 ASSERT_EQ(AKEYCODE_A, args.keyCode);
2096 ASSERT_EQ(0, args.scanCode);
2097 ASSERT_EQ(AMETA_NONE, args.metaState);
2098 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2099 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2100 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2101
2102 // Key down with unknown scan code or usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002103 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
2104 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UNKNOWN, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002105 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2106 ASSERT_EQ(DEVICE_ID, args.deviceId);
2107 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2108 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2109 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2110 ASSERT_EQ(0, args.keyCode);
2111 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
2112 ASSERT_EQ(AMETA_NONE, args.metaState);
2113 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2114 ASSERT_EQ(0U, args.policyFlags);
2115 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2116
2117 // Key up with unknown scan code or usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002118 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
2119 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_UNKNOWN, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002120 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2121 ASSERT_EQ(DEVICE_ID, args.deviceId);
2122 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2123 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2124 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2125 ASSERT_EQ(0, args.keyCode);
2126 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
2127 ASSERT_EQ(AMETA_NONE, args.metaState);
2128 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2129 ASSERT_EQ(0U, args.policyFlags);
2130 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2131}
2132
2133TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
2134 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
2135 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2136
2137 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2138 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2139 addMapperAndConfigure(mapper);
2140
2141 // Initial metastate.
2142 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2143
2144 // Metakey down.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002145 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_LEFTSHIFT, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002146 NotifyKeyArgs args;
2147 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2148 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2149 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2150 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
2151
2152 // Key down.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002153 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_A, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002154 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2155 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2156 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2157
2158 // Key up.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002159 process(mapper, ARBITRARY_TIME + 2, EV_KEY, KEY_A, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002160 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2161 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2162 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2163
2164 // Metakey up.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002165 process(mapper, ARBITRARY_TIME + 3, EV_KEY, KEY_LEFTSHIFT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002166 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2167 ASSERT_EQ(AMETA_NONE, args.metaState);
2168 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2169 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
2170}
2171
2172TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
2173 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2174 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
2175 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
2176 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
2177
2178 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2179 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2180 addMapperAndConfigure(mapper);
2181
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002182 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002183 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2184 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
2185 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2186 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
2187 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2188 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
2189 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2190 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
2191}
2192
2193TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
2194 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2195 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
2196 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
2197 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
2198
2199 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2200 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2201 addConfigurationProperty("keyboard.orientationAware", "1");
2202 addMapperAndConfigure(mapper);
2203
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002204 prepareDisplay(DISPLAY_ORIENTATION_0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002205 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2206 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
2207 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2208 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
2209 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2210 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
2211 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2212 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
2213
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002214 clearViewports();
2215 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002216 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2217 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT));
2218 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2219 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP));
2220 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2221 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT));
2222 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2223 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN));
2224
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002225 clearViewports();
2226 prepareDisplay(DISPLAY_ORIENTATION_180);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002227 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2228 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN));
2229 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2230 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT));
2231 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2232 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP));
2233 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2234 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT));
2235
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002236 clearViewports();
2237 prepareDisplay(DISPLAY_ORIENTATION_270);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002238 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2239 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT));
2240 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2241 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN));
2242 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2243 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT));
2244 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2245 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP));
2246
2247 // Special case: if orientation changes while key is down, we still emit the same keycode
2248 // in the key up as we did in the key down.
2249 NotifyKeyArgs args;
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002250 clearViewports();
2251 prepareDisplay(DISPLAY_ORIENTATION_270);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002252 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002253 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2254 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2255 ASSERT_EQ(KEY_UP, args.scanCode);
2256 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
2257
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002258 clearViewports();
2259 prepareDisplay(DISPLAY_ORIENTATION_180);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002260 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2262 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2263 ASSERT_EQ(KEY_UP, args.scanCode);
2264 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
2265}
2266
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002267TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_NotOrientationAware) {
2268 // If the keyboard is not orientation aware,
2269 // key events should not be associated with a specific display id
2270 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2271
2272 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2273 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2274 addMapperAndConfigure(mapper);
2275 NotifyKeyArgs args;
2276
2277 // Display id should be ADISPLAY_ID_NONE without any display configuration.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002278 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002279 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002280 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002281 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2282 ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2283
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002284 prepareDisplay(DISPLAY_ORIENTATION_0);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002285 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002286 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002287 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002288 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2289 ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2290}
2291
2292TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_OrientationAware) {
2293 // If the keyboard is orientation aware,
2294 // key events should be associated with the internal viewport
2295 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2296
2297 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2298 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2299 addConfigurationProperty("keyboard.orientationAware", "1");
2300 addMapperAndConfigure(mapper);
2301 NotifyKeyArgs args;
2302
2303 // Display id should be ADISPLAY_ID_NONE without any display configuration.
2304 // ^--- already checked by the previous test
2305
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002306 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002307 UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002308 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002309 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002310 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002311 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2312 ASSERT_EQ(DISPLAY_ID, args.displayId);
2313
2314 constexpr int32_t newDisplayId = 2;
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002315 clearViewports();
2316 setDisplayInfoAndReconfigure(newDisplayId, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002317 UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002318 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002319 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002320 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002321 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2322 ASSERT_EQ(newDisplayId, args.displayId);
2323}
2324
Michael Wrightd02c5b62014-02-10 15:10:22 -08002325TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
2326 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2327 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2328 addMapperAndConfigure(mapper);
2329
2330 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
2331 ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2332
2333 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
2334 ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2335}
2336
2337TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
2338 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2339 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2340 addMapperAndConfigure(mapper);
2341
2342 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
2343 ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2344
2345 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
2346 ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2347}
2348
2349TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
2350 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2351 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2352 addMapperAndConfigure(mapper);
2353
2354 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2355
2356 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
2357 uint8_t flags[2] = { 0, 0 };
2358 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
2359 ASSERT_TRUE(flags[0]);
2360 ASSERT_FALSE(flags[1]);
2361}
2362
2363TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
2364 mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/);
2365 mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/);
2366 mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/);
2367 mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
2368 mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
2369 mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
2370
2371 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2372 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2373 addMapperAndConfigure(mapper);
2374
2375 // Initialization should have turned all of the lights off.
2376 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2377 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2378 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2379
2380 // Toggle caps lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002381 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 1);
2382 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002383 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2384 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2385 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2386 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState());
2387
2388 // Toggle num lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002389 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 1);
2390 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002391 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2392 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2393 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2394 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState());
2395
2396 // Toggle caps lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002397 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 1);
2398 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002399 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2400 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2401 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2402 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState());
2403
2404 // Toggle scroll lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002405 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
2406 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002407 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2408 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2409 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2410 ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2411
2412 // Toggle num lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002413 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 1);
2414 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002415 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2416 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2417 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2418 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2419
2420 // Toggle scroll lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002421 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
2422 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002423 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2424 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2425 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2426 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2427}
2428
2429
2430// --- CursorInputMapperTest ---
2431
2432class CursorInputMapperTest : public InputMapperTest {
2433protected:
2434 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
2435
2436 sp<FakePointerController> mFakePointerController;
2437
2438 virtual void SetUp() {
2439 InputMapperTest::SetUp();
2440
2441 mFakePointerController = new FakePointerController();
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002442 mFakePolicy->setPointerController(mDevice->getId(), mFakePointerController);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002443 }
2444
2445 void testMotionRotation(CursorInputMapper* mapper,
2446 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002447
2448 void prepareDisplay(int32_t orientation) {
2449 const std::string uniqueId = "local:0";
2450 const ViewportType viewportType = ViewportType::VIEWPORT_INTERNAL;
2451 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
2452 orientation, uniqueId, NO_PORT, viewportType);
2453 }
Michael Wrightd02c5b62014-02-10 15:10:22 -08002454};
2455
2456const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
2457
2458void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
2459 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
2460 NotifyMotionArgs args;
2461
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002462 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, originalX);
2463 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, originalY);
2464 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002465 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2466 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2467 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2468 float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
2469 float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
2470 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2471}
2472
2473TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
2474 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2475 addConfigurationProperty("cursor.mode", "pointer");
2476 addMapperAndConfigure(mapper);
2477
2478 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
2479}
2480
2481TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
2482 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2483 addConfigurationProperty("cursor.mode", "navigation");
2484 addMapperAndConfigure(mapper);
2485
2486 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
2487}
2488
2489TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
2490 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2491 addConfigurationProperty("cursor.mode", "pointer");
2492 addMapperAndConfigure(mapper);
2493
2494 InputDeviceInfo info;
2495 mapper->populateDeviceInfo(&info);
2496
2497 // Initially there may not be a valid motion range.
Yi Kong9b14ac62018-07-17 13:48:38 -07002498 ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE));
2499 ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002500 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2501 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f));
2502
2503 // When the bounds are set, then there should be a valid motion range.
2504 mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1);
2505
2506 InputDeviceInfo info2;
2507 mapper->populateDeviceInfo(&info2);
2508
2509 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2510 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE,
2511 1, 800 - 1, 0.0f, 0.0f));
2512 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2513 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE,
2514 2, 480 - 1, 0.0f, 0.0f));
2515 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2516 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE,
2517 0.0f, 1.0f, 0.0f, 0.0f));
2518}
2519
2520TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
2521 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2522 addConfigurationProperty("cursor.mode", "navigation");
2523 addMapperAndConfigure(mapper);
2524
2525 InputDeviceInfo info;
2526 mapper->populateDeviceInfo(&info);
2527
2528 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2529 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL,
2530 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2531 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2532 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL,
2533 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2534 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2535 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL,
2536 0.0f, 1.0f, 0.0f, 0.0f));
2537}
2538
2539TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
2540 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2541 addConfigurationProperty("cursor.mode", "navigation");
2542 addMapperAndConfigure(mapper);
2543
2544 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2545
2546 NotifyMotionArgs args;
2547
2548 // Button press.
2549 // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002550 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2551 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002552 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2553 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2554 ASSERT_EQ(DEVICE_ID, args.deviceId);
2555 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2556 ASSERT_EQ(uint32_t(0), args.policyFlags);
2557 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2558 ASSERT_EQ(0, args.flags);
2559 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2560 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2561 ASSERT_EQ(0, args.edgeFlags);
2562 ASSERT_EQ(uint32_t(1), args.pointerCount);
2563 ASSERT_EQ(0, args.pointerProperties[0].id);
2564 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2565 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2566 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2567 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2568 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2569 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2570
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002571 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2572 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2573 ASSERT_EQ(DEVICE_ID, args.deviceId);
2574 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2575 ASSERT_EQ(uint32_t(0), args.policyFlags);
2576 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2577 ASSERT_EQ(0, args.flags);
2578 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2579 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2580 ASSERT_EQ(0, args.edgeFlags);
2581 ASSERT_EQ(uint32_t(1), args.pointerCount);
2582 ASSERT_EQ(0, args.pointerProperties[0].id);
2583 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2584 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2585 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2586 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2587 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2588 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2589
Michael Wrightd02c5b62014-02-10 15:10:22 -08002590 // Button release. Should have same down time.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002591 process(mapper, ARBITRARY_TIME + 1, EV_KEY, BTN_MOUSE, 0);
2592 process(mapper, ARBITRARY_TIME + 1, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002593 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2594 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2595 ASSERT_EQ(DEVICE_ID, args.deviceId);
2596 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2597 ASSERT_EQ(uint32_t(0), args.policyFlags);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002598 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2599 ASSERT_EQ(0, args.flags);
2600 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2601 ASSERT_EQ(0, args.buttonState);
2602 ASSERT_EQ(0, args.edgeFlags);
2603 ASSERT_EQ(uint32_t(1), args.pointerCount);
2604 ASSERT_EQ(0, args.pointerProperties[0].id);
2605 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2606 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2607 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2608 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2609 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2610 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2611
2612 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2613 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2614 ASSERT_EQ(DEVICE_ID, args.deviceId);
2615 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2616 ASSERT_EQ(uint32_t(0), args.policyFlags);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002617 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2618 ASSERT_EQ(0, args.flags);
2619 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2620 ASSERT_EQ(0, args.buttonState);
2621 ASSERT_EQ(0, args.edgeFlags);
2622 ASSERT_EQ(uint32_t(1), args.pointerCount);
2623 ASSERT_EQ(0, args.pointerProperties[0].id);
2624 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2625 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2626 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2627 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2628 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2629 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2630}
2631
2632TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
2633 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2634 addConfigurationProperty("cursor.mode", "navigation");
2635 addMapperAndConfigure(mapper);
2636
2637 NotifyMotionArgs args;
2638
2639 // Motion in X but not Y.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002640 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 1);
2641 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002642 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2643 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2644 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2645 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2646
2647 // Motion in Y but not X.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002648 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, -2);
2649 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002650 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2651 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2652 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2653 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2654}
2655
2656TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
2657 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2658 addConfigurationProperty("cursor.mode", "navigation");
2659 addMapperAndConfigure(mapper);
2660
2661 NotifyMotionArgs args;
2662
2663 // Button press.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002664 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2665 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002666 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2667 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2668 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2669 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2670
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002671 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2672 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2673 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2674 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2675
Michael Wrightd02c5b62014-02-10 15:10:22 -08002676 // Button release.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002677 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 0);
2678 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002679 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002680 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2681 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2682 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2683
2684 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002685 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2686 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2687 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2688}
2689
2690TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
2691 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2692 addConfigurationProperty("cursor.mode", "navigation");
2693 addMapperAndConfigure(mapper);
2694
2695 NotifyMotionArgs args;
2696
2697 // Combined X, Y and Button.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002698 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 1);
2699 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, -2);
2700 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2701 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002702 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2703 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2704 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2705 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2706 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2707
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002708 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2709 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2710 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2711 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2712 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2713
Michael Wrightd02c5b62014-02-10 15:10:22 -08002714 // Move X, Y a bit while pressed.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002715 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 2);
2716 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 1);
2717 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002718 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2719 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2720 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2721 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2722 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2723
2724 // Release Button.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002725 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 0);
2726 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002727 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002728 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2729 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2730 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2731
2732 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002733 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2734 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2735 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2736}
2737
2738TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
2739 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2740 addConfigurationProperty("cursor.mode", "navigation");
2741 addMapperAndConfigure(mapper);
2742
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002743 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002744 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2745 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2746 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2747 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2748 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2749 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2750 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2751 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2752}
2753
2754TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
2755 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2756 addConfigurationProperty("cursor.mode", "navigation");
2757 addConfigurationProperty("cursor.orientationAware", "1");
2758 addMapperAndConfigure(mapper);
2759
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002760 prepareDisplay(DISPLAY_ORIENTATION_0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002761 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2762 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2763 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2764 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2765 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2766 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2767 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2768 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2769
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002770 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002771 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0));
2772 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1));
2773 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1));
2774 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1));
2775 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0));
2776 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1));
2777 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1));
2778 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1));
2779
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002780 prepareDisplay(DISPLAY_ORIENTATION_180);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002781 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1));
2782 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1));
2783 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0));
2784 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1));
2785 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1));
2786 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1));
2787 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0));
2788 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1));
2789
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002790 prepareDisplay(DISPLAY_ORIENTATION_270);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002791 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0));
2792 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1));
2793 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1));
2794 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1));
2795 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0));
2796 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1));
2797 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1));
2798 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1));
2799}
2800
2801TEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) {
2802 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2803 addConfigurationProperty("cursor.mode", "pointer");
2804 addMapperAndConfigure(mapper);
2805
2806 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2807 mFakePointerController->setPosition(100, 200);
2808 mFakePointerController->setButtonState(0);
2809
2810 NotifyMotionArgs motionArgs;
2811 NotifyKeyArgs keyArgs;
2812
2813 // press BTN_LEFT, release BTN_LEFT
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002814 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_LEFT, 1);
2815 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002816 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2817 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2818 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2819 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2820 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2821 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2822
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002823 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2824 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2825 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2826 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2827 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2828 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2829
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002830 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_LEFT, 0);
2831 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002832 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002833 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002834 ASSERT_EQ(0, motionArgs.buttonState);
2835 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002836 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2837 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2838
2839 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002840 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002841 ASSERT_EQ(0, motionArgs.buttonState);
2842 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002843 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2844 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2845
2846 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002847 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002848 ASSERT_EQ(0, motionArgs.buttonState);
2849 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002850 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2851 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2852
2853 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002854 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_RIGHT, 1);
2855 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 1);
2856 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002857 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2858 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2859 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2860 motionArgs.buttonState);
2861 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2862 mFakePointerController->getButtonState());
2863 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2864 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2865
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002866 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2867 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2868 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2869 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2870 mFakePointerController->getButtonState());
2871 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2872 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2873
2874 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2875 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2876 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2877 motionArgs.buttonState);
2878 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2879 mFakePointerController->getButtonState());
2880 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2881 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2882
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002883 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_RIGHT, 0);
2884 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002885 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002886 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002887 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2888 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002889 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2890 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2891
2892 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002893 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002894 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2895 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002896 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2897 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2898
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002899 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 0);
2900 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002901 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002902 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2903 ASSERT_EQ(0, motionArgs.buttonState);
2904 ASSERT_EQ(0, mFakePointerController->getButtonState());
2905 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2906 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 -08002907 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 0);
2908 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002909
2910 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002911 ASSERT_EQ(0, motionArgs.buttonState);
2912 ASSERT_EQ(0, mFakePointerController->getButtonState());
2913 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2914 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2915 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 -08002916
Michael Wrightd02c5b62014-02-10 15:10:22 -08002917 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2918 ASSERT_EQ(0, motionArgs.buttonState);
2919 ASSERT_EQ(0, mFakePointerController->getButtonState());
2920 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2921 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2922 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2923
2924 // press BTN_BACK, release BTN_BACK
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002925 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_BACK, 1);
2926 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002927 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2928 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2929 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002930
Michael Wrightd02c5b62014-02-10 15:10:22 -08002931 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002932 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002933 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2934 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002935 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2936 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2937
2938 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2939 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2940 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2941 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002942 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2943 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2944
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002945 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_BACK, 0);
2946 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002947 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002948 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002949 ASSERT_EQ(0, motionArgs.buttonState);
2950 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002951 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2952 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2953
2954 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002955 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002956 ASSERT_EQ(0, motionArgs.buttonState);
2957 ASSERT_EQ(0, mFakePointerController->getButtonState());
2958
Michael Wrightd02c5b62014-02-10 15:10:22 -08002959 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2960 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2961 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2962 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2963 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2964
2965 // press BTN_SIDE, release BTN_SIDE
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002966 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_SIDE, 1);
2967 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002968 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2969 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2970 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002971
Michael Wrightd02c5b62014-02-10 15:10:22 -08002972 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002973 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002974 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2975 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002976 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2977 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2978
2979 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2980 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2981 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2982 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002983 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2984 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2985
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002986 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_SIDE, 0);
2987 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002988 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002989 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002990 ASSERT_EQ(0, motionArgs.buttonState);
2991 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002992 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2993 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 -08002994
2995 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2996 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2997 ASSERT_EQ(0, motionArgs.buttonState);
2998 ASSERT_EQ(0, mFakePointerController->getButtonState());
2999 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3000 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3001
Michael Wrightd02c5b62014-02-10 15:10:22 -08003002 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3003 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3004 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3005
3006 // press BTN_FORWARD, release BTN_FORWARD
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003007 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_FORWARD, 1);
3008 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003009 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3010 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3011 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003012
Michael Wrightd02c5b62014-02-10 15:10:22 -08003013 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003014 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003015 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3016 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003017 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3018 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3019
3020 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3021 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3022 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3023 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003024 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3025 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3026
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003027 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_FORWARD, 0);
3028 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003029 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003030 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003031 ASSERT_EQ(0, motionArgs.buttonState);
3032 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003033 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3034 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 -08003035
3036 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3037 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3038 ASSERT_EQ(0, motionArgs.buttonState);
3039 ASSERT_EQ(0, mFakePointerController->getButtonState());
3040 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3041 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3042
Michael Wrightd02c5b62014-02-10 15:10:22 -08003043 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3044 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3045 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3046
3047 // press BTN_EXTRA, release BTN_EXTRA
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003048 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_EXTRA, 1);
3049 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003050 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3051 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3052 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003053
Michael Wrightd02c5b62014-02-10 15:10:22 -08003054 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003055 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003056 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3057 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003058 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3059 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3060
3061 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3062 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3063 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3064 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003065 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3066 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3067
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003068 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_EXTRA, 0);
3069 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003070 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003071 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003072 ASSERT_EQ(0, motionArgs.buttonState);
3073 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003074 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3075 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 -08003076
3077 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3078 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3079 ASSERT_EQ(0, motionArgs.buttonState);
3080 ASSERT_EQ(0, mFakePointerController->getButtonState());
3081 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3082 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3083
Michael Wrightd02c5b62014-02-10 15:10:22 -08003084 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3085 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3086 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3087}
3088
3089TEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) {
3090 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3091 addConfigurationProperty("cursor.mode", "pointer");
3092 addMapperAndConfigure(mapper);
3093
3094 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3095 mFakePointerController->setPosition(100, 200);
3096 mFakePointerController->setButtonState(0);
3097
3098 NotifyMotionArgs args;
3099
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003100 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3101 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3102 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003103 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003104 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
3105 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3106 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3107 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3108 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3109}
3110
3111TEST_F(CursorInputMapperTest, Process_PointerCapture) {
3112 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3113 addConfigurationProperty("cursor.mode", "pointer");
3114 mFakePolicy->setPointerCapture(true);
3115 addMapperAndConfigure(mapper);
3116
3117 NotifyDeviceResetArgs resetArgs;
3118 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
3119 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
3120 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
3121
3122 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3123 mFakePointerController->setPosition(100, 200);
3124 mFakePointerController->setButtonState(0);
3125
3126 NotifyMotionArgs args;
3127
3128 // Move.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003129 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3130 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3131 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003132 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3133 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3134 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
3135 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3136 10.0f, 20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3137 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
3138
3139 // Button press.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003140 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
3141 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003142 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3143 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3144 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
3145 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3146 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3147 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3148 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3149 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
3150 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3151 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3152
3153 // Button release.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003154 process(mapper, ARBITRARY_TIME + 2, EV_KEY, BTN_MOUSE, 0);
3155 process(mapper, ARBITRARY_TIME + 2, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003156 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3157 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3158 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
3159 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3160 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3161 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3162 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3163 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
3164 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3165 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3166
3167 // Another move.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003168 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 30);
3169 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 40);
3170 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003171 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3172 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3173 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
3174 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3175 30.0f, 40.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3176 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
3177
3178 // Disable pointer capture and check that the device generation got bumped
3179 // and events are generated the usual way.
3180 const uint32_t generation = mFakeContext->getGeneration();
3181 mFakePolicy->setPointerCapture(false);
3182 configureDevice(InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
3183 ASSERT_TRUE(mFakeContext->getGeneration() != generation);
3184
3185 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
3186 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
3187 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
3188
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003189 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3190 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3191 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003192 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3193 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003194 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3195 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3196 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3197 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3198}
3199
Arthur Hungc7ad2d02018-12-18 17:41:29 +08003200TEST_F(CursorInputMapperTest, Process_ShouldHandleDisplayId) {
3201 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3202 addMapperAndConfigure(mapper);
3203
3204 // Setup PointerController for second display.
3205 constexpr int32_t SECOND_DISPLAY_ID = 1;
3206 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3207 mFakePointerController->setPosition(100, 200);
3208 mFakePointerController->setButtonState(0);
3209 mFakePointerController->setDisplayId(SECOND_DISPLAY_ID);
3210
3211 NotifyMotionArgs args;
3212 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3213 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3214 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3215 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3216 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
3217 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3218 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3219 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3220 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3221 ASSERT_EQ(SECOND_DISPLAY_ID, args.displayId);
3222}
3223
Michael Wrightd02c5b62014-02-10 15:10:22 -08003224
3225// --- TouchInputMapperTest ---
3226
3227class TouchInputMapperTest : public InputMapperTest {
3228protected:
3229 static const int32_t RAW_X_MIN;
3230 static const int32_t RAW_X_MAX;
3231 static const int32_t RAW_Y_MIN;
3232 static const int32_t RAW_Y_MAX;
3233 static const int32_t RAW_TOUCH_MIN;
3234 static const int32_t RAW_TOUCH_MAX;
3235 static const int32_t RAW_TOOL_MIN;
3236 static const int32_t RAW_TOOL_MAX;
3237 static const int32_t RAW_PRESSURE_MIN;
3238 static const int32_t RAW_PRESSURE_MAX;
3239 static const int32_t RAW_ORIENTATION_MIN;
3240 static const int32_t RAW_ORIENTATION_MAX;
3241 static const int32_t RAW_DISTANCE_MIN;
3242 static const int32_t RAW_DISTANCE_MAX;
3243 static const int32_t RAW_TILT_MIN;
3244 static const int32_t RAW_TILT_MAX;
3245 static const int32_t RAW_ID_MIN;
3246 static const int32_t RAW_ID_MAX;
3247 static const int32_t RAW_SLOT_MIN;
3248 static const int32_t RAW_SLOT_MAX;
3249 static const float X_PRECISION;
3250 static const float Y_PRECISION;
Santos Cordonfa5cf462017-04-05 10:37:00 -07003251 static const float X_PRECISION_VIRTUAL;
3252 static const float Y_PRECISION_VIRTUAL;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003253
3254 static const float GEOMETRIC_SCALE;
Jason Gerecke489fda82012-09-07 17:19:40 -07003255 static const TouchAffineTransformation AFFINE_TRANSFORM;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003256
3257 static const VirtualKeyDefinition VIRTUAL_KEYS[2];
3258
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003259 const std::string UNIQUE_ID = "local:0";
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003260 const std::string SECONDARY_UNIQUE_ID = "local:1";
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003261
Michael Wrightd02c5b62014-02-10 15:10:22 -08003262 enum Axes {
3263 POSITION = 1 << 0,
3264 TOUCH = 1 << 1,
3265 TOOL = 1 << 2,
3266 PRESSURE = 1 << 3,
3267 ORIENTATION = 1 << 4,
3268 MINOR = 1 << 5,
3269 ID = 1 << 6,
3270 DISTANCE = 1 << 7,
3271 TILT = 1 << 8,
3272 SLOT = 1 << 9,
3273 TOOL_TYPE = 1 << 10,
3274 };
3275
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003276 void prepareDisplay(int32_t orientation, std::optional<uint8_t> port = NO_PORT);
3277 void prepareSecondaryDisplay(ViewportType type, std::optional<uint8_t> port = NO_PORT);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003278 void prepareVirtualDisplay(int32_t orientation);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003279 void prepareVirtualKeys();
Jason Gerecke489fda82012-09-07 17:19:40 -07003280 void prepareLocationCalibration();
Michael Wrightd02c5b62014-02-10 15:10:22 -08003281 int32_t toRawX(float displayX);
3282 int32_t toRawY(float displayY);
Jason Gerecke489fda82012-09-07 17:19:40 -07003283 float toCookedX(float rawX, float rawY);
3284 float toCookedY(float rawX, float rawY);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003285 float toDisplayX(int32_t rawX);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003286 float toDisplayX(int32_t rawX, int32_t displayWidth);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003287 float toDisplayY(int32_t rawY);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003288 float toDisplayY(int32_t rawY, int32_t displayHeight);
3289
Michael Wrightd02c5b62014-02-10 15:10:22 -08003290};
3291
3292const int32_t TouchInputMapperTest::RAW_X_MIN = 25;
3293const int32_t TouchInputMapperTest::RAW_X_MAX = 1019;
3294const int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
3295const int32_t TouchInputMapperTest::RAW_Y_MAX = 1009;
3296const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
3297const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
3298const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
3299const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
Michael Wrightaa449c92017-12-13 21:21:43 +00003300const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = 0;
3301const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = 255;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003302const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
3303const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
3304const int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0;
3305const int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7;
3306const int32_t TouchInputMapperTest::RAW_TILT_MIN = 0;
3307const int32_t TouchInputMapperTest::RAW_TILT_MAX = 150;
3308const int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
3309const int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
3310const int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0;
3311const int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9;
3312const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH;
3313const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT;
Santos Cordonfa5cf462017-04-05 10:37:00 -07003314const float TouchInputMapperTest::X_PRECISION_VIRTUAL =
3315 float(RAW_X_MAX - RAW_X_MIN + 1) / VIRTUAL_DISPLAY_WIDTH;
3316const float TouchInputMapperTest::Y_PRECISION_VIRTUAL =
3317 float(RAW_Y_MAX - RAW_Y_MIN + 1) / VIRTUAL_DISPLAY_HEIGHT;
Jason Gerecke489fda82012-09-07 17:19:40 -07003318const TouchAffineTransformation TouchInputMapperTest::AFFINE_TRANSFORM =
3319 TouchAffineTransformation(1, -2, 3, -4, 5, -6);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003320
3321const float TouchInputMapperTest::GEOMETRIC_SCALE =
3322 avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1),
3323 float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1));
3324
3325const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
3326 { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
3327 { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
3328};
3329
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003330void TouchInputMapperTest::prepareDisplay(int32_t orientation, std::optional<uint8_t> port) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003331 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003332 UNIQUE_ID, port, ViewportType::VIEWPORT_INTERNAL);
3333}
3334
3335void TouchInputMapperTest::prepareSecondaryDisplay(ViewportType type, std::optional<uint8_t> port) {
3336 setDisplayInfoAndReconfigure(SECONDARY_DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
3337 DISPLAY_ORIENTATION_0, SECONDARY_UNIQUE_ID, port, type);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003338}
3339
Santos Cordonfa5cf462017-04-05 10:37:00 -07003340void TouchInputMapperTest::prepareVirtualDisplay(int32_t orientation) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003341 setDisplayInfoAndReconfigure(VIRTUAL_DISPLAY_ID, VIRTUAL_DISPLAY_WIDTH,
3342 VIRTUAL_DISPLAY_HEIGHT, orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003343 VIRTUAL_DISPLAY_UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003344}
3345
Michael Wrightd02c5b62014-02-10 15:10:22 -08003346void TouchInputMapperTest::prepareVirtualKeys() {
3347 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]);
3348 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]);
3349 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
3350 mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE);
3351}
3352
Jason Gerecke489fda82012-09-07 17:19:40 -07003353void TouchInputMapperTest::prepareLocationCalibration() {
3354 mFakePolicy->setTouchAffineTransformation(AFFINE_TRANSFORM);
3355}
3356
Michael Wrightd02c5b62014-02-10 15:10:22 -08003357int32_t TouchInputMapperTest::toRawX(float displayX) {
3358 return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN);
3359}
3360
3361int32_t TouchInputMapperTest::toRawY(float displayY) {
3362 return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN);
3363}
3364
Jason Gerecke489fda82012-09-07 17:19:40 -07003365float TouchInputMapperTest::toCookedX(float rawX, float rawY) {
3366 AFFINE_TRANSFORM.applyTo(rawX, rawY);
3367 return rawX;
3368}
3369
3370float TouchInputMapperTest::toCookedY(float rawX, float rawY) {
3371 AFFINE_TRANSFORM.applyTo(rawX, rawY);
3372 return rawY;
3373}
3374
Michael Wrightd02c5b62014-02-10 15:10:22 -08003375float TouchInputMapperTest::toDisplayX(int32_t rawX) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07003376 return toDisplayX(rawX, DISPLAY_WIDTH);
3377}
3378
3379float TouchInputMapperTest::toDisplayX(int32_t rawX, int32_t displayWidth) {
3380 return float(rawX - RAW_X_MIN) * displayWidth / (RAW_X_MAX - RAW_X_MIN + 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003381}
3382
3383float TouchInputMapperTest::toDisplayY(int32_t rawY) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07003384 return toDisplayY(rawY, DISPLAY_HEIGHT);
3385}
3386
3387float TouchInputMapperTest::toDisplayY(int32_t rawY, int32_t displayHeight) {
3388 return float(rawY - RAW_Y_MIN) * displayHeight / (RAW_Y_MAX - RAW_Y_MIN + 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003389}
3390
3391
3392// --- SingleTouchInputMapperTest ---
3393
3394class SingleTouchInputMapperTest : public TouchInputMapperTest {
3395protected:
3396 void prepareButtons();
3397 void prepareAxes(int axes);
3398
3399 void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3400 void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3401 void processUp(SingleTouchInputMapper* mappery);
3402 void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
3403 void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
3404 void processDistance(SingleTouchInputMapper* mapper, int32_t distance);
3405 void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY);
3406 void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value);
3407 void processSync(SingleTouchInputMapper* mapper);
3408};
3409
3410void SingleTouchInputMapperTest::prepareButtons() {
3411 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
3412}
3413
3414void SingleTouchInputMapperTest::prepareAxes(int axes) {
3415 if (axes & POSITION) {
3416 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X,
3417 RAW_X_MIN, RAW_X_MAX, 0, 0);
3418 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y,
3419 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
3420 }
3421 if (axes & PRESSURE) {
3422 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE,
3423 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
3424 }
3425 if (axes & TOOL) {
3426 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH,
3427 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
3428 }
3429 if (axes & DISTANCE) {
3430 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE,
3431 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
3432 }
3433 if (axes & TILT) {
3434 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X,
3435 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3436 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y,
3437 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3438 }
3439}
3440
3441void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003442 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 1);
3443 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_X, x);
3444 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003445}
3446
3447void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003448 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_X, x);
3449 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003450}
3451
3452void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003453 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003454}
3455
3456void SingleTouchInputMapperTest::processPressure(
3457 SingleTouchInputMapper* mapper, int32_t pressure) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003458 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_PRESSURE, pressure);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003459}
3460
3461void SingleTouchInputMapperTest::processToolMajor(
3462 SingleTouchInputMapper* mapper, int32_t toolMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003463 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TOOL_WIDTH, toolMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003464}
3465
3466void SingleTouchInputMapperTest::processDistance(
3467 SingleTouchInputMapper* mapper, int32_t distance) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003468 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_DISTANCE, distance);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003469}
3470
3471void SingleTouchInputMapperTest::processTilt(
3472 SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003473 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TILT_X, tiltX);
3474 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TILT_Y, tiltY);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003475}
3476
3477void SingleTouchInputMapperTest::processKey(
3478 SingleTouchInputMapper* mapper, int32_t code, int32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003479 process(mapper, ARBITRARY_TIME, EV_KEY, code, value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003480}
3481
3482void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003483 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003484}
3485
3486
3487TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) {
3488 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3489 prepareButtons();
3490 prepareAxes(POSITION);
3491 addMapperAndConfigure(mapper);
3492
3493 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
3494}
3495
3496TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) {
3497 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3498 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X);
3499 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y);
3500 prepareButtons();
3501 prepareAxes(POSITION);
3502 addMapperAndConfigure(mapper);
3503
3504 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3505}
3506
3507TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) {
3508 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3509 prepareButtons();
3510 prepareAxes(POSITION);
3511 addConfigurationProperty("touch.deviceType", "touchPad");
3512 addMapperAndConfigure(mapper);
3513
3514 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3515}
3516
3517TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) {
3518 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3519 prepareButtons();
3520 prepareAxes(POSITION);
3521 addConfigurationProperty("touch.deviceType", "touchScreen");
3522 addMapperAndConfigure(mapper);
3523
3524 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
3525}
3526
3527TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
3528 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3529 addConfigurationProperty("touch.deviceType", "touchScreen");
3530 prepareDisplay(DISPLAY_ORIENTATION_0);
3531 prepareButtons();
3532 prepareAxes(POSITION);
3533 prepareVirtualKeys();
3534 addMapperAndConfigure(mapper);
3535
3536 // Unknown key.
3537 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
3538
3539 // Virtual key is down.
3540 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3541 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3542 processDown(mapper, x, y);
3543 processSync(mapper);
3544 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3545
3546 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3547
3548 // Virtual key is up.
3549 processUp(mapper);
3550 processSync(mapper);
3551 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3552
3553 ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3554}
3555
3556TEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
3557 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3558 addConfigurationProperty("touch.deviceType", "touchScreen");
3559 prepareDisplay(DISPLAY_ORIENTATION_0);
3560 prepareButtons();
3561 prepareAxes(POSITION);
3562 prepareVirtualKeys();
3563 addMapperAndConfigure(mapper);
3564
3565 // Unknown key.
3566 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
3567
3568 // Virtual key is down.
3569 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3570 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3571 processDown(mapper, x, y);
3572 processSync(mapper);
3573 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3574
3575 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3576
3577 // Virtual key is up.
3578 processUp(mapper);
3579 processSync(mapper);
3580 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3581
3582 ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3583}
3584
3585TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
3586 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3587 addConfigurationProperty("touch.deviceType", "touchScreen");
3588 prepareDisplay(DISPLAY_ORIENTATION_0);
3589 prepareButtons();
3590 prepareAxes(POSITION);
3591 prepareVirtualKeys();
3592 addMapperAndConfigure(mapper);
3593
3594 const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
3595 uint8_t flags[2] = { 0, 0 };
3596 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
3597 ASSERT_TRUE(flags[0]);
3598 ASSERT_FALSE(flags[1]);
3599}
3600
3601TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
3602 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3603 addConfigurationProperty("touch.deviceType", "touchScreen");
3604 prepareDisplay(DISPLAY_ORIENTATION_0);
3605 prepareButtons();
3606 prepareAxes(POSITION);
3607 prepareVirtualKeys();
3608 addMapperAndConfigure(mapper);
3609
3610 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3611
3612 NotifyKeyArgs args;
3613
3614 // Press virtual key.
3615 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3616 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3617 processDown(mapper, x, y);
3618 processSync(mapper);
3619
3620 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3621 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3622 ASSERT_EQ(DEVICE_ID, args.deviceId);
3623 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3624 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3625 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
3626 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3627 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3628 ASSERT_EQ(KEY_HOME, args.scanCode);
3629 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3630 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3631
3632 // Release virtual key.
3633 processUp(mapper);
3634 processSync(mapper);
3635
3636 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3637 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3638 ASSERT_EQ(DEVICE_ID, args.deviceId);
3639 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3640 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3641 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
3642 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3643 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3644 ASSERT_EQ(KEY_HOME, args.scanCode);
3645 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3646 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3647
3648 // Should not have sent any motions.
3649 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3650}
3651
3652TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
3653 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3654 addConfigurationProperty("touch.deviceType", "touchScreen");
3655 prepareDisplay(DISPLAY_ORIENTATION_0);
3656 prepareButtons();
3657 prepareAxes(POSITION);
3658 prepareVirtualKeys();
3659 addMapperAndConfigure(mapper);
3660
3661 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3662
3663 NotifyKeyArgs keyArgs;
3664
3665 // Press virtual key.
3666 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3667 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3668 processDown(mapper, x, y);
3669 processSync(mapper);
3670
3671 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3672 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3673 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3674 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3675 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3676 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3677 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
3678 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3679 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3680 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3681 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3682
3683 // Move out of bounds. This should generate a cancel and a pointer down since we moved
3684 // into the display area.
3685 y -= 100;
3686 processMove(mapper, x, y);
3687 processSync(mapper);
3688
3689 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3690 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3691 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3692 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3693 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3694 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3695 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
3696 | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
3697 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3698 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3699 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3700 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3701
3702 NotifyMotionArgs motionArgs;
3703 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3704 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3705 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3706 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3707 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3708 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3709 ASSERT_EQ(0, motionArgs.flags);
3710 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3711 ASSERT_EQ(0, motionArgs.buttonState);
3712 ASSERT_EQ(0, motionArgs.edgeFlags);
3713 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3714 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3715 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3716 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3717 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3718 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3719 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3720 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3721
3722 // Keep moving out of bounds. Should generate a pointer move.
3723 y -= 50;
3724 processMove(mapper, x, y);
3725 processSync(mapper);
3726
3727 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3728 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3729 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3730 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3731 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3732 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3733 ASSERT_EQ(0, motionArgs.flags);
3734 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3735 ASSERT_EQ(0, motionArgs.buttonState);
3736 ASSERT_EQ(0, motionArgs.edgeFlags);
3737 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3738 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3739 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3740 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3741 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3742 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3743 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3744 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3745
3746 // Release out of bounds. Should generate a pointer up.
3747 processUp(mapper);
3748 processSync(mapper);
3749
3750 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3751 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3752 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3753 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3754 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3755 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3756 ASSERT_EQ(0, motionArgs.flags);
3757 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3758 ASSERT_EQ(0, motionArgs.buttonState);
3759 ASSERT_EQ(0, motionArgs.edgeFlags);
3760 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3761 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3762 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3763 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3764 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3765 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3766 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3767 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3768
3769 // Should not have sent any more keys or motions.
3770 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3771 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3772}
3773
3774TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
3775 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3776 addConfigurationProperty("touch.deviceType", "touchScreen");
3777 prepareDisplay(DISPLAY_ORIENTATION_0);
3778 prepareButtons();
3779 prepareAxes(POSITION);
3780 prepareVirtualKeys();
3781 addMapperAndConfigure(mapper);
3782
3783 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3784
3785 NotifyMotionArgs motionArgs;
3786
3787 // Initially go down out of bounds.
3788 int32_t x = -10;
3789 int32_t y = -10;
3790 processDown(mapper, x, y);
3791 processSync(mapper);
3792
3793 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3794
3795 // Move into the display area. Should generate a pointer down.
3796 x = 50;
3797 y = 75;
3798 processMove(mapper, x, y);
3799 processSync(mapper);
3800
3801 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3802 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3803 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3804 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3805 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3806 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3807 ASSERT_EQ(0, motionArgs.flags);
3808 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3809 ASSERT_EQ(0, motionArgs.buttonState);
3810 ASSERT_EQ(0, motionArgs.edgeFlags);
3811 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3812 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3813 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3814 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3815 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3816 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3817 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3818 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3819
3820 // Release. Should generate a pointer up.
3821 processUp(mapper);
3822 processSync(mapper);
3823
3824 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3825 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3826 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3827 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3828 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3829 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3830 ASSERT_EQ(0, motionArgs.flags);
3831 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3832 ASSERT_EQ(0, motionArgs.buttonState);
3833 ASSERT_EQ(0, motionArgs.edgeFlags);
3834 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3835 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3836 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3837 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3838 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3839 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3840 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3841 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3842
3843 // Should not have sent any more keys or motions.
3844 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3845 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3846}
3847
Santos Cordonfa5cf462017-04-05 10:37:00 -07003848TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture_VirtualDisplay) {
3849 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3850 addConfigurationProperty("touch.deviceType", "touchScreen");
3851 addConfigurationProperty("touch.displayId", VIRTUAL_DISPLAY_UNIQUE_ID);
3852
3853 prepareVirtualDisplay(DISPLAY_ORIENTATION_0);
3854 prepareButtons();
3855 prepareAxes(POSITION);
3856 prepareVirtualKeys();
3857 addMapperAndConfigure(mapper);
3858
3859 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3860
3861 NotifyMotionArgs motionArgs;
3862
3863 // Down.
3864 int32_t x = 100;
3865 int32_t y = 125;
3866 processDown(mapper, x, y);
3867 processSync(mapper);
3868
3869 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3870 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3871 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3872 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3873 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3874 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3875 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3876 ASSERT_EQ(0, motionArgs.flags);
3877 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3878 ASSERT_EQ(0, motionArgs.buttonState);
3879 ASSERT_EQ(0, motionArgs.edgeFlags);
3880 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3881 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3882 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3883 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3884 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3885 1, 0, 0, 0, 0, 0, 0, 0));
3886 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3887 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3888 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3889
3890 // Move.
3891 x += 50;
3892 y += 75;
3893 processMove(mapper, x, y);
3894 processSync(mapper);
3895
3896 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3897 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3898 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3899 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
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, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3912 1, 0, 0, 0, 0, 0, 0, 0));
3913 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3914 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3915 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3916
3917 // Up.
3918 processUp(mapper);
3919 processSync(mapper);
3920
3921 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3922 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3923 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3924 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3925 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3926 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3927 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3928 ASSERT_EQ(0, motionArgs.flags);
3929 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3930 ASSERT_EQ(0, motionArgs.buttonState);
3931 ASSERT_EQ(0, motionArgs.edgeFlags);
3932 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3933 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3934 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3935 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3936 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3937 1, 0, 0, 0, 0, 0, 0, 0));
3938 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3939 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3940 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3941
3942 // Should not have sent any more keys or motions.
3943 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3944 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3945}
3946
Michael Wrightd02c5b62014-02-10 15:10:22 -08003947TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
3948 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3949 addConfigurationProperty("touch.deviceType", "touchScreen");
3950 prepareDisplay(DISPLAY_ORIENTATION_0);
3951 prepareButtons();
3952 prepareAxes(POSITION);
3953 prepareVirtualKeys();
3954 addMapperAndConfigure(mapper);
3955
3956 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3957
3958 NotifyMotionArgs motionArgs;
3959
3960 // Down.
3961 int32_t x = 100;
3962 int32_t y = 125;
3963 processDown(mapper, x, y);
3964 processSync(mapper);
3965
3966 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3967 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3968 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3969 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3970 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3971 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3972 ASSERT_EQ(0, motionArgs.flags);
3973 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3974 ASSERT_EQ(0, motionArgs.buttonState);
3975 ASSERT_EQ(0, motionArgs.edgeFlags);
3976 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3977 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3978 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3979 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3980 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3981 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3982 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3983 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3984
3985 // Move.
3986 x += 50;
3987 y += 75;
3988 processMove(mapper, x, y);
3989 processSync(mapper);
3990
3991 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3992 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3993 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3994 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3995 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3996 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3997 ASSERT_EQ(0, motionArgs.flags);
3998 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3999 ASSERT_EQ(0, motionArgs.buttonState);
4000 ASSERT_EQ(0, motionArgs.edgeFlags);
4001 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4002 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4003 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4004 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4005 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
4006 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4007 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4008 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4009
4010 // Up.
4011 processUp(mapper);
4012 processSync(mapper);
4013
4014 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4015 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4016 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4017 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4018 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4019 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4020 ASSERT_EQ(0, motionArgs.flags);
4021 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4022 ASSERT_EQ(0, motionArgs.buttonState);
4023 ASSERT_EQ(0, motionArgs.edgeFlags);
4024 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4025 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4026 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4027 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4028 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
4029 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4030 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4031 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4032
4033 // Should not have sent any more keys or motions.
4034 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4035 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4036}
4037
4038TEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) {
4039 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4040 addConfigurationProperty("touch.deviceType", "touchScreen");
4041 prepareButtons();
4042 prepareAxes(POSITION);
4043 addConfigurationProperty("touch.orientationAware", "0");
4044 addMapperAndConfigure(mapper);
4045
4046 NotifyMotionArgs args;
4047
4048 // Rotation 90.
4049 prepareDisplay(DISPLAY_ORIENTATION_90);
4050 processDown(mapper, toRawX(50), toRawY(75));
4051 processSync(mapper);
4052
4053 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4054 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4055 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4056
4057 processUp(mapper);
4058 processSync(mapper);
4059 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4060}
4061
4062TEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) {
4063 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4064 addConfigurationProperty("touch.deviceType", "touchScreen");
4065 prepareButtons();
4066 prepareAxes(POSITION);
4067 addMapperAndConfigure(mapper);
4068
4069 NotifyMotionArgs args;
4070
4071 // Rotation 0.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004072 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004073 prepareDisplay(DISPLAY_ORIENTATION_0);
4074 processDown(mapper, toRawX(50), toRawY(75));
4075 processSync(mapper);
4076
4077 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4078 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4079 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4080
4081 processUp(mapper);
4082 processSync(mapper);
4083 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4084
4085 // Rotation 90.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004086 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004087 prepareDisplay(DISPLAY_ORIENTATION_90);
4088 processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50));
4089 processSync(mapper);
4090
4091 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4092 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4093 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4094
4095 processUp(mapper);
4096 processSync(mapper);
4097 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4098
4099 // Rotation 180.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004100 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004101 prepareDisplay(DISPLAY_ORIENTATION_180);
4102 processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN);
4103 processSync(mapper);
4104
4105 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4106 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4107 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4108
4109 processUp(mapper);
4110 processSync(mapper);
4111 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4112
4113 // Rotation 270.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004114 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004115 prepareDisplay(DISPLAY_ORIENTATION_270);
4116 processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN);
4117 processSync(mapper);
4118
4119 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4120 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4121 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4122
4123 processUp(mapper);
4124 processSync(mapper);
4125 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4126}
4127
4128TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
4129 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4130 addConfigurationProperty("touch.deviceType", "touchScreen");
4131 prepareDisplay(DISPLAY_ORIENTATION_0);
4132 prepareButtons();
4133 prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT);
4134 addMapperAndConfigure(mapper);
4135
4136 // These calculations are based on the input device calibration documentation.
4137 int32_t rawX = 100;
4138 int32_t rawY = 200;
4139 int32_t rawPressure = 10;
4140 int32_t rawToolMajor = 12;
4141 int32_t rawDistance = 2;
4142 int32_t rawTiltX = 30;
4143 int32_t rawTiltY = 110;
4144
4145 float x = toDisplayX(rawX);
4146 float y = toDisplayY(rawY);
4147 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
4148 float size = float(rawToolMajor) / RAW_TOOL_MAX;
4149 float tool = float(rawToolMajor) * GEOMETRIC_SCALE;
4150 float distance = float(rawDistance);
4151
4152 float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f;
4153 float tiltScale = M_PI / 180;
4154 float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale;
4155 float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale;
4156 float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle));
4157 float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle));
4158
4159 processDown(mapper, rawX, rawY);
4160 processPressure(mapper, rawPressure);
4161 processToolMajor(mapper, rawToolMajor);
4162 processDistance(mapper, rawDistance);
4163 processTilt(mapper, rawTiltX, rawTiltY);
4164 processSync(mapper);
4165
4166 NotifyMotionArgs args;
4167 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4168 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4169 x, y, pressure, size, tool, tool, tool, tool, orientation, distance));
4170 ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT));
4171}
4172
Jason Gerecke489fda82012-09-07 17:19:40 -07004173TEST_F(SingleTouchInputMapperTest, Process_XYAxes_AffineCalibration) {
4174 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4175 addConfigurationProperty("touch.deviceType", "touchScreen");
4176 prepareDisplay(DISPLAY_ORIENTATION_0);
4177 prepareLocationCalibration();
4178 prepareButtons();
4179 prepareAxes(POSITION);
4180 addMapperAndConfigure(mapper);
4181
4182 int32_t rawX = 100;
4183 int32_t rawY = 200;
4184
4185 float x = toDisplayX(toCookedX(rawX, rawY));
4186 float y = toDisplayY(toCookedY(rawX, rawY));
4187
4188 processDown(mapper, rawX, rawY);
4189 processSync(mapper);
4190
4191 NotifyMotionArgs args;
4192 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4193 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4194 x, y, 1, 0, 0, 0, 0, 0, 0, 0));
4195}
4196
Michael Wrightd02c5b62014-02-10 15:10:22 -08004197TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) {
4198 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4199 addConfigurationProperty("touch.deviceType", "touchScreen");
4200 prepareDisplay(DISPLAY_ORIENTATION_0);
4201 prepareButtons();
4202 prepareAxes(POSITION);
4203 addMapperAndConfigure(mapper);
4204
4205 NotifyMotionArgs motionArgs;
4206 NotifyKeyArgs keyArgs;
4207
4208 processDown(mapper, 100, 200);
4209 processSync(mapper);
4210 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4211 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4212 ASSERT_EQ(0, motionArgs.buttonState);
4213
4214 // press BTN_LEFT, release BTN_LEFT
4215 processKey(mapper, BTN_LEFT, 1);
4216 processSync(mapper);
4217 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4218 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4219 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4220
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004221 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4222 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4223 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4224
Michael Wrightd02c5b62014-02-10 15:10:22 -08004225 processKey(mapper, BTN_LEFT, 0);
4226 processSync(mapper);
4227 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004228 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004229 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004230
4231 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004232 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004233 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004234
4235 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
4236 processKey(mapper, BTN_RIGHT, 1);
4237 processKey(mapper, BTN_MIDDLE, 1);
4238 processSync(mapper);
4239 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4240 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4241 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4242 motionArgs.buttonState);
4243
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004244 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4245 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4246 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, 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_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4251 motionArgs.buttonState);
4252
Michael Wrightd02c5b62014-02-10 15:10:22 -08004253 processKey(mapper, BTN_RIGHT, 0);
4254 processSync(mapper);
4255 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004256 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004257 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004258
4259 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004260 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004261 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004262
4263 processKey(mapper, BTN_MIDDLE, 0);
4264 processSync(mapper);
4265 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004266 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004267 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004268
4269 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004270 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004271 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004272
4273 // press BTN_BACK, release BTN_BACK
4274 processKey(mapper, BTN_BACK, 1);
4275 processSync(mapper);
4276 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4277 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4278 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004279
Michael Wrightd02c5b62014-02-10 15:10:22 -08004280 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004281 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004282 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4283
4284 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4285 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4286 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004287
4288 processKey(mapper, BTN_BACK, 0);
4289 processSync(mapper);
4290 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004291 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004292 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004293
4294 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004295 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004296 ASSERT_EQ(0, motionArgs.buttonState);
4297
Michael Wrightd02c5b62014-02-10 15:10:22 -08004298 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4299 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4300 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4301
4302 // press BTN_SIDE, release BTN_SIDE
4303 processKey(mapper, BTN_SIDE, 1);
4304 processSync(mapper);
4305 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4306 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4307 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004308
Michael Wrightd02c5b62014-02-10 15:10:22 -08004309 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004310 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004311 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4312
4313 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4314 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4315 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004316
4317 processKey(mapper, BTN_SIDE, 0);
4318 processSync(mapper);
4319 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004320 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004321 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004322
4323 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004324 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004325 ASSERT_EQ(0, motionArgs.buttonState);
4326
Michael Wrightd02c5b62014-02-10 15:10:22 -08004327 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4328 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4329 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4330
4331 // press BTN_FORWARD, release BTN_FORWARD
4332 processKey(mapper, BTN_FORWARD, 1);
4333 processSync(mapper);
4334 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4335 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4336 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004337
Michael Wrightd02c5b62014-02-10 15:10:22 -08004338 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004339 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004340 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4341
4342 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4343 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4344 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004345
4346 processKey(mapper, BTN_FORWARD, 0);
4347 processSync(mapper);
4348 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004349 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004350 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004351
4352 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004353 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004354 ASSERT_EQ(0, motionArgs.buttonState);
4355
Michael Wrightd02c5b62014-02-10 15:10:22 -08004356 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4357 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4358 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4359
4360 // press BTN_EXTRA, release BTN_EXTRA
4361 processKey(mapper, BTN_EXTRA, 1);
4362 processSync(mapper);
4363 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4364 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4365 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004366
Michael Wrightd02c5b62014-02-10 15:10:22 -08004367 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004368 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004369 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4370
4371 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4372 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4373 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004374
4375 processKey(mapper, BTN_EXTRA, 0);
4376 processSync(mapper);
4377 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004378 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004379 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004380
4381 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004382 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004383 ASSERT_EQ(0, motionArgs.buttonState);
4384
Michael Wrightd02c5b62014-02-10 15:10:22 -08004385 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4386 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4387 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4388
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004389 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4390
Michael Wrightd02c5b62014-02-10 15:10:22 -08004391 // press BTN_STYLUS, release BTN_STYLUS
4392 processKey(mapper, BTN_STYLUS, 1);
4393 processSync(mapper);
4394 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4395 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004396 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
4397
4398 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4399 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4400 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004401
4402 processKey(mapper, BTN_STYLUS, 0);
4403 processSync(mapper);
4404 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004405 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004406 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004407
4408 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004409 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004410 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004411
4412 // press BTN_STYLUS2, release BTN_STYLUS2
4413 processKey(mapper, BTN_STYLUS2, 1);
4414 processSync(mapper);
4415 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4416 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004417 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
4418
4419 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4420 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4421 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004422
4423 processKey(mapper, BTN_STYLUS2, 0);
4424 processSync(mapper);
4425 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004426 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004427 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004428
4429 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004430 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004431 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004432
4433 // release touch
4434 processUp(mapper);
4435 processSync(mapper);
4436 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4437 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4438 ASSERT_EQ(0, motionArgs.buttonState);
4439}
4440
4441TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
4442 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4443 addConfigurationProperty("touch.deviceType", "touchScreen");
4444 prepareDisplay(DISPLAY_ORIENTATION_0);
4445 prepareButtons();
4446 prepareAxes(POSITION);
4447 addMapperAndConfigure(mapper);
4448
4449 NotifyMotionArgs motionArgs;
4450
4451 // default tool type is finger
4452 processDown(mapper, 100, 200);
4453 processSync(mapper);
4454 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4455 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4456 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4457
4458 // eraser
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 // stylus
4466 processKey(mapper, BTN_TOOL_RUBBER, 0);
4467 processKey(mapper, BTN_TOOL_PEN, 1);
4468 processSync(mapper);
4469 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4470 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4471 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4472
4473 // brush
4474 processKey(mapper, BTN_TOOL_PEN, 0);
4475 processKey(mapper, BTN_TOOL_BRUSH, 1);
4476 processSync(mapper);
4477 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4478 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4479 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4480
4481 // pencil
4482 processKey(mapper, BTN_TOOL_BRUSH, 0);
4483 processKey(mapper, BTN_TOOL_PENCIL, 1);
4484 processSync(mapper);
4485 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4486 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4487 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4488
4489 // airbrush
4490 processKey(mapper, BTN_TOOL_PENCIL, 0);
4491 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
4492 processSync(mapper);
4493 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4494 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4495 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4496
4497 // mouse
4498 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
4499 processKey(mapper, BTN_TOOL_MOUSE, 1);
4500 processSync(mapper);
4501 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4502 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4503 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4504
4505 // lens
4506 processKey(mapper, BTN_TOOL_MOUSE, 0);
4507 processKey(mapper, BTN_TOOL_LENS, 1);
4508 processSync(mapper);
4509 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4510 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4511 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4512
4513 // double-tap
4514 processKey(mapper, BTN_TOOL_LENS, 0);
4515 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
4516 processSync(mapper);
4517 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4518 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4519 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4520
4521 // triple-tap
4522 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
4523 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
4524 processSync(mapper);
4525 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4526 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4527 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4528
4529 // quad-tap
4530 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
4531 processKey(mapper, BTN_TOOL_QUADTAP, 1);
4532 processSync(mapper);
4533 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4534 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4535 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4536
4537 // finger
4538 processKey(mapper, BTN_TOOL_QUADTAP, 0);
4539 processKey(mapper, BTN_TOOL_FINGER, 1);
4540 processSync(mapper);
4541 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4542 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4543 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4544
4545 // stylus trumps finger
4546 processKey(mapper, BTN_TOOL_PEN, 1);
4547 processSync(mapper);
4548 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4549 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4550 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4551
4552 // eraser trumps stylus
4553 processKey(mapper, BTN_TOOL_RUBBER, 1);
4554 processSync(mapper);
4555 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4556 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4557 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4558
4559 // mouse trumps eraser
4560 processKey(mapper, BTN_TOOL_MOUSE, 1);
4561 processSync(mapper);
4562 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4563 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4564 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4565
4566 // back to default tool type
4567 processKey(mapper, BTN_TOOL_MOUSE, 0);
4568 processKey(mapper, BTN_TOOL_RUBBER, 0);
4569 processKey(mapper, BTN_TOOL_PEN, 0);
4570 processKey(mapper, BTN_TOOL_FINGER, 0);
4571 processSync(mapper);
4572 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4573 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4574 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4575}
4576
4577TEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
4578 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4579 addConfigurationProperty("touch.deviceType", "touchScreen");
4580 prepareDisplay(DISPLAY_ORIENTATION_0);
4581 prepareButtons();
4582 prepareAxes(POSITION);
4583 mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0);
4584 addMapperAndConfigure(mapper);
4585
4586 NotifyMotionArgs motionArgs;
4587
4588 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
4589 processKey(mapper, BTN_TOOL_FINGER, 1);
4590 processMove(mapper, 100, 200);
4591 processSync(mapper);
4592 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4593 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4594 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4595 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4596
4597 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4598 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4599 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4600 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4601
4602 // move a little
4603 processMove(mapper, 150, 250);
4604 processSync(mapper);
4605 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4606 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4607 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4608 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4609
4610 // down when BTN_TOUCH is pressed, pressure defaults to 1
4611 processKey(mapper, BTN_TOUCH, 1);
4612 processSync(mapper);
4613 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4614 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4615 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4616 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4617
4618 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4619 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4620 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4621 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4622
4623 // up when BTN_TOUCH is released, hover restored
4624 processKey(mapper, BTN_TOUCH, 0);
4625 processSync(mapper);
4626 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4627 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4628 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4629 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4630
4631 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4632 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4633 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4634 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4635
4636 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4637 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4638 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4639 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4640
4641 // exit hover when pointer goes away
4642 processKey(mapper, BTN_TOOL_FINGER, 0);
4643 processSync(mapper);
4644 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4645 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4646 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4647 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4648}
4649
4650TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) {
4651 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4652 addConfigurationProperty("touch.deviceType", "touchScreen");
4653 prepareDisplay(DISPLAY_ORIENTATION_0);
4654 prepareButtons();
4655 prepareAxes(POSITION | PRESSURE);
4656 addMapperAndConfigure(mapper);
4657
4658 NotifyMotionArgs motionArgs;
4659
4660 // initially hovering because pressure is 0
4661 processDown(mapper, 100, 200);
4662 processPressure(mapper, 0);
4663 processSync(mapper);
4664 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4665 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4666 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4667 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4668
4669 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4670 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4671 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4672 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4673
4674 // move a little
4675 processMove(mapper, 150, 250);
4676 processSync(mapper);
4677 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4678 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4679 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4680 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4681
4682 // down when pressure is non-zero
4683 processPressure(mapper, RAW_PRESSURE_MAX);
4684 processSync(mapper);
4685 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4686 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4687 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4688 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4689
4690 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4691 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4692 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4693 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4694
4695 // up when pressure becomes 0, hover restored
4696 processPressure(mapper, 0);
4697 processSync(mapper);
4698 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4699 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4700 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4701 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4702
4703 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4704 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4705 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4706 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4707
4708 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4709 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4710 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4711 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4712
4713 // exit hover when pointer goes away
4714 processUp(mapper);
4715 processSync(mapper);
4716 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4717 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4718 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4719 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4720}
4721
Dan Harmsaca28402018-12-17 13:55:20 -08004722
Michael Wrightd02c5b62014-02-10 15:10:22 -08004723// --- MultiTouchInputMapperTest ---
4724
4725class MultiTouchInputMapperTest : public TouchInputMapperTest {
4726protected:
4727 void prepareAxes(int axes);
4728
4729 void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
4730 void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
4731 void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
4732 void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
4733 void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
4734 void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
4735 void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
4736 void processDistance(MultiTouchInputMapper* mapper, int32_t distance);
4737 void processId(MultiTouchInputMapper* mapper, int32_t id);
4738 void processSlot(MultiTouchInputMapper* mapper, int32_t slot);
4739 void processToolType(MultiTouchInputMapper* mapper, int32_t toolType);
4740 void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value);
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004741 void processTimestamp(MultiTouchInputMapper* mapper, uint32_t value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004742 void processMTSync(MultiTouchInputMapper* mapper);
4743 void processSync(MultiTouchInputMapper* mapper);
4744};
4745
4746void MultiTouchInputMapperTest::prepareAxes(int axes) {
4747 if (axes & POSITION) {
4748 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X,
4749 RAW_X_MIN, RAW_X_MAX, 0, 0);
4750 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y,
4751 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
4752 }
4753 if (axes & TOUCH) {
4754 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR,
4755 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4756 if (axes & MINOR) {
4757 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
4758 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4759 }
4760 }
4761 if (axes & TOOL) {
4762 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR,
4763 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
4764 if (axes & MINOR) {
4765 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
4766 RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
4767 }
4768 }
4769 if (axes & ORIENTATION) {
4770 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION,
4771 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
4772 }
4773 if (axes & PRESSURE) {
4774 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE,
4775 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
4776 }
4777 if (axes & DISTANCE) {
4778 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE,
4779 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
4780 }
4781 if (axes & ID) {
4782 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
4783 RAW_ID_MIN, RAW_ID_MAX, 0, 0);
4784 }
4785 if (axes & SLOT) {
4786 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT,
4787 RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0);
4788 mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0);
4789 }
4790 if (axes & TOOL_TYPE) {
4791 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE,
4792 0, MT_TOOL_MAX, 0, 0);
4793 }
4794}
4795
4796void MultiTouchInputMapperTest::processPosition(
4797 MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004798 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, x);
4799 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004800}
4801
4802void MultiTouchInputMapperTest::processTouchMajor(
4803 MultiTouchInputMapper* mapper, int32_t touchMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004804 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004805}
4806
4807void MultiTouchInputMapperTest::processTouchMinor(
4808 MultiTouchInputMapper* mapper, int32_t touchMinor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004809 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004810}
4811
4812void MultiTouchInputMapperTest::processToolMajor(
4813 MultiTouchInputMapper* mapper, int32_t toolMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004814 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004815}
4816
4817void MultiTouchInputMapperTest::processToolMinor(
4818 MultiTouchInputMapper* mapper, int32_t toolMinor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004819 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004820}
4821
4822void MultiTouchInputMapperTest::processOrientation(
4823 MultiTouchInputMapper* mapper, int32_t orientation) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004824 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_ORIENTATION, orientation);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004825}
4826
4827void MultiTouchInputMapperTest::processPressure(
4828 MultiTouchInputMapper* mapper, int32_t pressure) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004829 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_PRESSURE, pressure);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004830}
4831
4832void MultiTouchInputMapperTest::processDistance(
4833 MultiTouchInputMapper* mapper, int32_t distance) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004834 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_DISTANCE, distance);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004835}
4836
4837void MultiTouchInputMapperTest::processId(
4838 MultiTouchInputMapper* mapper, int32_t id) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004839 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, id);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004840}
4841
4842void MultiTouchInputMapperTest::processSlot(
4843 MultiTouchInputMapper* mapper, int32_t slot) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004844 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, slot);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004845}
4846
4847void MultiTouchInputMapperTest::processToolType(
4848 MultiTouchInputMapper* mapper, int32_t toolType) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004849 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, toolType);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004850}
4851
4852void MultiTouchInputMapperTest::processKey(
4853 MultiTouchInputMapper* mapper, int32_t code, int32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004854 process(mapper, ARBITRARY_TIME, EV_KEY, code, value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004855}
4856
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004857void MultiTouchInputMapperTest::processTimestamp(MultiTouchInputMapper* mapper, uint32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004858 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_TIMESTAMP, value);
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004859}
4860
Michael Wrightd02c5b62014-02-10 15:10:22 -08004861void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004862 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_MT_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004863}
4864
4865void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004866 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004867}
4868
4869
4870TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) {
4871 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4872 addConfigurationProperty("touch.deviceType", "touchScreen");
4873 prepareDisplay(DISPLAY_ORIENTATION_0);
4874 prepareAxes(POSITION);
4875 prepareVirtualKeys();
4876 addMapperAndConfigure(mapper);
4877
4878 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4879
4880 NotifyMotionArgs motionArgs;
4881
4882 // Two fingers down at once.
4883 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4884 processPosition(mapper, x1, y1);
4885 processMTSync(mapper);
4886 processPosition(mapper, x2, y2);
4887 processMTSync(mapper);
4888 processSync(mapper);
4889
4890 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4891 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4892 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4893 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4894 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4895 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4896 ASSERT_EQ(0, motionArgs.flags);
4897 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4898 ASSERT_EQ(0, motionArgs.buttonState);
4899 ASSERT_EQ(0, motionArgs.edgeFlags);
4900 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4901 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4902 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4903 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4904 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4905 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4906 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4907 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4908
4909 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4910 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4911 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4912 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4913 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4914 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4915 motionArgs.action);
4916 ASSERT_EQ(0, motionArgs.flags);
4917 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4918 ASSERT_EQ(0, motionArgs.buttonState);
4919 ASSERT_EQ(0, motionArgs.edgeFlags);
4920 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4921 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4922 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4923 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4924 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4925 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4926 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4927 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4928 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4929 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4930 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4931 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4932
4933 // Move.
4934 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4935 processPosition(mapper, x1, y1);
4936 processMTSync(mapper);
4937 processPosition(mapper, x2, y2);
4938 processMTSync(mapper);
4939 processSync(mapper);
4940
4941 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4942 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4943 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4944 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4945 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4946 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4947 ASSERT_EQ(0, motionArgs.flags);
4948 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4949 ASSERT_EQ(0, motionArgs.buttonState);
4950 ASSERT_EQ(0, motionArgs.edgeFlags);
4951 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4952 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4953 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4954 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4955 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4956 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4957 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4958 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4959 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4960 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4961 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4962 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4963
4964 // First finger up.
4965 x2 += 15; y2 -= 20;
4966 processPosition(mapper, x2, y2);
4967 processMTSync(mapper);
4968 processSync(mapper);
4969
4970 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4971 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4972 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4973 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4974 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4975 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4976 motionArgs.action);
4977 ASSERT_EQ(0, motionArgs.flags);
4978 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4979 ASSERT_EQ(0, motionArgs.buttonState);
4980 ASSERT_EQ(0, motionArgs.edgeFlags);
4981 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4982 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4983 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4984 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4985 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4986 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4987 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4988 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4989 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4990 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4991 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4992 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4993
4994 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4995 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4996 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4997 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4998 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4999 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5000 ASSERT_EQ(0, motionArgs.flags);
5001 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5002 ASSERT_EQ(0, motionArgs.buttonState);
5003 ASSERT_EQ(0, motionArgs.edgeFlags);
5004 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5005 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5006 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5007 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5008 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5009 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5010 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5011 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5012
5013 // Move.
5014 x2 += 20; y2 -= 25;
5015 processPosition(mapper, x2, y2);
5016 processMTSync(mapper);
5017 processSync(mapper);
5018
5019 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5020 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5021 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5022 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5023 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5024 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5025 ASSERT_EQ(0, motionArgs.flags);
5026 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5027 ASSERT_EQ(0, motionArgs.buttonState);
5028 ASSERT_EQ(0, motionArgs.edgeFlags);
5029 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5030 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5031 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5032 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5033 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5034 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5035 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5036 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5037
5038 // New finger down.
5039 int32_t x3 = 700, y3 = 300;
5040 processPosition(mapper, x2, y2);
5041 processMTSync(mapper);
5042 processPosition(mapper, x3, y3);
5043 processMTSync(mapper);
5044 processSync(mapper);
5045
5046 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5047 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5048 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5049 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5050 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5051 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5052 motionArgs.action);
5053 ASSERT_EQ(0, motionArgs.flags);
5054 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5055 ASSERT_EQ(0, motionArgs.buttonState);
5056 ASSERT_EQ(0, motionArgs.edgeFlags);
5057 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5058 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5059 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5060 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5061 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5062 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5063 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5064 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5065 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5066 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5067 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5068 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5069
5070 // Second finger up.
5071 x3 += 30; y3 -= 20;
5072 processPosition(mapper, x3, y3);
5073 processMTSync(mapper);
5074 processSync(mapper);
5075
5076 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5077 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5078 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5079 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5080 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5081 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5082 motionArgs.action);
5083 ASSERT_EQ(0, motionArgs.flags);
5084 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5085 ASSERT_EQ(0, motionArgs.buttonState);
5086 ASSERT_EQ(0, motionArgs.edgeFlags);
5087 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5088 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5089 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5090 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5091 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5092 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5093 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5094 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5095 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5096 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5097 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5098 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5099
5100 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5101 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5102 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5103 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5104 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5105 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5106 ASSERT_EQ(0, motionArgs.flags);
5107 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5108 ASSERT_EQ(0, motionArgs.buttonState);
5109 ASSERT_EQ(0, motionArgs.edgeFlags);
5110 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5111 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5112 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5113 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5114 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5115 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5116 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5117 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5118
5119 // Last finger up.
5120 processMTSync(mapper);
5121 processSync(mapper);
5122
5123 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5124 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5125 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5126 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5127 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5128 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5129 ASSERT_EQ(0, motionArgs.flags);
5130 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5131 ASSERT_EQ(0, motionArgs.buttonState);
5132 ASSERT_EQ(0, motionArgs.edgeFlags);
5133 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5134 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5135 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5136 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5137 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5138 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5139 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5140 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5141
5142 // Should not have sent any more keys or motions.
5143 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5144 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5145}
5146
5147TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
5148 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5149 addConfigurationProperty("touch.deviceType", "touchScreen");
5150 prepareDisplay(DISPLAY_ORIENTATION_0);
5151 prepareAxes(POSITION | ID);
5152 prepareVirtualKeys();
5153 addMapperAndConfigure(mapper);
5154
5155 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5156
5157 NotifyMotionArgs motionArgs;
5158
5159 // Two fingers down at once.
5160 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5161 processPosition(mapper, x1, y1);
5162 processId(mapper, 1);
5163 processMTSync(mapper);
5164 processPosition(mapper, x2, y2);
5165 processId(mapper, 2);
5166 processMTSync(mapper);
5167 processSync(mapper);
5168
5169 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5170 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5171 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5172 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5173 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5174 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5175 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5176
5177 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5178 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5179 motionArgs.action);
5180 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5181 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5182 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5183 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5184 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5185 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5186 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5187 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5188 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5189
5190 // Move.
5191 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5192 processPosition(mapper, x1, y1);
5193 processId(mapper, 1);
5194 processMTSync(mapper);
5195 processPosition(mapper, x2, y2);
5196 processId(mapper, 2);
5197 processMTSync(mapper);
5198 processSync(mapper);
5199
5200 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5201 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5202 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5203 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5204 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5205 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5206 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5207 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5208 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5209 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5210 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5211
5212 // First finger up.
5213 x2 += 15; y2 -= 20;
5214 processPosition(mapper, x2, y2);
5215 processId(mapper, 2);
5216 processMTSync(mapper);
5217 processSync(mapper);
5218
5219 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5220 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5221 motionArgs.action);
5222 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5223 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5224 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5225 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5226 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5227 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5228 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5229 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5230 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5231
5232 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5233 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5234 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5235 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5236 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5237 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5238 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5239
5240 // Move.
5241 x2 += 20; y2 -= 25;
5242 processPosition(mapper, x2, y2);
5243 processId(mapper, 2);
5244 processMTSync(mapper);
5245 processSync(mapper);
5246
5247 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5248 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5249 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5250 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5251 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5252 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5253 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5254
5255 // New finger down.
5256 int32_t x3 = 700, y3 = 300;
5257 processPosition(mapper, x2, y2);
5258 processId(mapper, 2);
5259 processMTSync(mapper);
5260 processPosition(mapper, x3, y3);
5261 processId(mapper, 3);
5262 processMTSync(mapper);
5263 processSync(mapper);
5264
5265 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5266 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5267 motionArgs.action);
5268 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5269 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5270 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5271 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5272 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5273 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5274 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5275 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5276 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5277
5278 // Second finger up.
5279 x3 += 30; y3 -= 20;
5280 processPosition(mapper, x3, y3);
5281 processId(mapper, 3);
5282 processMTSync(mapper);
5283 processSync(mapper);
5284
5285 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5286 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5287 motionArgs.action);
5288 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5289 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5290 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5291 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5292 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5293 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5294 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5295 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5296 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5297
5298 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5299 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5300 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5301 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5302 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5303 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5304 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5305
5306 // Last finger up.
5307 processMTSync(mapper);
5308 processSync(mapper);
5309
5310 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5311 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5312 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5313 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5314 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5315 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5316 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5317
5318 // Should not have sent any more keys or motions.
5319 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5320 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5321}
5322
5323TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) {
5324 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5325 addConfigurationProperty("touch.deviceType", "touchScreen");
5326 prepareDisplay(DISPLAY_ORIENTATION_0);
5327 prepareAxes(POSITION | ID | SLOT);
5328 prepareVirtualKeys();
5329 addMapperAndConfigure(mapper);
5330
5331 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5332
5333 NotifyMotionArgs motionArgs;
5334
5335 // Two fingers down at once.
5336 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5337 processPosition(mapper, x1, y1);
5338 processId(mapper, 1);
5339 processSlot(mapper, 1);
5340 processPosition(mapper, x2, y2);
5341 processId(mapper, 2);
5342 processSync(mapper);
5343
5344 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5345 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5346 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5347 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5348 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5349 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5350 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5351
5352 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5353 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5354 motionArgs.action);
5355 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5356 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5357 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5358 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5359 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5360 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5361 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5362 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5363 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5364
5365 // Move.
5366 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5367 processSlot(mapper, 0);
5368 processPosition(mapper, x1, y1);
5369 processSlot(mapper, 1);
5370 processPosition(mapper, x2, y2);
5371 processSync(mapper);
5372
5373 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5374 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5375 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5376 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5377 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5378 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5379 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5380 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5381 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5382 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5383 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5384
5385 // First finger up.
5386 x2 += 15; y2 -= 20;
5387 processSlot(mapper, 0);
5388 processId(mapper, -1);
5389 processSlot(mapper, 1);
5390 processPosition(mapper, x2, y2);
5391 processSync(mapper);
5392
5393 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5394 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5395 motionArgs.action);
5396 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5397 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5398 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5399 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5400 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5401 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5402 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5403 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5404 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5405
5406 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5407 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5408 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5409 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5410 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5411 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5412 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5413
5414 // Move.
5415 x2 += 20; y2 -= 25;
5416 processPosition(mapper, x2, y2);
5417 processSync(mapper);
5418
5419 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5420 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5421 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5422 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5423 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5424 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5425 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5426
5427 // New finger down.
5428 int32_t x3 = 700, y3 = 300;
5429 processPosition(mapper, x2, y2);
5430 processSlot(mapper, 0);
5431 processId(mapper, 3);
5432 processPosition(mapper, x3, y3);
5433 processSync(mapper);
5434
5435 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5436 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5437 motionArgs.action);
5438 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5439 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5440 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5441 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5442 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5443 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5444 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5445 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5446 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5447
5448 // Second finger up.
5449 x3 += 30; y3 -= 20;
5450 processSlot(mapper, 1);
5451 processId(mapper, -1);
5452 processSlot(mapper, 0);
5453 processPosition(mapper, x3, y3);
5454 processSync(mapper);
5455
5456 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5457 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5458 motionArgs.action);
5459 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5460 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5461 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5462 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5463 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5464 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5465 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5466 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5467 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5468
5469 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5470 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5471 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5472 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5473 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5474 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5475 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5476
5477 // Last finger up.
5478 processId(mapper, -1);
5479 processSync(mapper);
5480
5481 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5482 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5483 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5484 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5485 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5486 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5487 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5488
5489 // Should not have sent any more keys or motions.
5490 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5491 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5492}
5493
5494TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
5495 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5496 addConfigurationProperty("touch.deviceType", "touchScreen");
5497 prepareDisplay(DISPLAY_ORIENTATION_0);
5498 prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE);
5499 addMapperAndConfigure(mapper);
5500
5501 // These calculations are based on the input device calibration documentation.
5502 int32_t rawX = 100;
5503 int32_t rawY = 200;
5504 int32_t rawTouchMajor = 7;
5505 int32_t rawTouchMinor = 6;
5506 int32_t rawToolMajor = 9;
5507 int32_t rawToolMinor = 8;
5508 int32_t rawPressure = 11;
5509 int32_t rawDistance = 0;
5510 int32_t rawOrientation = 3;
5511 int32_t id = 5;
5512
5513 float x = toDisplayX(rawX);
5514 float y = toDisplayY(rawY);
5515 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
5516 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5517 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5518 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5519 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5520 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5521 float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
5522 float distance = float(rawDistance);
5523
5524 processPosition(mapper, rawX, rawY);
5525 processTouchMajor(mapper, rawTouchMajor);
5526 processTouchMinor(mapper, rawTouchMinor);
5527 processToolMajor(mapper, rawToolMajor);
5528 processToolMinor(mapper, rawToolMinor);
5529 processPressure(mapper, rawPressure);
5530 processOrientation(mapper, rawOrientation);
5531 processDistance(mapper, rawDistance);
5532 processId(mapper, id);
5533 processMTSync(mapper);
5534 processSync(mapper);
5535
5536 NotifyMotionArgs args;
5537 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5538 ASSERT_EQ(0, args.pointerProperties[0].id);
5539 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5540 x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor,
5541 orientation, distance));
5542}
5543
5544TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
5545 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5546 addConfigurationProperty("touch.deviceType", "touchScreen");
5547 prepareDisplay(DISPLAY_ORIENTATION_0);
5548 prepareAxes(POSITION | TOUCH | TOOL | MINOR);
5549 addConfigurationProperty("touch.size.calibration", "geometric");
5550 addMapperAndConfigure(mapper);
5551
5552 // These calculations are based on the input device calibration documentation.
5553 int32_t rawX = 100;
5554 int32_t rawY = 200;
5555 int32_t rawTouchMajor = 140;
5556 int32_t rawTouchMinor = 120;
5557 int32_t rawToolMajor = 180;
5558 int32_t rawToolMinor = 160;
5559
5560 float x = toDisplayX(rawX);
5561 float y = toDisplayY(rawY);
5562 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5563 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5564 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5565 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5566 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5567
5568 processPosition(mapper, rawX, rawY);
5569 processTouchMajor(mapper, rawTouchMajor);
5570 processTouchMinor(mapper, rawTouchMinor);
5571 processToolMajor(mapper, rawToolMajor);
5572 processToolMinor(mapper, rawToolMinor);
5573 processMTSync(mapper);
5574 processSync(mapper);
5575
5576 NotifyMotionArgs args;
5577 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5578 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5579 x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0));
5580}
5581
5582TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) {
5583 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5584 addConfigurationProperty("touch.deviceType", "touchScreen");
5585 prepareDisplay(DISPLAY_ORIENTATION_0);
5586 prepareAxes(POSITION | TOUCH | TOOL);
5587 addConfigurationProperty("touch.size.calibration", "diameter");
5588 addConfigurationProperty("touch.size.scale", "10");
5589 addConfigurationProperty("touch.size.bias", "160");
5590 addConfigurationProperty("touch.size.isSummed", "1");
5591 addMapperAndConfigure(mapper);
5592
5593 // These calculations are based on the input device calibration documentation.
5594 // Note: We only provide a single common touch/tool value because the device is assumed
5595 // not to emit separate values for each pointer (isSummed = 1).
5596 int32_t rawX = 100;
5597 int32_t rawY = 200;
5598 int32_t rawX2 = 150;
5599 int32_t rawY2 = 250;
5600 int32_t rawTouchMajor = 5;
5601 int32_t rawToolMajor = 8;
5602
5603 float x = toDisplayX(rawX);
5604 float y = toDisplayY(rawY);
5605 float x2 = toDisplayX(rawX2);
5606 float y2 = toDisplayY(rawY2);
5607 float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX;
5608 float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f;
5609 float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f;
5610
5611 processPosition(mapper, rawX, rawY);
5612 processTouchMajor(mapper, rawTouchMajor);
5613 processToolMajor(mapper, rawToolMajor);
5614 processMTSync(mapper);
5615 processPosition(mapper, rawX2, rawY2);
5616 processTouchMajor(mapper, rawTouchMajor);
5617 processToolMajor(mapper, rawToolMajor);
5618 processMTSync(mapper);
5619 processSync(mapper);
5620
5621 NotifyMotionArgs args;
5622 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5623 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
5624
5625 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5626 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5627 args.action);
5628 ASSERT_EQ(size_t(2), args.pointerCount);
5629 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5630 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5631 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
5632 x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0));
5633}
5634
5635TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) {
5636 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5637 addConfigurationProperty("touch.deviceType", "touchScreen");
5638 prepareDisplay(DISPLAY_ORIENTATION_0);
5639 prepareAxes(POSITION | TOUCH | TOOL);
5640 addConfigurationProperty("touch.size.calibration", "area");
5641 addConfigurationProperty("touch.size.scale", "43");
5642 addConfigurationProperty("touch.size.bias", "3");
5643 addMapperAndConfigure(mapper);
5644
5645 // These calculations are based on the input device calibration documentation.
5646 int32_t rawX = 100;
5647 int32_t rawY = 200;
5648 int32_t rawTouchMajor = 5;
5649 int32_t rawToolMajor = 8;
5650
5651 float x = toDisplayX(rawX);
5652 float y = toDisplayY(rawY);
5653 float size = float(rawTouchMajor) / RAW_TOUCH_MAX;
5654 float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f;
5655 float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f;
5656
5657 processPosition(mapper, rawX, rawY);
5658 processTouchMajor(mapper, rawTouchMajor);
5659 processToolMajor(mapper, rawToolMajor);
5660 processMTSync(mapper);
5661 processSync(mapper);
5662
5663 NotifyMotionArgs args;
5664 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5665 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5666 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5667}
5668
5669TEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) {
5670 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5671 addConfigurationProperty("touch.deviceType", "touchScreen");
5672 prepareDisplay(DISPLAY_ORIENTATION_0);
5673 prepareAxes(POSITION | PRESSURE);
5674 addConfigurationProperty("touch.pressure.calibration", "amplitude");
5675 addConfigurationProperty("touch.pressure.scale", "0.01");
5676 addMapperAndConfigure(mapper);
5677
Michael Wrightaa449c92017-12-13 21:21:43 +00005678 InputDeviceInfo info;
5679 mapper->populateDeviceInfo(&info);
5680 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
5681 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TOUCHSCREEN,
5682 0.0f, RAW_PRESSURE_MAX * 0.01, 0.0f, 0.0f));
5683
Michael Wrightd02c5b62014-02-10 15:10:22 -08005684 // These calculations are based on the input device calibration documentation.
5685 int32_t rawX = 100;
5686 int32_t rawY = 200;
5687 int32_t rawPressure = 60;
5688
5689 float x = toDisplayX(rawX);
5690 float y = toDisplayY(rawY);
5691 float pressure = float(rawPressure) * 0.01f;
5692
5693 processPosition(mapper, rawX, rawY);
5694 processPressure(mapper, rawPressure);
5695 processMTSync(mapper);
5696 processSync(mapper);
5697
5698 NotifyMotionArgs args;
5699 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5700 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5701 x, y, pressure, 0, 0, 0, 0, 0, 0, 0));
5702}
5703
5704TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) {
5705 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5706 addConfigurationProperty("touch.deviceType", "touchScreen");
5707 prepareDisplay(DISPLAY_ORIENTATION_0);
5708 prepareAxes(POSITION | ID | SLOT);
5709 addMapperAndConfigure(mapper);
5710
5711 NotifyMotionArgs motionArgs;
5712 NotifyKeyArgs keyArgs;
5713
5714 processId(mapper, 1);
5715 processPosition(mapper, 100, 200);
5716 processSync(mapper);
5717 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5718 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5719 ASSERT_EQ(0, motionArgs.buttonState);
5720
5721 // press BTN_LEFT, release BTN_LEFT
5722 processKey(mapper, BTN_LEFT, 1);
5723 processSync(mapper);
5724 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5725 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5726 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5727
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005728 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5729 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5730 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5731
Michael Wrightd02c5b62014-02-10 15:10:22 -08005732 processKey(mapper, BTN_LEFT, 0);
5733 processSync(mapper);
5734 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005735 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005736 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005737
5738 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005739 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005740 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005741
5742 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
5743 processKey(mapper, BTN_RIGHT, 1);
5744 processKey(mapper, BTN_MIDDLE, 1);
5745 processSync(mapper);
5746 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5747 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5748 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5749 motionArgs.buttonState);
5750
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005751 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5752 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5753 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, 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_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5758 motionArgs.buttonState);
5759
Michael Wrightd02c5b62014-02-10 15:10:22 -08005760 processKey(mapper, BTN_RIGHT, 0);
5761 processSync(mapper);
5762 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005763 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005764 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005765
5766 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005767 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005768 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005769
5770 processKey(mapper, BTN_MIDDLE, 0);
5771 processSync(mapper);
5772 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005773 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005774 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005775
5776 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005777 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005778 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005779
5780 // press BTN_BACK, release BTN_BACK
5781 processKey(mapper, BTN_BACK, 1);
5782 processSync(mapper);
5783 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5784 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5785 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005786
Michael Wrightd02c5b62014-02-10 15:10:22 -08005787 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005788 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005789 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5790
5791 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5792 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5793 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005794
5795 processKey(mapper, BTN_BACK, 0);
5796 processSync(mapper);
5797 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005798 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005799 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005800
5801 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005802 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005803 ASSERT_EQ(0, motionArgs.buttonState);
5804
Michael Wrightd02c5b62014-02-10 15:10:22 -08005805 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5806 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5807 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5808
5809 // press BTN_SIDE, release BTN_SIDE
5810 processKey(mapper, BTN_SIDE, 1);
5811 processSync(mapper);
5812 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5813 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5814 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005815
Michael Wrightd02c5b62014-02-10 15:10:22 -08005816 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005817 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005818 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5819
5820 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5821 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5822 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005823
5824 processKey(mapper, BTN_SIDE, 0);
5825 processSync(mapper);
5826 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005827 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005828 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005829
5830 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005831 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005832 ASSERT_EQ(0, motionArgs.buttonState);
5833
Michael Wrightd02c5b62014-02-10 15:10:22 -08005834 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5835 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5836 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5837
5838 // press BTN_FORWARD, release BTN_FORWARD
5839 processKey(mapper, BTN_FORWARD, 1);
5840 processSync(mapper);
5841 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5842 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5843 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005844
Michael Wrightd02c5b62014-02-10 15:10:22 -08005845 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005846 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005847 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5848
5849 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5850 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5851 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005852
5853 processKey(mapper, BTN_FORWARD, 0);
5854 processSync(mapper);
5855 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005856 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005857 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005858
5859 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005860 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005861 ASSERT_EQ(0, motionArgs.buttonState);
5862
Michael Wrightd02c5b62014-02-10 15:10:22 -08005863 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5864 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5865 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5866
5867 // press BTN_EXTRA, release BTN_EXTRA
5868 processKey(mapper, BTN_EXTRA, 1);
5869 processSync(mapper);
5870 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5871 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5872 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005873
Michael Wrightd02c5b62014-02-10 15:10:22 -08005874 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005875 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005876 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5877
5878 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5879 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5880 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005881
5882 processKey(mapper, BTN_EXTRA, 0);
5883 processSync(mapper);
5884 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005885 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005886 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005887
5888 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005889 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005890 ASSERT_EQ(0, motionArgs.buttonState);
5891
Michael Wrightd02c5b62014-02-10 15:10:22 -08005892 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5893 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5894 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5895
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005896 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5897
Michael Wrightd02c5b62014-02-10 15:10:22 -08005898 // press BTN_STYLUS, release BTN_STYLUS
5899 processKey(mapper, BTN_STYLUS, 1);
5900 processSync(mapper);
5901 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5902 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005903 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
5904
5905 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5906 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5907 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005908
5909 processKey(mapper, BTN_STYLUS, 0);
5910 processSync(mapper);
5911 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005912 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005913 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005914
5915 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005916 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005917 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005918
5919 // press BTN_STYLUS2, release BTN_STYLUS2
5920 processKey(mapper, BTN_STYLUS2, 1);
5921 processSync(mapper);
5922 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5923 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005924 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
5925
5926 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5927 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5928 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005929
5930 processKey(mapper, BTN_STYLUS2, 0);
5931 processSync(mapper);
5932 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005933 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005934 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005935
5936 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005937 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005938 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005939
5940 // release touch
5941 processId(mapper, -1);
5942 processSync(mapper);
5943 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5944 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5945 ASSERT_EQ(0, motionArgs.buttonState);
5946}
5947
5948TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
5949 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5950 addConfigurationProperty("touch.deviceType", "touchScreen");
5951 prepareDisplay(DISPLAY_ORIENTATION_0);
5952 prepareAxes(POSITION | ID | SLOT | TOOL_TYPE);
5953 addMapperAndConfigure(mapper);
5954
5955 NotifyMotionArgs motionArgs;
5956
5957 // default tool type is finger
5958 processId(mapper, 1);
5959 processPosition(mapper, 100, 200);
5960 processSync(mapper);
5961 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5962 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5963 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5964
5965 // eraser
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 // stylus
5973 processKey(mapper, BTN_TOOL_RUBBER, 0);
5974 processKey(mapper, BTN_TOOL_PEN, 1);
5975 processSync(mapper);
5976 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5977 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5978 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5979
5980 // brush
5981 processKey(mapper, BTN_TOOL_PEN, 0);
5982 processKey(mapper, BTN_TOOL_BRUSH, 1);
5983 processSync(mapper);
5984 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5985 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5986 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5987
5988 // pencil
5989 processKey(mapper, BTN_TOOL_BRUSH, 0);
5990 processKey(mapper, BTN_TOOL_PENCIL, 1);
5991 processSync(mapper);
5992 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5993 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5994 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5995
5996 // airbrush
5997 processKey(mapper, BTN_TOOL_PENCIL, 0);
5998 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
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_STYLUS, motionArgs.pointerProperties[0].toolType);
6003
6004 // mouse
6005 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
6006 processKey(mapper, BTN_TOOL_MOUSE, 1);
6007 processSync(mapper);
6008 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6009 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6010 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
6011
6012 // lens
6013 processKey(mapper, BTN_TOOL_MOUSE, 0);
6014 processKey(mapper, BTN_TOOL_LENS, 1);
6015 processSync(mapper);
6016 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6017 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6018 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
6019
6020 // double-tap
6021 processKey(mapper, BTN_TOOL_LENS, 0);
6022 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
6023 processSync(mapper);
6024 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6025 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6026 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6027
6028 // triple-tap
6029 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
6030 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
6031 processSync(mapper);
6032 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6033 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6034 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6035
6036 // quad-tap
6037 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
6038 processKey(mapper, BTN_TOOL_QUADTAP, 1);
6039 processSync(mapper);
6040 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6041 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6042 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6043
6044 // finger
6045 processKey(mapper, BTN_TOOL_QUADTAP, 0);
6046 processKey(mapper, BTN_TOOL_FINGER, 1);
6047 processSync(mapper);
6048 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6049 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6050 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6051
6052 // stylus trumps finger
6053 processKey(mapper, BTN_TOOL_PEN, 1);
6054 processSync(mapper);
6055 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6056 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6057 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
6058
6059 // eraser trumps stylus
6060 processKey(mapper, BTN_TOOL_RUBBER, 1);
6061 processSync(mapper);
6062 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6063 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6064 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
6065
6066 // mouse trumps eraser
6067 processKey(mapper, BTN_TOOL_MOUSE, 1);
6068 processSync(mapper);
6069 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6070 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6071 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
6072
6073 // MT tool type trumps BTN tool types: MT_TOOL_FINGER
6074 processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE
6075 processSync(mapper);
6076 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6077 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6078 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6079
6080 // MT tool type trumps BTN tool types: MT_TOOL_PEN
6081 processToolType(mapper, MT_TOOL_PEN);
6082 processSync(mapper);
6083 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6084 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6085 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
6086
6087 // back to default tool type
6088 processToolType(mapper, -1); // use a deliberately undefined tool type, for testing
6089 processKey(mapper, BTN_TOOL_MOUSE, 0);
6090 processKey(mapper, BTN_TOOL_RUBBER, 0);
6091 processKey(mapper, BTN_TOOL_PEN, 0);
6092 processKey(mapper, BTN_TOOL_FINGER, 0);
6093 processSync(mapper);
6094 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6095 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6096 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6097}
6098
6099TEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
6100 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6101 addConfigurationProperty("touch.deviceType", "touchScreen");
6102 prepareDisplay(DISPLAY_ORIENTATION_0);
6103 prepareAxes(POSITION | ID | SLOT);
6104 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
6105 addMapperAndConfigure(mapper);
6106
6107 NotifyMotionArgs motionArgs;
6108
6109 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
6110 processId(mapper, 1);
6111 processPosition(mapper, 100, 200);
6112 processSync(mapper);
6113 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6114 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6115 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6116 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6117
6118 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6119 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6120 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6121 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6122
6123 // move a little
6124 processPosition(mapper, 150, 250);
6125 processSync(mapper);
6126 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6127 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6128 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6129 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6130
6131 // down when BTN_TOUCH is pressed, pressure defaults to 1
6132 processKey(mapper, BTN_TOUCH, 1);
6133 processSync(mapper);
6134 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6135 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6136 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6137 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6138
6139 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6140 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
6141 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6142 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6143
6144 // up when BTN_TOUCH is released, hover restored
6145 processKey(mapper, BTN_TOUCH, 0);
6146 processSync(mapper);
6147 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6148 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
6149 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6150 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6151
6152 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6153 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6154 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6155 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6156
6157 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6158 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6159 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6160 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6161
6162 // exit hover when pointer goes away
6163 processId(mapper, -1);
6164 processSync(mapper);
6165 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6166 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6167 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6168 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6169}
6170
6171TEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) {
6172 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6173 addConfigurationProperty("touch.deviceType", "touchScreen");
6174 prepareDisplay(DISPLAY_ORIENTATION_0);
6175 prepareAxes(POSITION | ID | SLOT | PRESSURE);
6176 addMapperAndConfigure(mapper);
6177
6178 NotifyMotionArgs motionArgs;
6179
6180 // initially hovering because pressure is 0
6181 processId(mapper, 1);
6182 processPosition(mapper, 100, 200);
6183 processPressure(mapper, 0);
6184 processSync(mapper);
6185 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6186 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6187 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6188 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6189
6190 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6191 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6192 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6193 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6194
6195 // move a little
6196 processPosition(mapper, 150, 250);
6197 processSync(mapper);
6198 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6199 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6200 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6201 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6202
6203 // down when pressure becomes non-zero
6204 processPressure(mapper, RAW_PRESSURE_MAX);
6205 processSync(mapper);
6206 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6207 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6208 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6209 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6210
6211 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6212 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
6213 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6214 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6215
6216 // up when pressure becomes 0, hover restored
6217 processPressure(mapper, 0);
6218 processSync(mapper);
6219 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6220 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
6221 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6222 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6223
6224 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6225 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6226 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6227 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6228
6229 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6230 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6231 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6232 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6233
6234 // exit hover when pointer goes away
6235 processId(mapper, -1);
6236 processSync(mapper);
6237 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6238 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6239 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6240 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6241}
6242
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08006243TEST_F(MultiTouchInputMapperTest, Process_HandlesTimestamp) {
6244 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6245
6246 addConfigurationProperty("touch.deviceType", "touchScreen");
6247 prepareDisplay(DISPLAY_ORIENTATION_0);
6248 prepareAxes(POSITION);
6249 addMapperAndConfigure(mapper);
6250 NotifyMotionArgs args;
6251
6252 // By default, deviceTimestamp should be zero
6253 processPosition(mapper, 100, 100);
6254 processMTSync(mapper);
6255 processSync(mapper);
6256 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6257 ASSERT_EQ(0U, args.deviceTimestamp);
6258
6259 // Now the timestamp of 1000 is reported by evdev and should appear in MotionArgs
6260 processPosition(mapper, 0, 0);
6261 processTimestamp(mapper, 1000);
6262 processMTSync(mapper);
6263 processSync(mapper);
6264 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6265 ASSERT_EQ(1000U, args.deviceTimestamp);
6266}
6267
Siarhei Vishniakoueaf7acd2018-01-09 12:35:51 -08006268TEST_F(MultiTouchInputMapperTest, WhenMapperIsReset_TimestampIsCleared) {
6269 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6270
6271 addConfigurationProperty("touch.deviceType", "touchScreen");
6272 prepareDisplay(DISPLAY_ORIENTATION_0);
6273 prepareAxes(POSITION);
6274 addMapperAndConfigure(mapper);
6275 NotifyMotionArgs args;
6276
6277 // Send a touch event with a timestamp
6278 processPosition(mapper, 100, 100);
6279 processTimestamp(mapper, 1);
6280 processMTSync(mapper);
6281 processSync(mapper);
6282 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6283 ASSERT_EQ(1U, args.deviceTimestamp);
6284
6285 // Since the data accumulates, and new timestamp has not arrived, deviceTimestamp won't change
6286 processPosition(mapper, 100, 200);
6287 processMTSync(mapper);
6288 processSync(mapper);
6289 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6290 ASSERT_EQ(1U, args.deviceTimestamp);
6291
6292 mapper->reset(/* when */ 0);
6293 // After the mapper is reset, deviceTimestamp should become zero again
6294 processPosition(mapper, 100, 300);
6295 processMTSync(mapper);
6296 processSync(mapper);
6297 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6298 ASSERT_EQ(0U, args.deviceTimestamp);
6299}
6300
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07006301/**
6302 * Set the input device port <--> display port associations, and check that the
6303 * events are routed to the display that matches the display port.
6304 * This can be checked by looking at the displayId of the resulting NotifyMotionArgs.
6305 */
6306TEST_F(MultiTouchInputMapperTest, Configure_AssignsDisplayPort) {
6307 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6308 const std::string usb2 = "USB2";
6309 const uint8_t hdmi1 = 0;
6310 const uint8_t hdmi2 = 1;
6311 const std::string secondaryUniqueId = "uniqueId2";
6312 constexpr ViewportType type = ViewportType::VIEWPORT_EXTERNAL;
6313
6314 addConfigurationProperty("touch.deviceType", "touchScreen");
6315 prepareAxes(POSITION);
6316 addMapperAndConfigure(mapper);
6317
6318 mFakePolicy->addInputPortAssociation(DEVICE_LOCATION, hdmi1);
6319 mFakePolicy->addInputPortAssociation(usb2, hdmi2);
6320
6321 // We are intentionally not adding the viewport for display 1 yet. Since the port association
6322 // for this input device is specified, and the matching viewport is not present,
6323 // the input device should be disabled (at the mapper level).
6324
6325 // Add viewport for display 2 on hdmi2
6326 prepareSecondaryDisplay(type, hdmi2);
6327 // Send a touch event
6328 processPosition(mapper, 100, 100);
6329 processSync(mapper);
6330 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
6331
6332 // Add viewport for display 1 on hdmi1
6333 prepareDisplay(DISPLAY_ORIENTATION_0, hdmi1);
6334 // Send a touch event again
6335 processPosition(mapper, 100, 100);
6336 processSync(mapper);
6337
6338 NotifyMotionArgs args;
6339 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6340 ASSERT_EQ(DISPLAY_ID, args.displayId);
6341}
Michael Wrightd02c5b62014-02-10 15:10:22 -08006342
Arthur Hung41a712e2018-11-22 19:41:03 +08006343/**
6344 * Expect fallback to internal viewport if device is external and external viewport is not present.
6345 */
6346TEST_F(MultiTouchInputMapperTest, Viewports_Fallback) {
6347 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6348 prepareAxes(POSITION);
6349 addConfigurationProperty("touch.deviceType", "touchScreen");
6350 prepareDisplay(DISPLAY_ORIENTATION_0);
6351 mDevice->setExternal(true);
6352 addMapperAndConfigure(mapper);
6353
6354 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
6355
6356 NotifyMotionArgs motionArgs;
6357
6358 // Expect the event to be sent to the internal viewport,
6359 // because an external viewport is not present.
6360 processPosition(mapper, 100, 100);
6361 processSync(mapper);
6362 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6363 ASSERT_EQ(ADISPLAY_ID_DEFAULT, motionArgs.displayId);
6364
6365 // Expect the event to be sent to the external viewport if it is present.
6366 prepareSecondaryDisplay(ViewportType::VIEWPORT_EXTERNAL);
6367 processPosition(mapper, 100, 100);
6368 processSync(mapper);
6369 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6370 ASSERT_EQ(SECONDARY_DISPLAY_ID, motionArgs.displayId);
6371}
6372
Arthur Hungc7ad2d02018-12-18 17:41:29 +08006373TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShouldHandleDisplayId) {
6374 // Setup PointerController for second display.
6375 sp<FakePointerController> fakePointerController = new FakePointerController();
6376 fakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
6377 fakePointerController->setPosition(100, 200);
6378 fakePointerController->setButtonState(0);
6379 fakePointerController->setDisplayId(SECONDARY_DISPLAY_ID);
6380 mFakePolicy->setPointerController(mDevice->getId(), fakePointerController);
6381
6382 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6383 prepareDisplay(DISPLAY_ORIENTATION_0);
6384 prepareAxes(POSITION);
6385 addMapperAndConfigure(mapper);
6386
6387 // Check source is mouse that would obtain the PointerController.
6388 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
6389
6390 NotifyMotionArgs motionArgs;
6391 processPosition(mapper, 100, 100);
6392 processSync(mapper);
6393
6394 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6395 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6396 ASSERT_EQ(SECONDARY_DISPLAY_ID, motionArgs.displayId);
6397}
6398
Arthur Hung7c645402019-01-25 17:45:42 +08006399TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShowTouches) {
6400 // Setup the first touch screen device.
6401 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6402 prepareAxes(POSITION | ID | SLOT);
6403 addConfigurationProperty("touch.deviceType", "touchScreen");
6404 addMapperAndConfigure(mapper);
6405
6406 // Create the second touch screen device, and enable multi fingers.
6407 const std::string USB2 = "USB2";
6408 const int32_t SECOND_DEVICE_ID = 2;
6409 InputDeviceIdentifier identifier;
6410 identifier.name = DEVICE_NAME;
6411 identifier.location = USB2;
6412 InputDevice* device2 = new InputDevice(mFakeContext, SECOND_DEVICE_ID, DEVICE_GENERATION,
6413 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
6414 mFakeEventHub->addDevice(SECOND_DEVICE_ID, DEVICE_NAME, 0 /*classes*/);
6415 mFakeEventHub->addAbsoluteAxis(SECOND_DEVICE_ID, ABS_MT_POSITION_X, RAW_X_MIN, RAW_X_MAX,
6416 0 /*flat*/, 0 /*fuzz*/);
6417 mFakeEventHub->addAbsoluteAxis(SECOND_DEVICE_ID, ABS_MT_POSITION_Y, RAW_Y_MIN, RAW_Y_MAX,
6418 0 /*flat*/, 0 /*fuzz*/);
6419 mFakeEventHub->addAbsoluteAxis(SECOND_DEVICE_ID, ABS_MT_TRACKING_ID, RAW_ID_MIN, RAW_ID_MAX,
6420 0 /*flat*/, 0 /*fuzz*/);
6421 mFakeEventHub->addAbsoluteAxis(SECOND_DEVICE_ID, ABS_MT_SLOT, RAW_SLOT_MIN, RAW_SLOT_MAX,
6422 0 /*flat*/, 0 /*fuzz*/);
6423 mFakeEventHub->setAbsoluteAxisValue(SECOND_DEVICE_ID, ABS_MT_SLOT, 0 /*value*/);
6424 mFakeEventHub->addConfigurationProperty(SECOND_DEVICE_ID, String8("touch.deviceType"),
6425 String8("touchScreen"));
6426
6427 // Setup the second touch screen device.
6428 MultiTouchInputMapper* mapper2 = new MultiTouchInputMapper(device2);
6429 device2->addMapper(mapper2);
6430 device2->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 0 /*changes*/);
6431 device2->reset(ARBITRARY_TIME);
6432
6433 // Setup PointerController.
6434 sp<FakePointerController> fakePointerController = new FakePointerController();
6435 mFakePolicy->setPointerController(mDevice->getId(), fakePointerController);
6436 mFakePolicy->setPointerController(SECOND_DEVICE_ID, fakePointerController);
6437
6438 // Setup policy for associated displays and show touches.
6439 const uint8_t hdmi1 = 0;
6440 const uint8_t hdmi2 = 1;
6441 mFakePolicy->addInputPortAssociation(DEVICE_LOCATION, hdmi1);
6442 mFakePolicy->addInputPortAssociation(USB2, hdmi2);
6443 mFakePolicy->setShowTouches(true);
6444
6445 // Create displays.
6446 prepareDisplay(DISPLAY_ORIENTATION_0, hdmi1);
6447 prepareSecondaryDisplay(ViewportType::VIEWPORT_EXTERNAL, hdmi2);
6448
6449 // Default device will reconfigure above, need additional reconfiguration for another device.
6450 device2->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
6451 InputReaderConfiguration::CHANGE_DISPLAY_INFO);
6452
6453 // Two fingers down at default display.
6454 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
6455 processPosition(mapper, x1, y1);
6456 processId(mapper, 1);
6457 processSlot(mapper, 1);
6458 processPosition(mapper, x2, y2);
6459 processId(mapper, 2);
6460 processSync(mapper);
6461
6462 std::map<int32_t, std::vector<int32_t>>::const_iterator iter =
6463 fakePointerController->getSpots().find(DISPLAY_ID);
6464 ASSERT_TRUE(iter != fakePointerController->getSpots().end());
6465 ASSERT_EQ(size_t(2), iter->second.size());
6466
6467 // Two fingers down at second display.
6468 processPosition(mapper2, x1, y1);
6469 processId(mapper2, 1);
6470 processSlot(mapper2, 1);
6471 processPosition(mapper2, x2, y2);
6472 processId(mapper2, 2);
6473 processSync(mapper2);
6474
6475 iter = fakePointerController->getSpots().find(SECONDARY_DISPLAY_ID);
6476 ASSERT_TRUE(iter != fakePointerController->getSpots().end());
6477 ASSERT_EQ(size_t(2), iter->second.size());
6478}
6479
Michael Wrightd02c5b62014-02-10 15:10:22 -08006480} // namespace android