blob: b18cae3e8f9626319360ec2a38f919ca2b14cbe3 [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;
Andrii Kulian620f6d92018-09-14 16:51:59 -070060 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),
Andrii Kulian620f6d92018-09-14 16:51:59 -070068 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
Andrii Kulian620f6d92018-09-14 16:51:59 -070079 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
Andrii Kulian620f6d92018-09-14 16:51:59 -0700101 virtual int32_t getDisplayId() const {
102 return mDisplayId;
103 }
104
Michael Wrightd02c5b62014-02-10 15:10:22 -0800105private:
106 virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
107 *outMinX = mMinX;
108 *outMinY = mMinY;
109 *outMaxX = mMaxX;
110 *outMaxY = mMaxY;
111 return mHaveBounds;
112 }
113
114 virtual void move(float deltaX, float deltaY) {
115 mX += deltaX;
116 if (mX < mMinX) mX = mMinX;
117 if (mX > mMaxX) mX = mMaxX;
118 mY += deltaY;
119 if (mY < mMinY) mY = mMinY;
120 if (mY > mMaxY) mY = mMaxY;
121 }
122
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100123 virtual void fade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800124 }
125
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100126 virtual void unfade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800127 }
128
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100129 virtual void setPresentation(Presentation) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800130 }
131
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100132 virtual void setSpots(const PointerCoords*, const uint32_t*, BitSet32) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800133 }
134
135 virtual void clearSpots() {
136 }
137};
138
139
140// --- FakeInputReaderPolicy ---
141
142class FakeInputReaderPolicy : public InputReaderPolicyInterface {
143 InputReaderConfiguration mConfig;
144 KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
145 Vector<InputDeviceInfo> mInputDevices;
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100146 std::vector<DisplayViewport> mViewports;
Jason Gerecke489fda82012-09-07 17:19:40 -0700147 TouchAffineTransformation transform;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800148
149protected:
150 virtual ~FakeInputReaderPolicy() { }
151
152public:
153 FakeInputReaderPolicy() {
154 }
155
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700156 virtual void clearViewports() {
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100157 mViewports.clear();
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100158 mConfig.setDisplayViewports(mViewports);
Santos Cordonfa5cf462017-04-05 10:37:00 -0700159 }
160
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700161 std::optional<DisplayViewport> getDisplayViewportByUniqueId(const std::string& uniqueId) const {
162 return mConfig.getDisplayViewportByUniqueId(uniqueId);
163 }
164 std::optional<DisplayViewport> getDisplayViewportByType(ViewportType type) const {
165 return mConfig.getDisplayViewportByType(type);
166 }
167
168 std::optional<DisplayViewport> getDisplayViewportByPort(uint8_t displayPort) const {
169 return mConfig.getDisplayViewportByPort(displayPort);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700170 }
171
172 void addDisplayViewport(int32_t displayId, int32_t width, int32_t height, int32_t orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700173 const std::string& uniqueId, std::optional<uint8_t> physicalPort,
174 ViewportType viewportType) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700175 const DisplayViewport viewport = createDisplayViewport(displayId, width, height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700176 orientation, uniqueId, physicalPort, viewportType);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700177 mViewports.push_back(viewport);
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100178 mConfig.setDisplayViewports(mViewports);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800179 }
180
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100181 void addExcludedDeviceName(const std::string& deviceName) {
182 mConfig.excludedDeviceNames.push_back(deviceName);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800183 }
184
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700185 void addInputPortAssociation(const std::string& inputPort, uint8_t displayPort) {
186 mConfig.portAssociations.insert({inputPort, displayPort});
187 }
188
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700189 void addDisabledDevice(int32_t deviceId) {
190 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
191 bool currentlyEnabled = index < 0;
192 if (currentlyEnabled) {
193 mConfig.disabledDevices.add(deviceId);
194 }
195 }
196
197 void removeDisabledDevice(int32_t deviceId) {
198 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
199 bool currentlyEnabled = index < 0;
200 if (!currentlyEnabled) {
201 mConfig.disabledDevices.remove(deviceId);
202 }
203 }
204
Michael Wrightd02c5b62014-02-10 15:10:22 -0800205 void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
206 mPointerControllers.add(deviceId, controller);
207 }
208
209 const InputReaderConfiguration* getReaderConfiguration() const {
210 return &mConfig;
211 }
212
213 const Vector<InputDeviceInfo>& getInputDevices() const {
214 return mInputDevices;
215 }
216
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100217 TouchAffineTransformation getTouchAffineTransformation(const std::string& inputDeviceDescriptor,
Jason Gerecke71b16e82014-03-10 09:47:59 -0700218 int32_t surfaceRotation) {
Jason Gerecke489fda82012-09-07 17:19:40 -0700219 return transform;
220 }
221
222 void setTouchAffineTransformation(const TouchAffineTransformation t) {
223 transform = t;
Jason Gerecke12d6baa2014-01-27 18:34:20 -0800224 }
225
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800226 void setPointerCapture(bool enabled) {
227 mConfig.pointerCapture = enabled;
228 }
229
Michael Wrightd02c5b62014-02-10 15:10:22 -0800230private:
Santos Cordonfa5cf462017-04-05 10:37:00 -0700231 DisplayViewport createDisplayViewport(int32_t displayId, int32_t width, int32_t height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700232 int32_t orientation, const std::string& uniqueId, std::optional<uint8_t> physicalPort,
233 ViewportType type) {
Santos Cordonfa5cf462017-04-05 10:37:00 -0700234 bool isRotated = (orientation == DISPLAY_ORIENTATION_90
235 || orientation == DISPLAY_ORIENTATION_270);
236 DisplayViewport v;
237 v.displayId = displayId;
238 v.orientation = orientation;
239 v.logicalLeft = 0;
240 v.logicalTop = 0;
241 v.logicalRight = isRotated ? height : width;
242 v.logicalBottom = isRotated ? width : height;
243 v.physicalLeft = 0;
244 v.physicalTop = 0;
245 v.physicalRight = isRotated ? height : width;
246 v.physicalBottom = isRotated ? width : height;
247 v.deviceWidth = isRotated ? height : width;
248 v.deviceHeight = isRotated ? width : height;
249 v.uniqueId = uniqueId;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700250 v.physicalPort = physicalPort;
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100251 v.type = type;
Santos Cordonfa5cf462017-04-05 10:37:00 -0700252 return v;
253 }
254
Michael Wrightd02c5b62014-02-10 15:10:22 -0800255 virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) {
256 *outConfig = mConfig;
257 }
258
259 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
260 return mPointerControllers.valueFor(deviceId);
261 }
262
263 virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) {
264 mInputDevices = inputDevices;
265 }
266
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100267 virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const InputDeviceIdentifier&) {
Yi Kong9b14ac62018-07-17 13:48:38 -0700268 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800269 }
270
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100271 virtual std::string getDeviceAlias(const InputDeviceIdentifier&) {
272 return "";
Michael Wrightd02c5b62014-02-10 15:10:22 -0800273 }
Andrii Kulian620f6d92018-09-14 16:51:59 -0700274
275 virtual void updatePointerDisplay() {
276 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800277};
278
279
280// --- FakeInputListener ---
281
282class FakeInputListener : public InputListenerInterface {
283private:
284 List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue;
285 List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue;
286 List<NotifyKeyArgs> mNotifyKeyArgsQueue;
287 List<NotifyMotionArgs> mNotifyMotionArgsQueue;
288 List<NotifySwitchArgs> mNotifySwitchArgsQueue;
289
290protected:
291 virtual ~FakeInputListener() { }
292
293public:
294 FakeInputListener() {
295 }
296
297 void assertNotifyConfigurationChangedWasCalled(
Yi Kong9b14ac62018-07-17 13:48:38 -0700298 NotifyConfigurationChangedArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800299 ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty())
300 << "Expected notifyConfigurationChanged() to have been called.";
301 if (outEventArgs) {
302 *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin();
303 }
304 mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin());
305 }
306
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700307 void assertNotifyConfigurationChangedWasNotCalled() {
308 ASSERT_TRUE(mNotifyConfigurationChangedArgsQueue.empty())
309 << "Expected notifyConfigurationChanged() to not have been called.";
310 }
311
Michael Wrightd02c5b62014-02-10 15:10:22 -0800312 void assertNotifyDeviceResetWasCalled(
Yi Kong9b14ac62018-07-17 13:48:38 -0700313 NotifyDeviceResetArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800314 ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty())
315 << "Expected notifyDeviceReset() to have been called.";
316 if (outEventArgs) {
317 *outEventArgs = *mNotifyDeviceResetArgsQueue.begin();
318 }
319 mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin());
320 }
321
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700322 void assertNotifyDeviceResetWasNotCalled() {
323 ASSERT_TRUE(mNotifyDeviceResetArgsQueue.empty())
324 << "Expected notifyDeviceReset() to not have been called.";
325 }
326
Yi Kong9b14ac62018-07-17 13:48:38 -0700327 void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800328 ASSERT_FALSE(mNotifyKeyArgsQueue.empty())
329 << "Expected notifyKey() to have been called.";
330 if (outEventArgs) {
331 *outEventArgs = *mNotifyKeyArgsQueue.begin();
332 }
333 mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin());
334 }
335
336 void assertNotifyKeyWasNotCalled() {
337 ASSERT_TRUE(mNotifyKeyArgsQueue.empty())
338 << "Expected notifyKey() to not have been called.";
339 }
340
Yi Kong9b14ac62018-07-17 13:48:38 -0700341 void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800342 ASSERT_FALSE(mNotifyMotionArgsQueue.empty())
343 << "Expected notifyMotion() to have been called.";
344 if (outEventArgs) {
345 *outEventArgs = *mNotifyMotionArgsQueue.begin();
346 }
347 mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin());
348 }
349
350 void assertNotifyMotionWasNotCalled() {
351 ASSERT_TRUE(mNotifyMotionArgsQueue.empty())
352 << "Expected notifyMotion() to not have been called.";
353 }
354
Yi Kong9b14ac62018-07-17 13:48:38 -0700355 void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800356 ASSERT_FALSE(mNotifySwitchArgsQueue.empty())
357 << "Expected notifySwitch() to have been called.";
358 if (outEventArgs) {
359 *outEventArgs = *mNotifySwitchArgsQueue.begin();
360 }
361 mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin());
362 }
363
364private:
365 virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
366 mNotifyConfigurationChangedArgsQueue.push_back(*args);
367 }
368
369 virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) {
370 mNotifyDeviceResetArgsQueue.push_back(*args);
371 }
372
373 virtual void notifyKey(const NotifyKeyArgs* args) {
374 mNotifyKeyArgsQueue.push_back(*args);
375 }
376
377 virtual void notifyMotion(const NotifyMotionArgs* args) {
378 mNotifyMotionArgsQueue.push_back(*args);
379 }
380
381 virtual void notifySwitch(const NotifySwitchArgs* args) {
382 mNotifySwitchArgsQueue.push_back(*args);
383 }
384};
385
386
387// --- FakeEventHub ---
388
389class FakeEventHub : public EventHubInterface {
390 struct KeyInfo {
391 int32_t keyCode;
392 uint32_t flags;
393 };
394
395 struct Device {
396 InputDeviceIdentifier identifier;
397 uint32_t classes;
398 PropertyMap configuration;
399 KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
400 KeyedVector<int, bool> relativeAxes;
401 KeyedVector<int32_t, int32_t> keyCodeStates;
402 KeyedVector<int32_t, int32_t> scanCodeStates;
403 KeyedVector<int32_t, int32_t> switchStates;
404 KeyedVector<int32_t, int32_t> absoluteAxisValue;
405 KeyedVector<int32_t, KeyInfo> keysByScanCode;
406 KeyedVector<int32_t, KeyInfo> keysByUsageCode;
407 KeyedVector<int32_t, bool> leds;
408 Vector<VirtualKeyDefinition> virtualKeys;
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700409 bool enabled;
410
411 status_t enable() {
412 enabled = true;
413 return OK;
414 }
415
416 status_t disable() {
417 enabled = false;
418 return OK;
419 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800420
Chih-Hung Hsieh6ca70ef2016-04-29 16:23:55 -0700421 explicit Device(uint32_t classes) :
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700422 classes(classes), enabled(true) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800423 }
424 };
425
426 KeyedVector<int32_t, Device*> mDevices;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100427 std::vector<std::string> mExcludedDevices;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800428 List<RawEvent> mEvents;
429
430protected:
431 virtual ~FakeEventHub() {
432 for (size_t i = 0; i < mDevices.size(); i++) {
433 delete mDevices.valueAt(i);
434 }
435 }
436
437public:
438 FakeEventHub() { }
439
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100440 void addDevice(int32_t deviceId, const std::string& name, uint32_t classes) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800441 Device* device = new Device(classes);
442 device->identifier.name = name;
443 mDevices.add(deviceId, device);
444
445 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0);
446 }
447
448 void removeDevice(int32_t deviceId) {
449 delete mDevices.valueFor(deviceId);
450 mDevices.removeItem(deviceId);
451
452 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0);
453 }
454
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700455 bool isDeviceEnabled(int32_t deviceId) {
456 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700457 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700458 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
459 return false;
460 }
461 return device->enabled;
462 }
463
464 status_t enableDevice(int32_t deviceId) {
465 status_t result;
466 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700467 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700468 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
469 return BAD_VALUE;
470 }
471 if (device->enabled) {
472 ALOGW("Duplicate call to %s, device %" PRId32 " already enabled", __func__, deviceId);
473 return OK;
474 }
475 result = device->enable();
476 return result;
477 }
478
479 status_t disableDevice(int32_t deviceId) {
480 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700481 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700482 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
483 return BAD_VALUE;
484 }
485 if (!device->enabled) {
486 ALOGW("Duplicate call to %s, device %" PRId32 " already disabled", __func__, deviceId);
487 return OK;
488 }
489 return device->disable();
490 }
491
Michael Wrightd02c5b62014-02-10 15:10:22 -0800492 void finishDeviceScan() {
493 enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0);
494 }
495
496 void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) {
497 Device* device = getDevice(deviceId);
498 device->configuration.addProperty(key, value);
499 }
500
501 void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
502 Device* device = getDevice(deviceId);
503 device->configuration.addAll(configuration);
504 }
505
506 void addAbsoluteAxis(int32_t deviceId, int axis,
507 int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) {
508 Device* device = getDevice(deviceId);
509
510 RawAbsoluteAxisInfo info;
511 info.valid = true;
512 info.minValue = minValue;
513 info.maxValue = maxValue;
514 info.flat = flat;
515 info.fuzz = fuzz;
516 info.resolution = resolution;
517 device->absoluteAxes.add(axis, info);
518 }
519
520 void addRelativeAxis(int32_t deviceId, int32_t axis) {
521 Device* device = getDevice(deviceId);
522 device->relativeAxes.add(axis, true);
523 }
524
525 void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
526 Device* device = getDevice(deviceId);
527 device->keyCodeStates.replaceValueFor(keyCode, state);
528 }
529
530 void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
531 Device* device = getDevice(deviceId);
532 device->scanCodeStates.replaceValueFor(scanCode, state);
533 }
534
535 void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
536 Device* device = getDevice(deviceId);
537 device->switchStates.replaceValueFor(switchCode, state);
538 }
539
540 void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) {
541 Device* device = getDevice(deviceId);
542 device->absoluteAxisValue.replaceValueFor(axis, value);
543 }
544
545 void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
546 int32_t keyCode, uint32_t flags) {
547 Device* device = getDevice(deviceId);
548 KeyInfo info;
549 info.keyCode = keyCode;
550 info.flags = flags;
551 if (scanCode) {
552 device->keysByScanCode.add(scanCode, info);
553 }
554 if (usageCode) {
555 device->keysByUsageCode.add(usageCode, info);
556 }
557 }
558
559 void addLed(int32_t deviceId, int32_t led, bool initialState) {
560 Device* device = getDevice(deviceId);
561 device->leds.add(led, initialState);
562 }
563
564 bool getLedState(int32_t deviceId, int32_t led) {
565 Device* device = getDevice(deviceId);
566 return device->leds.valueFor(led);
567 }
568
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100569 std::vector<std::string>& getExcludedDevices() {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800570 return mExcludedDevices;
571 }
572
573 void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) {
574 Device* device = getDevice(deviceId);
575 device->virtualKeys.push(definition);
576 }
577
578 void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
579 int32_t code, int32_t value) {
580 RawEvent event;
581 event.when = when;
582 event.deviceId = deviceId;
583 event.type = type;
584 event.code = code;
585 event.value = value;
586 mEvents.push_back(event);
587
588 if (type == EV_ABS) {
589 setAbsoluteAxisValue(deviceId, code, value);
590 }
591 }
592
593 void assertQueueIsEmpty() {
594 ASSERT_EQ(size_t(0), mEvents.size())
595 << "Expected the event queue to be empty (fully consumed).";
596 }
597
598private:
599 Device* getDevice(int32_t deviceId) const {
600 ssize_t index = mDevices.indexOfKey(deviceId);
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100601 return index >= 0 ? mDevices.valueAt(index) : nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800602 }
603
604 virtual uint32_t getDeviceClasses(int32_t deviceId) const {
605 Device* device = getDevice(deviceId);
606 return device ? device->classes : 0;
607 }
608
609 virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
610 Device* device = getDevice(deviceId);
611 return device ? device->identifier : InputDeviceIdentifier();
612 }
613
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100614 virtual int32_t getDeviceControllerNumber(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800615 return 0;
616 }
617
618 virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
619 Device* device = getDevice(deviceId);
620 if (device) {
621 *outConfiguration = device->configuration;
622 }
623 }
624
625 virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
626 RawAbsoluteAxisInfo* outAxisInfo) const {
627 Device* device = getDevice(deviceId);
628 if (device) {
629 ssize_t index = device->absoluteAxes.indexOfKey(axis);
630 if (index >= 0) {
631 *outAxisInfo = device->absoluteAxes.valueAt(index);
632 return OK;
633 }
634 }
635 outAxisInfo->clear();
636 return -1;
637 }
638
639 virtual bool hasRelativeAxis(int32_t deviceId, int axis) const {
640 Device* device = getDevice(deviceId);
641 if (device) {
642 return device->relativeAxes.indexOfKey(axis) >= 0;
643 }
644 return false;
645 }
646
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100647 virtual bool hasInputProperty(int32_t, int) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800648 return false;
649 }
650
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700651 virtual status_t mapKey(int32_t deviceId,
652 int32_t scanCode, int32_t usageCode, int32_t metaState,
653 int32_t* outKeycode, int32_t *outMetaState, uint32_t* outFlags) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800654 Device* device = getDevice(deviceId);
655 if (device) {
656 const KeyInfo* key = getKey(device, scanCode, usageCode);
657 if (key) {
658 if (outKeycode) {
659 *outKeycode = key->keyCode;
660 }
661 if (outFlags) {
662 *outFlags = key->flags;
663 }
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700664 if (outMetaState) {
665 *outMetaState = metaState;
666 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800667 return OK;
668 }
669 }
670 return NAME_NOT_FOUND;
671 }
672
673 const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const {
674 if (usageCode) {
675 ssize_t index = device->keysByUsageCode.indexOfKey(usageCode);
676 if (index >= 0) {
677 return &device->keysByUsageCode.valueAt(index);
678 }
679 }
680 if (scanCode) {
681 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
682 if (index >= 0) {
683 return &device->keysByScanCode.valueAt(index);
684 }
685 }
Yi Kong9b14ac62018-07-17 13:48:38 -0700686 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800687 }
688
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100689 virtual status_t mapAxis(int32_t, int32_t, AxisInfo*) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800690 return NAME_NOT_FOUND;
691 }
692
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100693 virtual void setExcludedDevices(const std::vector<std::string>& devices) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800694 mExcludedDevices = devices;
695 }
696
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100697 virtual size_t getEvents(int, RawEvent* buffer, size_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800698 if (mEvents.empty()) {
699 return 0;
700 }
701
702 *buffer = *mEvents.begin();
703 mEvents.erase(mEvents.begin());
704 return 1;
705 }
706
707 virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
708 Device* device = getDevice(deviceId);
709 if (device) {
710 ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
711 if (index >= 0) {
712 return device->scanCodeStates.valueAt(index);
713 }
714 }
715 return AKEY_STATE_UNKNOWN;
716 }
717
718 virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const {
719 Device* device = getDevice(deviceId);
720 if (device) {
721 ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
722 if (index >= 0) {
723 return device->keyCodeStates.valueAt(index);
724 }
725 }
726 return AKEY_STATE_UNKNOWN;
727 }
728
729 virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const {
730 Device* device = getDevice(deviceId);
731 if (device) {
732 ssize_t index = device->switchStates.indexOfKey(sw);
733 if (index >= 0) {
734 return device->switchStates.valueAt(index);
735 }
736 }
737 return AKEY_STATE_UNKNOWN;
738 }
739
740 virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis,
741 int32_t* outValue) const {
742 Device* device = getDevice(deviceId);
743 if (device) {
744 ssize_t index = device->absoluteAxisValue.indexOfKey(axis);
745 if (index >= 0) {
746 *outValue = device->absoluteAxisValue.valueAt(index);
747 return OK;
748 }
749 }
750 *outValue = 0;
751 return -1;
752 }
753
754 virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
755 uint8_t* outFlags) const {
756 bool result = false;
757 Device* device = getDevice(deviceId);
758 if (device) {
759 for (size_t i = 0; i < numCodes; i++) {
760 for (size_t j = 0; j < device->keysByScanCode.size(); j++) {
761 if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) {
762 outFlags[i] = 1;
763 result = true;
764 }
765 }
766 for (size_t j = 0; j < device->keysByUsageCode.size(); j++) {
767 if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) {
768 outFlags[i] = 1;
769 result = true;
770 }
771 }
772 }
773 }
774 return result;
775 }
776
777 virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const {
778 Device* device = getDevice(deviceId);
779 if (device) {
780 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
781 return index >= 0;
782 }
783 return false;
784 }
785
786 virtual bool hasLed(int32_t deviceId, int32_t led) const {
787 Device* device = getDevice(deviceId);
788 return device && device->leds.indexOfKey(led) >= 0;
789 }
790
791 virtual void setLedState(int32_t deviceId, int32_t led, bool on) {
792 Device* device = getDevice(deviceId);
793 if (device) {
794 ssize_t index = device->leds.indexOfKey(led);
795 if (index >= 0) {
796 device->leds.replaceValueAt(led, on);
797 } else {
798 ADD_FAILURE()
799 << "Attempted to set the state of an LED that the EventHub declared "
800 "was not present. led=" << led;
801 }
802 }
803 }
804
805 virtual void getVirtualKeyDefinitions(int32_t deviceId,
806 Vector<VirtualKeyDefinition>& outVirtualKeys) const {
807 outVirtualKeys.clear();
808
809 Device* device = getDevice(deviceId);
810 if (device) {
811 outVirtualKeys.appendVector(device->virtualKeys);
812 }
813 }
814
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100815 virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t) const {
Yi Kong9b14ac62018-07-17 13:48:38 -0700816 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800817 }
818
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100819 virtual bool setKeyboardLayoutOverlay(int32_t, const sp<KeyCharacterMap>&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800820 return false;
821 }
822
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100823 virtual void vibrate(int32_t, nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800824 }
825
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100826 virtual void cancelVibrate(int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800827 }
828
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100829 virtual bool isExternal(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800830 return false;
831 }
832
Siarhei Vishniakouf93fcf42017-11-22 16:00:14 -0800833 virtual void dump(std::string&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800834 }
835
836 virtual void monitor() {
837 }
838
839 virtual void requestReopenDevices() {
840 }
841
842 virtual void wake() {
843 }
844};
845
846
847// --- FakeInputReaderContext ---
848
849class FakeInputReaderContext : public InputReaderContext {
850 sp<EventHubInterface> mEventHub;
851 sp<InputReaderPolicyInterface> mPolicy;
852 sp<InputListenerInterface> mListener;
853 int32_t mGlobalMetaState;
854 bool mUpdateGlobalMetaStateWasCalled;
855 int32_t mGeneration;
856
857public:
858 FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
859 const sp<InputReaderPolicyInterface>& policy,
860 const sp<InputListenerInterface>& listener) :
861 mEventHub(eventHub), mPolicy(policy), mListener(listener),
862 mGlobalMetaState(0) {
863 }
864
865 virtual ~FakeInputReaderContext() { }
866
867 void assertUpdateGlobalMetaStateWasCalled() {
868 ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
869 << "Expected updateGlobalMetaState() to have been called.";
870 mUpdateGlobalMetaStateWasCalled = false;
871 }
872
873 void setGlobalMetaState(int32_t state) {
874 mGlobalMetaState = state;
875 }
876
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800877 uint32_t getGeneration() {
878 return mGeneration;
879 }
880
Michael Wrightd02c5b62014-02-10 15:10:22 -0800881private:
882 virtual void updateGlobalMetaState() {
883 mUpdateGlobalMetaStateWasCalled = true;
884 }
885
886 virtual int32_t getGlobalMetaState() {
887 return mGlobalMetaState;
888 }
889
890 virtual EventHubInterface* getEventHub() {
891 return mEventHub.get();
892 }
893
894 virtual InputReaderPolicyInterface* getPolicy() {
895 return mPolicy.get();
896 }
897
898 virtual InputListenerInterface* getListener() {
899 return mListener.get();
900 }
901
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100902 virtual void disableVirtualKeysUntil(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800903 }
904
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100905 virtual bool shouldDropVirtualKey(nsecs_t, InputDevice*, int32_t, int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800906 return false;
907 }
908
909 virtual void fadePointer() {
910 }
911
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100912 virtual void requestTimeoutAtTime(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800913 }
914
915 virtual int32_t bumpGeneration() {
916 return ++mGeneration;
917 }
Michael Wright842500e2015-03-13 17:32:02 -0700918
919 virtual void getExternalStylusDevices(Vector<InputDeviceInfo>& outDevices) {
920
921 }
922
923 virtual void dispatchExternalStylusState(const StylusState&) {
924
925 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800926};
927
928
929// --- FakeInputMapper ---
930
931class FakeInputMapper : public InputMapper {
932 uint32_t mSources;
933 int32_t mKeyboardType;
934 int32_t mMetaState;
935 KeyedVector<int32_t, int32_t> mKeyCodeStates;
936 KeyedVector<int32_t, int32_t> mScanCodeStates;
937 KeyedVector<int32_t, int32_t> mSwitchStates;
938 Vector<int32_t> mSupportedKeyCodes;
939 RawEvent mLastEvent;
940
941 bool mConfigureWasCalled;
942 bool mResetWasCalled;
943 bool mProcessWasCalled;
944
945public:
946 FakeInputMapper(InputDevice* device, uint32_t sources) :
947 InputMapper(device),
948 mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
949 mMetaState(0),
950 mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
951 }
952
953 virtual ~FakeInputMapper() { }
954
955 void setKeyboardType(int32_t keyboardType) {
956 mKeyboardType = keyboardType;
957 }
958
959 void setMetaState(int32_t metaState) {
960 mMetaState = metaState;
961 }
962
963 void assertConfigureWasCalled() {
964 ASSERT_TRUE(mConfigureWasCalled)
965 << "Expected configure() to have been called.";
966 mConfigureWasCalled = false;
967 }
968
969 void assertResetWasCalled() {
970 ASSERT_TRUE(mResetWasCalled)
971 << "Expected reset() to have been called.";
972 mResetWasCalled = false;
973 }
974
Yi Kong9b14ac62018-07-17 13:48:38 -0700975 void assertProcessWasCalled(RawEvent* outLastEvent = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800976 ASSERT_TRUE(mProcessWasCalled)
977 << "Expected process() to have been called.";
978 if (outLastEvent) {
979 *outLastEvent = mLastEvent;
980 }
981 mProcessWasCalled = false;
982 }
983
984 void setKeyCodeState(int32_t keyCode, int32_t state) {
985 mKeyCodeStates.replaceValueFor(keyCode, state);
986 }
987
988 void setScanCodeState(int32_t scanCode, int32_t state) {
989 mScanCodeStates.replaceValueFor(scanCode, state);
990 }
991
992 void setSwitchState(int32_t switchCode, int32_t state) {
993 mSwitchStates.replaceValueFor(switchCode, state);
994 }
995
996 void addSupportedKeyCode(int32_t keyCode) {
997 mSupportedKeyCodes.add(keyCode);
998 }
999
1000private:
1001 virtual uint32_t getSources() {
1002 return mSources;
1003 }
1004
1005 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
1006 InputMapper::populateDeviceInfo(deviceInfo);
1007
1008 if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
1009 deviceInfo->setKeyboardType(mKeyboardType);
1010 }
1011 }
1012
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001013 virtual void configure(nsecs_t, const InputReaderConfiguration*, uint32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001014 mConfigureWasCalled = true;
1015 }
1016
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001017 virtual void reset(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001018 mResetWasCalled = true;
1019 }
1020
1021 virtual void process(const RawEvent* rawEvent) {
1022 mLastEvent = *rawEvent;
1023 mProcessWasCalled = true;
1024 }
1025
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001026 virtual int32_t getKeyCodeState(uint32_t, int32_t keyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001027 ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
1028 return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1029 }
1030
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001031 virtual int32_t getScanCodeState(uint32_t, int32_t scanCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001032 ssize_t index = mScanCodeStates.indexOfKey(scanCode);
1033 return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1034 }
1035
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001036 virtual int32_t getSwitchState(uint32_t, int32_t switchCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001037 ssize_t index = mSwitchStates.indexOfKey(switchCode);
1038 return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1039 }
1040
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001041 virtual bool markSupportedKeyCodes(uint32_t, size_t numCodes,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001042 const int32_t* keyCodes, uint8_t* outFlags) {
1043 bool result = false;
1044 for (size_t i = 0; i < numCodes; i++) {
1045 for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
1046 if (keyCodes[i] == mSupportedKeyCodes[j]) {
1047 outFlags[i] = 1;
1048 result = true;
1049 }
1050 }
1051 }
1052 return result;
1053 }
1054
1055 virtual int32_t getMetaState() {
1056 return mMetaState;
1057 }
1058
1059 virtual void fadePointer() {
1060 }
1061};
1062
1063
1064// --- InstrumentedInputReader ---
1065
1066class InstrumentedInputReader : public InputReader {
1067 InputDevice* mNextDevice;
1068
1069public:
1070 InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
1071 const sp<InputReaderPolicyInterface>& policy,
1072 const sp<InputListenerInterface>& listener) :
1073 InputReader(eventHub, policy, listener),
Yi Kong9b14ac62018-07-17 13:48:38 -07001074 mNextDevice(nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001075 }
1076
1077 virtual ~InstrumentedInputReader() {
1078 if (mNextDevice) {
1079 delete mNextDevice;
1080 }
1081 }
1082
1083 void setNextDevice(InputDevice* device) {
1084 mNextDevice = device;
1085 }
1086
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001087 InputDevice* newDevice(int32_t deviceId, int32_t controllerNumber, const std::string& name,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001088 uint32_t classes) {
1089 InputDeviceIdentifier identifier;
1090 identifier.name = name;
1091 int32_t generation = deviceId + 1;
1092 return new InputDevice(&mContext, deviceId, generation, controllerNumber, identifier,
1093 classes);
1094 }
1095
1096protected:
1097 virtual InputDevice* createDeviceLocked(int32_t deviceId, int32_t controllerNumber,
1098 const InputDeviceIdentifier& identifier, uint32_t classes) {
1099 if (mNextDevice) {
1100 InputDevice* device = mNextDevice;
Yi Kong9b14ac62018-07-17 13:48:38 -07001101 mNextDevice = nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001102 return device;
1103 }
1104 return InputReader::createDeviceLocked(deviceId, controllerNumber, identifier, classes);
1105 }
1106
1107 friend class InputReaderTest;
1108};
1109
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001110// --- InputReaderPolicyTest ---
1111class InputReaderPolicyTest : public testing::Test {
Siarhei Vishniakoucd7ac1e2018-10-15 13:39:50 -07001112protected:
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001113 sp<FakeInputReaderPolicy> mFakePolicy;
1114
1115 virtual void SetUp() {
1116 mFakePolicy = new FakeInputReaderPolicy();
1117 }
1118 virtual void TearDown() {
1119 mFakePolicy.clear();
1120 }
1121};
1122
1123/**
1124 * Check that empty set of viewports is an acceptable configuration.
1125 * Also try to get internal viewport two different ways - by type and by uniqueId.
1126 *
1127 * There will be confusion if two viewports with empty uniqueId and identical type are present.
1128 * Such configuration is not currently allowed.
1129 */
1130TEST_F(InputReaderPolicyTest, Viewports_GetCleared) {
Siarhei Vishniakoucd7ac1e2018-10-15 13:39:50 -07001131 static const std::string uniqueId = "local:0";
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001132
1133 // We didn't add any viewports yet, so there shouldn't be any.
1134 std::optional<DisplayViewport> internalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001135 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001136 ASSERT_FALSE(internalViewport);
1137
1138 // Add an internal viewport, then clear it
1139 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001140 DISPLAY_ORIENTATION_0, uniqueId, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001141
1142 // Check matching by uniqueId
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001143 internalViewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001144 ASSERT_TRUE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001145 ASSERT_EQ(ViewportType::VIEWPORT_INTERNAL, internalViewport->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001146
1147 // Check matching by viewport type
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001148 internalViewport = mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001149 ASSERT_TRUE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001150 ASSERT_EQ(uniqueId, internalViewport->uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001151
1152 mFakePolicy->clearViewports();
1153 // Make sure nothing is found after clear
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001154 internalViewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001155 ASSERT_FALSE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001156 internalViewport = mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001157 ASSERT_FALSE(internalViewport);
1158}
1159
1160TEST_F(InputReaderPolicyTest, Viewports_GetByType) {
1161 const std::string internalUniqueId = "local:0";
1162 const std::string externalUniqueId = "local:1";
1163 const std::string virtualUniqueId1 = "virtual:2";
1164 const std::string virtualUniqueId2 = "virtual:3";
1165 constexpr int32_t virtualDisplayId1 = 2;
1166 constexpr int32_t virtualDisplayId2 = 3;
1167
1168 // Add an internal viewport
1169 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001170 DISPLAY_ORIENTATION_0, internalUniqueId, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001171 // Add an external viewport
1172 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001173 DISPLAY_ORIENTATION_0, externalUniqueId, NO_PORT, ViewportType::VIEWPORT_EXTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001174 // Add an virtual viewport
1175 mFakePolicy->addDisplayViewport(virtualDisplayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001176 DISPLAY_ORIENTATION_0, virtualUniqueId1, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001177 // Add another virtual viewport
1178 mFakePolicy->addDisplayViewport(virtualDisplayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001179 DISPLAY_ORIENTATION_0, virtualUniqueId2, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001180
1181 // Check matching by type for internal
1182 std::optional<DisplayViewport> internalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001183 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001184 ASSERT_TRUE(internalViewport);
1185 ASSERT_EQ(internalUniqueId, internalViewport->uniqueId);
1186
1187 // Check matching by type for external
1188 std::optional<DisplayViewport> externalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001189 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_EXTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001190 ASSERT_TRUE(externalViewport);
1191 ASSERT_EQ(externalUniqueId, externalViewport->uniqueId);
1192
1193 // Check matching by uniqueId for virtual viewport #1
1194 std::optional<DisplayViewport> virtualViewport1 =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001195 mFakePolicy->getDisplayViewportByUniqueId(virtualUniqueId1);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001196 ASSERT_TRUE(virtualViewport1);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001197 ASSERT_EQ(ViewportType::VIEWPORT_VIRTUAL, virtualViewport1->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001198 ASSERT_EQ(virtualUniqueId1, virtualViewport1->uniqueId);
1199 ASSERT_EQ(virtualDisplayId1, virtualViewport1->displayId);
1200
1201 // Check matching by uniqueId for virtual viewport #2
1202 std::optional<DisplayViewport> virtualViewport2 =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001203 mFakePolicy->getDisplayViewportByUniqueId(virtualUniqueId2);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001204 ASSERT_TRUE(virtualViewport2);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001205 ASSERT_EQ(ViewportType::VIEWPORT_VIRTUAL, virtualViewport2->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001206 ASSERT_EQ(virtualUniqueId2, virtualViewport2->uniqueId);
1207 ASSERT_EQ(virtualDisplayId2, virtualViewport2->displayId);
1208}
1209
1210
1211/**
1212 * We can have 2 viewports of the same kind. We can distinguish them by uniqueId, and confirm
1213 * that lookup works by checking display id.
1214 * Check that 2 viewports of each kind is possible, for all existing viewport types.
1215 */
1216TEST_F(InputReaderPolicyTest, Viewports_TwoOfSameType) {
1217 const std::string uniqueId1 = "uniqueId1";
1218 const std::string uniqueId2 = "uniqueId2";
1219 constexpr int32_t displayId1 = 2;
1220 constexpr int32_t displayId2 = 3;
1221
1222 std::vector<ViewportType> types = {ViewportType::VIEWPORT_INTERNAL,
1223 ViewportType::VIEWPORT_EXTERNAL, ViewportType::VIEWPORT_VIRTUAL};
1224 for (const ViewportType& type : types) {
1225 mFakePolicy->clearViewports();
1226 // Add a viewport
1227 mFakePolicy->addDisplayViewport(displayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001228 DISPLAY_ORIENTATION_0, uniqueId1, NO_PORT, type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001229 // Add another viewport
1230 mFakePolicy->addDisplayViewport(displayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001231 DISPLAY_ORIENTATION_0, uniqueId2, NO_PORT, type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001232
1233 // Check that correct display viewport was returned by comparing the display IDs.
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001234 std::optional<DisplayViewport> viewport1 =
1235 mFakePolicy->getDisplayViewportByUniqueId(uniqueId1);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001236 ASSERT_TRUE(viewport1);
1237 ASSERT_EQ(displayId1, viewport1->displayId);
1238 ASSERT_EQ(type, viewport1->type);
1239
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001240 std::optional<DisplayViewport> viewport2 =
1241 mFakePolicy->getDisplayViewportByUniqueId(uniqueId2);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001242 ASSERT_TRUE(viewport2);
1243 ASSERT_EQ(displayId2, viewport2->displayId);
1244 ASSERT_EQ(type, viewport2->type);
1245
1246 // When there are multiple viewports of the same kind, and uniqueId is not specified
1247 // in the call to getDisplayViewport, then that situation is not supported.
1248 // The viewports can be stored in any order, so we cannot rely on the order, since that
1249 // is just implementation detail.
1250 // However, we can check that it still returns *a* viewport, we just cannot assert
1251 // which one specifically is returned.
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001252 std::optional<DisplayViewport> someViewport = mFakePolicy->getDisplayViewportByType(type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001253 ASSERT_TRUE(someViewport);
1254 }
1255}
Michael Wrightd02c5b62014-02-10 15:10:22 -08001256
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001257/**
1258 * Check getDisplayViewportByPort
1259 */
1260TEST_F(InputReaderPolicyTest, Viewports_GetByPort) {
1261 constexpr ViewportType type = ViewportType::VIEWPORT_EXTERNAL;
1262 const std::string uniqueId1 = "uniqueId1";
1263 const std::string uniqueId2 = "uniqueId2";
1264 constexpr int32_t displayId1 = 1;
1265 constexpr int32_t displayId2 = 2;
1266 const uint8_t hdmi1 = 0;
1267 const uint8_t hdmi2 = 1;
1268 const uint8_t hdmi3 = 2;
1269
1270 mFakePolicy->clearViewports();
1271 // Add a viewport that's associated with some display port that's not of interest.
1272 mFakePolicy->addDisplayViewport(displayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1273 DISPLAY_ORIENTATION_0, uniqueId1, hdmi3, type);
1274 // Add another viewport, connected to HDMI1 port
1275 mFakePolicy->addDisplayViewport(displayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1276 DISPLAY_ORIENTATION_0, uniqueId2, hdmi1, type);
1277
1278 // Check that correct display viewport was returned by comparing the display ports.
1279 std::optional<DisplayViewport> hdmi1Viewport = mFakePolicy->getDisplayViewportByPort(hdmi1);
1280 ASSERT_TRUE(hdmi1Viewport);
1281 ASSERT_EQ(displayId2, hdmi1Viewport->displayId);
1282 ASSERT_EQ(uniqueId2, hdmi1Viewport->uniqueId);
1283
1284 // Check that we can still get the same viewport using the uniqueId
1285 hdmi1Viewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId2);
1286 ASSERT_TRUE(hdmi1Viewport);
1287 ASSERT_EQ(displayId2, hdmi1Viewport->displayId);
1288 ASSERT_EQ(uniqueId2, hdmi1Viewport->uniqueId);
1289 ASSERT_EQ(type, hdmi1Viewport->type);
1290
1291 // Check that we cannot find a port with "HDMI2", because we never added one
1292 std::optional<DisplayViewport> hdmi2Viewport = mFakePolicy->getDisplayViewportByPort(hdmi2);
1293 ASSERT_FALSE(hdmi2Viewport);
1294}
1295
Michael Wrightd02c5b62014-02-10 15:10:22 -08001296// --- InputReaderTest ---
1297
1298class InputReaderTest : public testing::Test {
1299protected:
1300 sp<FakeInputListener> mFakeListener;
1301 sp<FakeInputReaderPolicy> mFakePolicy;
1302 sp<FakeEventHub> mFakeEventHub;
1303 sp<InstrumentedInputReader> mReader;
1304
1305 virtual void SetUp() {
1306 mFakeEventHub = new FakeEventHub();
1307 mFakePolicy = new FakeInputReaderPolicy();
1308 mFakeListener = new FakeInputListener();
1309
1310 mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener);
1311 }
1312
1313 virtual void TearDown() {
1314 mReader.clear();
1315
1316 mFakeListener.clear();
1317 mFakePolicy.clear();
1318 mFakeEventHub.clear();
1319 }
1320
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001321 void addDevice(int32_t deviceId, const std::string& name, uint32_t classes,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001322 const PropertyMap* configuration) {
1323 mFakeEventHub->addDevice(deviceId, name, classes);
1324
1325 if (configuration) {
1326 mFakeEventHub->addConfigurationMap(deviceId, configuration);
1327 }
1328 mFakeEventHub->finishDeviceScan();
1329 mReader->loopOnce();
1330 mReader->loopOnce();
1331 mFakeEventHub->assertQueueIsEmpty();
1332 }
1333
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001334 void disableDevice(int32_t deviceId, InputDevice* device) {
1335 mFakePolicy->addDisabledDevice(deviceId);
1336 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1337 }
1338
1339 void enableDevice(int32_t deviceId, InputDevice* device) {
1340 mFakePolicy->removeDisabledDevice(deviceId);
1341 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1342 }
1343
1344 void configureDevice(uint32_t changes, InputDevice* device) {
1345 device->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1346 }
1347
Michael Wrightd02c5b62014-02-10 15:10:22 -08001348 FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, int32_t controllerNumber,
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001349 const std::string& name, uint32_t classes, uint32_t sources,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001350 const PropertyMap* configuration) {
1351 InputDevice* device = mReader->newDevice(deviceId, controllerNumber, name, classes);
1352 FakeInputMapper* mapper = new FakeInputMapper(device, sources);
1353 device->addMapper(mapper);
1354 mReader->setNextDevice(device);
1355 addDevice(deviceId, name, classes, configuration);
1356 return mapper;
1357 }
1358};
1359
1360TEST_F(InputReaderTest, GetInputDevices) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001361 ASSERT_NO_FATAL_FAILURE(addDevice(1, "keyboard",
Yi Kong9b14ac62018-07-17 13:48:38 -07001362 INPUT_DEVICE_CLASS_KEYBOARD, nullptr));
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001363 ASSERT_NO_FATAL_FAILURE(addDevice(2, "ignored",
Yi Kong9b14ac62018-07-17 13:48:38 -07001364 0, nullptr)); // no classes so device will be ignored
Michael Wrightd02c5b62014-02-10 15:10:22 -08001365
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001366
Michael Wrightd02c5b62014-02-10 15:10:22 -08001367 Vector<InputDeviceInfo> inputDevices;
1368 mReader->getInputDevices(inputDevices);
1369
1370 ASSERT_EQ(1U, inputDevices.size());
1371 ASSERT_EQ(1, inputDevices[0].getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001372 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001373 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1374 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1375 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1376
1377 // Should also have received a notification describing the new input devices.
1378 inputDevices = mFakePolicy->getInputDevices();
1379 ASSERT_EQ(1U, inputDevices.size());
1380 ASSERT_EQ(1, inputDevices[0].getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001381 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001382 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1383 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1384 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1385}
1386
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001387TEST_F(InputReaderTest, WhenEnabledChanges_SendsDeviceResetNotification) {
1388 constexpr int32_t deviceId = 1;
1389 constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001390 InputDevice* device = mReader->newDevice(deviceId, 0, "fake", deviceClass);
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001391 // Must add at least one mapper or the device will be ignored!
1392 FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_KEYBOARD);
1393 device->addMapper(mapper);
1394 mReader->setNextDevice(device);
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001395 addDevice(deviceId, "fake", deviceClass, nullptr);
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001396
Yi Kong9b14ac62018-07-17 13:48:38 -07001397 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(nullptr));
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001398
1399 NotifyDeviceResetArgs resetArgs;
1400 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1401 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1402 ASSERT_EQ(deviceId, resetArgs.deviceId);
1403
1404 ASSERT_EQ(device->isEnabled(), true);
1405 disableDevice(deviceId, device);
1406 mReader->loopOnce();
1407
1408 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1409 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1410 ASSERT_EQ(deviceId, resetArgs.deviceId);
1411 ASSERT_EQ(device->isEnabled(), false);
1412
1413 disableDevice(deviceId, device);
1414 mReader->loopOnce();
1415 mFakeListener->assertNotifyDeviceResetWasNotCalled();
1416 mFakeListener->assertNotifyConfigurationChangedWasNotCalled();
1417 ASSERT_EQ(device->isEnabled(), false);
1418
1419 enableDevice(deviceId, device);
1420 mReader->loopOnce();
1421 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1422 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1423 ASSERT_EQ(deviceId, resetArgs.deviceId);
1424 ASSERT_EQ(device->isEnabled(), true);
1425}
1426
Michael Wrightd02c5b62014-02-10 15:10:22 -08001427TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001428 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001429 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001430 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001431 mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1432
1433 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
1434 AINPUT_SOURCE_ANY, AKEYCODE_A))
1435 << "Should return unknown when the device id is >= 0 but unknown.";
1436
1437 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
1438 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1439 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1440
1441 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
1442 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1443 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1444
1445 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
1446 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1447 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1448
1449 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
1450 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1451 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1452}
1453
1454TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001455 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001456 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001457 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001458 mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
1459
1460 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
1461 AINPUT_SOURCE_ANY, KEY_A))
1462 << "Should return unknown when the device id is >= 0 but unknown.";
1463
1464 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
1465 AINPUT_SOURCE_TRACKBALL, KEY_A))
1466 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1467
1468 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
1469 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1470 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1471
1472 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
1473 AINPUT_SOURCE_TRACKBALL, KEY_A))
1474 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1475
1476 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
1477 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1478 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1479}
1480
1481TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001482 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001483 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001484 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001485 mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
1486
1487 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
1488 AINPUT_SOURCE_ANY, SW_LID))
1489 << "Should return unknown when the device id is >= 0 but unknown.";
1490
1491 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
1492 AINPUT_SOURCE_TRACKBALL, SW_LID))
1493 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1494
1495 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
1496 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1497 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1498
1499 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
1500 AINPUT_SOURCE_TRACKBALL, SW_LID))
1501 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1502
1503 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
1504 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1505 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1506}
1507
1508TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001509 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001510 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001511 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001512
Michael Wrightd02c5b62014-02-10 15:10:22 -08001513 mapper->addSupportedKeyCode(AKEYCODE_A);
1514 mapper->addSupportedKeyCode(AKEYCODE_B);
1515
1516 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1517 uint8_t flags[4] = { 0, 0, 0, 1 };
1518
1519 ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
1520 << "Should return false when device id is >= 0 but unknown.";
1521 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1522
1523 flags[3] = 1;
1524 ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1525 << "Should return false when device id is valid but the sources are not supported by the device.";
1526 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1527
1528 flags[3] = 1;
1529 ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1530 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1531 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1532
1533 flags[3] = 1;
1534 ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1535 << "Should return false when the device id is < 0 but the sources are not supported by any device.";
1536 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1537
1538 flags[3] = 1;
1539 ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1540 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1541 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1542}
1543
1544TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001545 addDevice(1, "ignored", INPUT_DEVICE_CLASS_KEYBOARD, nullptr);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001546
1547 NotifyConfigurationChangedArgs args;
1548
1549 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args));
1550 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1551}
1552
1553TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001554 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001555 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001556 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001557
1558 mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1);
1559 mReader->loopOnce();
1560 ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
1561
1562 RawEvent event;
1563 ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
1564 ASSERT_EQ(0, event.when);
1565 ASSERT_EQ(1, event.deviceId);
1566 ASSERT_EQ(EV_KEY, event.type);
1567 ASSERT_EQ(KEY_A, event.code);
1568 ASSERT_EQ(1, event.value);
1569}
1570
1571
1572// --- InputDeviceTest ---
1573
1574class InputDeviceTest : public testing::Test {
1575protected:
1576 static const char* DEVICE_NAME;
1577 static const int32_t DEVICE_ID;
1578 static const int32_t DEVICE_GENERATION;
1579 static const int32_t DEVICE_CONTROLLER_NUMBER;
1580 static const uint32_t DEVICE_CLASSES;
1581
1582 sp<FakeEventHub> mFakeEventHub;
1583 sp<FakeInputReaderPolicy> mFakePolicy;
1584 sp<FakeInputListener> mFakeListener;
1585 FakeInputReaderContext* mFakeContext;
1586
1587 InputDevice* mDevice;
1588
1589 virtual void SetUp() {
1590 mFakeEventHub = new FakeEventHub();
1591 mFakePolicy = new FakeInputReaderPolicy();
1592 mFakeListener = new FakeInputListener();
1593 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1594
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001595 mFakeEventHub->addDevice(DEVICE_ID, DEVICE_NAME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001596 InputDeviceIdentifier identifier;
1597 identifier.name = DEVICE_NAME;
1598 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1599 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1600 }
1601
1602 virtual void TearDown() {
1603 delete mDevice;
1604
1605 delete mFakeContext;
1606 mFakeListener.clear();
1607 mFakePolicy.clear();
1608 mFakeEventHub.clear();
1609 }
1610};
1611
1612const char* InputDeviceTest::DEVICE_NAME = "device";
1613const int32_t InputDeviceTest::DEVICE_ID = 1;
1614const int32_t InputDeviceTest::DEVICE_GENERATION = 2;
1615const int32_t InputDeviceTest::DEVICE_CONTROLLER_NUMBER = 0;
1616const uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD
1617 | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK;
1618
1619TEST_F(InputDeviceTest, ImmutableProperties) {
1620 ASSERT_EQ(DEVICE_ID, mDevice->getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001621 ASSERT_STREQ(DEVICE_NAME, mDevice->getName().c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001622 ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses());
1623}
1624
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001625TEST_F(InputDeviceTest, WhenDeviceCreated_EnabledIsTrue) {
1626 ASSERT_EQ(mDevice->isEnabled(), true);
1627}
1628
Michael Wrightd02c5b62014-02-10 15:10:22 -08001629TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
1630 // Configuration.
1631 InputReaderConfiguration config;
1632 mDevice->configure(ARBITRARY_TIME, &config, 0);
1633
1634 // Reset.
1635 mDevice->reset(ARBITRARY_TIME);
1636
1637 NotifyDeviceResetArgs resetArgs;
1638 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1639 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1640 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1641
1642 // Metadata.
1643 ASSERT_TRUE(mDevice->isIgnored());
1644 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources());
1645
1646 InputDeviceInfo info;
1647 mDevice->getDeviceInfo(&info);
1648 ASSERT_EQ(DEVICE_ID, info.getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001649 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001650 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType());
1651 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
1652
1653 // State queries.
1654 ASSERT_EQ(0, mDevice->getMetaState());
1655
1656 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1657 << "Ignored device should return unknown key code state.";
1658 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1659 << "Ignored device should return unknown scan code state.";
1660 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
1661 << "Ignored device should return unknown switch state.";
1662
1663 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1664 uint8_t flags[2] = { 0, 1 };
1665 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
1666 << "Ignored device should never mark any key codes.";
1667 ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
1668 ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
1669}
1670
1671TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
1672 // Configuration.
1673 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value"));
1674
1675 FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
1676 mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1677 mapper1->setMetaState(AMETA_ALT_ON);
1678 mapper1->addSupportedKeyCode(AKEYCODE_A);
1679 mapper1->addSupportedKeyCode(AKEYCODE_B);
1680 mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1681 mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
1682 mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
1683 mapper1->setScanCodeState(3, AKEY_STATE_UP);
1684 mapper1->setSwitchState(4, AKEY_STATE_DOWN);
1685 mDevice->addMapper(mapper1);
1686
1687 FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
1688 mapper2->setMetaState(AMETA_SHIFT_ON);
1689 mDevice->addMapper(mapper2);
1690
1691 InputReaderConfiguration config;
1692 mDevice->configure(ARBITRARY_TIME, &config, 0);
1693
1694 String8 propertyValue;
1695 ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue))
1696 << "Device should have read configuration during configuration phase.";
1697 ASSERT_STREQ("value", propertyValue.string());
1698
1699 ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
1700 ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
1701
1702 // Reset
1703 mDevice->reset(ARBITRARY_TIME);
1704 ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
1705 ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
1706
1707 NotifyDeviceResetArgs resetArgs;
1708 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1709 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1710 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1711
1712 // Metadata.
1713 ASSERT_FALSE(mDevice->isIgnored());
1714 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
1715
1716 InputDeviceInfo info;
1717 mDevice->getDeviceInfo(&info);
1718 ASSERT_EQ(DEVICE_ID, info.getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001719 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001720 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
1721 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
1722
1723 // State queries.
1724 ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
1725 << "Should query mappers and combine meta states.";
1726
1727 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1728 << "Should return unknown key code state when source not supported.";
1729 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1730 << "Should return unknown scan code state when source not supported.";
1731 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1732 << "Should return unknown switch state when source not supported.";
1733
1734 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
1735 << "Should query mapper when source is supported.";
1736 ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
1737 << "Should query mapper when source is supported.";
1738 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
1739 << "Should query mapper when source is supported.";
1740
1741 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1742 uint8_t flags[4] = { 0, 0, 0, 1 };
1743 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1744 << "Should do nothing when source is unsupported.";
1745 ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
1746 ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
1747 ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
1748 ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
1749
1750 ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
1751 << "Should query mapper when source is supported.";
1752 ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
1753 ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
1754 ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
1755 ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
1756
1757 // Event handling.
1758 RawEvent event;
1759 mDevice->process(&event, 1);
1760
1761 ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
1762 ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
1763}
1764
1765
1766// --- InputMapperTest ---
1767
1768class InputMapperTest : public testing::Test {
1769protected:
1770 static const char* DEVICE_NAME;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001771 static const char* DEVICE_LOCATION;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001772 static const int32_t DEVICE_ID;
1773 static const int32_t DEVICE_GENERATION;
1774 static const int32_t DEVICE_CONTROLLER_NUMBER;
1775 static const uint32_t DEVICE_CLASSES;
1776
1777 sp<FakeEventHub> mFakeEventHub;
1778 sp<FakeInputReaderPolicy> mFakePolicy;
1779 sp<FakeInputListener> mFakeListener;
1780 FakeInputReaderContext* mFakeContext;
1781 InputDevice* mDevice;
1782
1783 virtual void SetUp() {
1784 mFakeEventHub = new FakeEventHub();
1785 mFakePolicy = new FakeInputReaderPolicy();
1786 mFakeListener = new FakeInputListener();
1787 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1788 InputDeviceIdentifier identifier;
1789 identifier.name = DEVICE_NAME;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001790 identifier.location = DEVICE_LOCATION;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001791 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1792 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1793
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001794 mFakeEventHub->addDevice(mDevice->getId(), DEVICE_NAME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001795 }
1796
1797 virtual void TearDown() {
1798 delete mDevice;
1799 delete mFakeContext;
1800 mFakeListener.clear();
1801 mFakePolicy.clear();
1802 mFakeEventHub.clear();
1803 }
1804
1805 void addConfigurationProperty(const char* key, const char* value) {
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001806 mFakeEventHub->addConfigurationProperty(mDevice->getId(), String8(key), String8(value));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001807 }
1808
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001809 void configureDevice(uint32_t changes) {
1810 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1811 }
1812
Michael Wrightd02c5b62014-02-10 15:10:22 -08001813 void addMapperAndConfigure(InputMapper* mapper) {
1814 mDevice->addMapper(mapper);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001815 configureDevice(0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001816 mDevice->reset(ARBITRARY_TIME);
1817 }
1818
1819 void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001820 int32_t orientation, const std::string& uniqueId,
1821 std::optional<uint8_t> physicalPort, ViewportType viewportType) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001822 mFakePolicy->addDisplayViewport(
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001823 displayId, width, height, orientation, uniqueId, physicalPort, viewportType);
Santos Cordonfa5cf462017-04-05 10:37:00 -07001824 configureDevice(InputReaderConfiguration::CHANGE_DISPLAY_INFO);
1825 }
1826
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001827 void clearViewports() {
1828 mFakePolicy->clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08001829 }
1830
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001831 static void process(InputMapper* mapper, nsecs_t when, int32_t type,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001832 int32_t code, int32_t value) {
1833 RawEvent event;
1834 event.when = when;
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001835 event.deviceId = mapper->getDeviceId();
Michael Wrightd02c5b62014-02-10 15:10:22 -08001836 event.type = type;
1837 event.code = code;
1838 event.value = value;
1839 mapper->process(&event);
1840 }
1841
1842 static void assertMotionRange(const InputDeviceInfo& info,
1843 int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
1844 const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
Yi Kong9b14ac62018-07-17 13:48:38 -07001845 ASSERT_TRUE(range != nullptr) << "Axis: " << axis << " Source: " << source;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001846 ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source;
1847 ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source;
1848 ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source;
1849 ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source;
1850 ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source;
1851 ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source;
1852 }
1853
1854 static void assertPointerCoords(const PointerCoords& coords,
1855 float x, float y, float pressure, float size,
1856 float touchMajor, float touchMinor, float toolMajor, float toolMinor,
1857 float orientation, float distance) {
1858 ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1);
1859 ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
1860 ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON);
1861 ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON);
1862 ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1);
1863 ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1);
1864 ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1);
1865 ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1);
1866 ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON);
1867 ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON);
1868 }
1869
1870 static void assertPosition(const sp<FakePointerController>& controller, float x, float y) {
1871 float actualX, actualY;
1872 controller->getPosition(&actualX, &actualY);
1873 ASSERT_NEAR(x, actualX, 1);
1874 ASSERT_NEAR(y, actualY, 1);
1875 }
1876};
1877
1878const char* InputMapperTest::DEVICE_NAME = "device";
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001879const char* InputMapperTest::DEVICE_LOCATION = "USB1";
Michael Wrightd02c5b62014-02-10 15:10:22 -08001880const int32_t InputMapperTest::DEVICE_ID = 1;
1881const int32_t InputMapperTest::DEVICE_GENERATION = 2;
1882const int32_t InputMapperTest::DEVICE_CONTROLLER_NUMBER = 0;
1883const uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests
1884
1885
1886// --- SwitchInputMapperTest ---
1887
1888class SwitchInputMapperTest : public InputMapperTest {
1889protected:
1890};
1891
1892TEST_F(SwitchInputMapperTest, GetSources) {
1893 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1894 addMapperAndConfigure(mapper);
1895
1896 ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources());
1897}
1898
1899TEST_F(SwitchInputMapperTest, GetSwitchState) {
1900 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1901 addMapperAndConfigure(mapper);
1902
1903 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
1904 ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1905
1906 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
1907 ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1908}
1909
1910TEST_F(SwitchInputMapperTest, Process) {
1911 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1912 addMapperAndConfigure(mapper);
1913
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001914 process(mapper, ARBITRARY_TIME, EV_SW, SW_LID, 1);
1915 process(mapper, ARBITRARY_TIME, EV_SW, SW_JACK_PHYSICAL_INSERT, 1);
1916 process(mapper, ARBITRARY_TIME, EV_SW, SW_HEADPHONE_INSERT, 0);
1917 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001918
1919 NotifySwitchArgs args;
1920 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args));
1921 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
Dan Albert1bd2fc02016-02-02 15:11:57 -08001922 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT), args.switchValues);
1923 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT) | (1 << SW_HEADPHONE_INSERT),
Michael Wrightd02c5b62014-02-10 15:10:22 -08001924 args.switchMask);
1925 ASSERT_EQ(uint32_t(0), args.policyFlags);
1926}
1927
1928
1929// --- KeyboardInputMapperTest ---
1930
1931class KeyboardInputMapperTest : public InputMapperTest {
1932protected:
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001933 const std::string UNIQUE_ID = "local:0";
1934
1935 void prepareDisplay(int32_t orientation);
1936
Michael Wrightd02c5b62014-02-10 15:10:22 -08001937 void testDPadKeyRotation(KeyboardInputMapper* mapper,
1938 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode);
1939};
1940
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001941/* Similar to setDisplayInfoAndReconfigure, but pre-populates all parameters except for the
1942 * orientation.
1943 */
1944void KeyboardInputMapperTest::prepareDisplay(int32_t orientation) {
1945 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001946 orientation, UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001947}
1948
Michael Wrightd02c5b62014-02-10 15:10:22 -08001949void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001950 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001951 NotifyKeyArgs args;
1952
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001953 process(mapper, ARBITRARY_TIME, EV_KEY, originalScanCode, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001954 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1955 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1956 ASSERT_EQ(originalScanCode, args.scanCode);
1957 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1958
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001959 process(mapper, ARBITRARY_TIME, EV_KEY, originalScanCode, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001960 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1961 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1962 ASSERT_EQ(originalScanCode, args.scanCode);
1963 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1964}
1965
1966
1967TEST_F(KeyboardInputMapperTest, GetSources) {
1968 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1969 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1970 addMapperAndConfigure(mapper);
1971
1972 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
1973}
1974
1975TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
1976 const int32_t USAGE_A = 0x070004;
1977 const int32_t USAGE_UNKNOWN = 0x07ffff;
1978 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
1979 mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
1980
1981 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1982 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1983 addMapperAndConfigure(mapper);
1984
1985 // Key down by scan code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001986 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_HOME, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001987 NotifyKeyArgs args;
1988 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1989 ASSERT_EQ(DEVICE_ID, args.deviceId);
1990 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1991 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1992 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1993 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1994 ASSERT_EQ(KEY_HOME, args.scanCode);
1995 ASSERT_EQ(AMETA_NONE, args.metaState);
1996 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1997 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1998 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1999
2000 // Key up by scan code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002001 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_HOME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002002 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2003 ASSERT_EQ(DEVICE_ID, args.deviceId);
2004 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2005 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2006 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2007 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2008 ASSERT_EQ(KEY_HOME, args.scanCode);
2009 ASSERT_EQ(AMETA_NONE, args.metaState);
2010 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2011 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2012 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2013
2014 // Key down by usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002015 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_A);
2016 process(mapper, ARBITRARY_TIME, EV_KEY, 0, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002017 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2018 ASSERT_EQ(DEVICE_ID, args.deviceId);
2019 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2020 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2021 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2022 ASSERT_EQ(AKEYCODE_A, args.keyCode);
2023 ASSERT_EQ(0, args.scanCode);
2024 ASSERT_EQ(AMETA_NONE, args.metaState);
2025 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2026 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2027 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2028
2029 // Key up by usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002030 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_A);
2031 process(mapper, ARBITRARY_TIME + 1, EV_KEY, 0, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002032 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2033 ASSERT_EQ(DEVICE_ID, args.deviceId);
2034 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2035 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2036 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2037 ASSERT_EQ(AKEYCODE_A, args.keyCode);
2038 ASSERT_EQ(0, args.scanCode);
2039 ASSERT_EQ(AMETA_NONE, args.metaState);
2040 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2041 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2042 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2043
2044 // Key down with unknown scan code or usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002045 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
2046 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UNKNOWN, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002047 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2048 ASSERT_EQ(DEVICE_ID, args.deviceId);
2049 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2050 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2051 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2052 ASSERT_EQ(0, args.keyCode);
2053 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
2054 ASSERT_EQ(AMETA_NONE, args.metaState);
2055 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2056 ASSERT_EQ(0U, args.policyFlags);
2057 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2058
2059 // Key up with unknown scan code or usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002060 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
2061 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_UNKNOWN, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002062 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2063 ASSERT_EQ(DEVICE_ID, args.deviceId);
2064 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2065 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2066 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2067 ASSERT_EQ(0, args.keyCode);
2068 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
2069 ASSERT_EQ(AMETA_NONE, args.metaState);
2070 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2071 ASSERT_EQ(0U, args.policyFlags);
2072 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2073}
2074
2075TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
2076 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
2077 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2078
2079 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2080 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2081 addMapperAndConfigure(mapper);
2082
2083 // Initial metastate.
2084 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2085
2086 // Metakey down.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002087 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_LEFTSHIFT, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002088 NotifyKeyArgs args;
2089 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2090 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2091 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2092 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
2093
2094 // Key down.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002095 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_A, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002096 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2097 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2098 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2099
2100 // Key up.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002101 process(mapper, ARBITRARY_TIME + 2, EV_KEY, KEY_A, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002102 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2103 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2104 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2105
2106 // Metakey up.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002107 process(mapper, ARBITRARY_TIME + 3, EV_KEY, KEY_LEFTSHIFT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002108 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2109 ASSERT_EQ(AMETA_NONE, args.metaState);
2110 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2111 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
2112}
2113
2114TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
2115 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2116 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
2117 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
2118 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
2119
2120 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2121 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2122 addMapperAndConfigure(mapper);
2123
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002124 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002125 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2126 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
2127 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2128 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
2129 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2130 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
2131 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2132 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
2133}
2134
2135TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
2136 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2137 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
2138 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
2139 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
2140
2141 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2142 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2143 addConfigurationProperty("keyboard.orientationAware", "1");
2144 addMapperAndConfigure(mapper);
2145
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002146 prepareDisplay(DISPLAY_ORIENTATION_0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002147 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2148 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
2149 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2150 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
2151 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2152 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
2153 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2154 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
2155
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002156 clearViewports();
2157 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002158 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2159 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT));
2160 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2161 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP));
2162 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2163 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT));
2164 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2165 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN));
2166
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002167 clearViewports();
2168 prepareDisplay(DISPLAY_ORIENTATION_180);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002169 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2170 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN));
2171 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2172 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT));
2173 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2174 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP));
2175 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2176 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT));
2177
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002178 clearViewports();
2179 prepareDisplay(DISPLAY_ORIENTATION_270);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002180 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2181 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT));
2182 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2183 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN));
2184 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2185 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT));
2186 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2187 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP));
2188
2189 // Special case: if orientation changes while key is down, we still emit the same keycode
2190 // in the key up as we did in the key down.
2191 NotifyKeyArgs args;
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002192 clearViewports();
2193 prepareDisplay(DISPLAY_ORIENTATION_270);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002194 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002195 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2196 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2197 ASSERT_EQ(KEY_UP, args.scanCode);
2198 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
2199
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002200 clearViewports();
2201 prepareDisplay(DISPLAY_ORIENTATION_180);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002202 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002203 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2204 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2205 ASSERT_EQ(KEY_UP, args.scanCode);
2206 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
2207}
2208
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002209TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_NotOrientationAware) {
2210 // If the keyboard is not orientation aware,
2211 // key events should not be associated with a specific display id
2212 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2213
2214 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2215 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2216 addMapperAndConfigure(mapper);
2217 NotifyKeyArgs args;
2218
2219 // Display id should be ADISPLAY_ID_NONE without any display configuration.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002220 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002221 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002222 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002223 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2224 ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2225
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002226 prepareDisplay(DISPLAY_ORIENTATION_0);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002227 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002228 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002229 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002230 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2231 ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2232}
2233
2234TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_OrientationAware) {
2235 // If the keyboard is orientation aware,
2236 // key events should be associated with the internal viewport
2237 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2238
2239 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2240 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2241 addConfigurationProperty("keyboard.orientationAware", "1");
2242 addMapperAndConfigure(mapper);
2243 NotifyKeyArgs args;
2244
2245 // Display id should be ADISPLAY_ID_NONE without any display configuration.
2246 // ^--- already checked by the previous test
2247
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002248 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002249 UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002250 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002251 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002252 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002253 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2254 ASSERT_EQ(DISPLAY_ID, args.displayId);
2255
2256 constexpr int32_t newDisplayId = 2;
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002257 clearViewports();
2258 setDisplayInfoAndReconfigure(newDisplayId, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002259 UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002260 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002262 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002263 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2264 ASSERT_EQ(newDisplayId, args.displayId);
2265}
2266
Michael Wrightd02c5b62014-02-10 15:10:22 -08002267TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
2268 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2269 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2270 addMapperAndConfigure(mapper);
2271
2272 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
2273 ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2274
2275 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
2276 ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2277}
2278
2279TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
2280 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2281 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2282 addMapperAndConfigure(mapper);
2283
2284 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
2285 ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2286
2287 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
2288 ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2289}
2290
2291TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
2292 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2293 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2294 addMapperAndConfigure(mapper);
2295
2296 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2297
2298 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
2299 uint8_t flags[2] = { 0, 0 };
2300 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
2301 ASSERT_TRUE(flags[0]);
2302 ASSERT_FALSE(flags[1]);
2303}
2304
2305TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
2306 mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/);
2307 mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/);
2308 mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/);
2309 mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
2310 mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
2311 mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
2312
2313 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2314 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2315 addMapperAndConfigure(mapper);
2316
2317 // Initialization should have turned all of the lights off.
2318 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2319 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2320 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2321
2322 // Toggle caps lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002323 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 1);
2324 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002325 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2326 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2327 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2328 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState());
2329
2330 // Toggle num lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002331 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 1);
2332 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002333 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2334 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2335 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2336 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState());
2337
2338 // Toggle caps lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002339 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 1);
2340 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002341 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2342 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2343 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2344 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState());
2345
2346 // Toggle scroll lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002347 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
2348 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002349 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2350 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2351 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2352 ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2353
2354 // Toggle num lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002355 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 1);
2356 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002357 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2358 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2359 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2360 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2361
2362 // Toggle scroll lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002363 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
2364 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002365 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2366 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2367 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2368 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2369}
2370
2371
2372// --- CursorInputMapperTest ---
2373
2374class CursorInputMapperTest : public InputMapperTest {
2375protected:
2376 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
2377
2378 sp<FakePointerController> mFakePointerController;
2379
2380 virtual void SetUp() {
2381 InputMapperTest::SetUp();
2382
2383 mFakePointerController = new FakePointerController();
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002384 mFakePolicy->setPointerController(mDevice->getId(), mFakePointerController);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002385 }
2386
2387 void testMotionRotation(CursorInputMapper* mapper,
2388 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002389
2390 void prepareDisplay(int32_t orientation) {
2391 const std::string uniqueId = "local:0";
2392 const ViewportType viewportType = ViewportType::VIEWPORT_INTERNAL;
2393 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
2394 orientation, uniqueId, NO_PORT, viewportType);
2395 }
Michael Wrightd02c5b62014-02-10 15:10:22 -08002396};
2397
2398const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
2399
2400void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
2401 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
2402 NotifyMotionArgs args;
2403
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002404 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, originalX);
2405 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, originalY);
2406 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002407 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2408 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2409 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2410 float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
2411 float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
2412 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2413}
2414
2415TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
2416 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2417 addConfigurationProperty("cursor.mode", "pointer");
2418 addMapperAndConfigure(mapper);
2419
2420 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
2421}
2422
2423TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
2424 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2425 addConfigurationProperty("cursor.mode", "navigation");
2426 addMapperAndConfigure(mapper);
2427
2428 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
2429}
2430
2431TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
2432 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2433 addConfigurationProperty("cursor.mode", "pointer");
2434 addMapperAndConfigure(mapper);
2435
2436 InputDeviceInfo info;
2437 mapper->populateDeviceInfo(&info);
2438
2439 // Initially there may not be a valid motion range.
Yi Kong9b14ac62018-07-17 13:48:38 -07002440 ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE));
2441 ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002442 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2443 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f));
2444
2445 // When the bounds are set, then there should be a valid motion range.
2446 mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1);
2447
2448 InputDeviceInfo info2;
2449 mapper->populateDeviceInfo(&info2);
2450
2451 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2452 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE,
2453 1, 800 - 1, 0.0f, 0.0f));
2454 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2455 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE,
2456 2, 480 - 1, 0.0f, 0.0f));
2457 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2458 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE,
2459 0.0f, 1.0f, 0.0f, 0.0f));
2460}
2461
2462TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
2463 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2464 addConfigurationProperty("cursor.mode", "navigation");
2465 addMapperAndConfigure(mapper);
2466
2467 InputDeviceInfo info;
2468 mapper->populateDeviceInfo(&info);
2469
2470 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2471 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL,
2472 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2473 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2474 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL,
2475 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2476 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2477 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL,
2478 0.0f, 1.0f, 0.0f, 0.0f));
2479}
2480
2481TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
2482 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2483 addConfigurationProperty("cursor.mode", "navigation");
2484 addMapperAndConfigure(mapper);
2485
2486 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2487
2488 NotifyMotionArgs args;
2489
2490 // Button press.
2491 // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002492 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2493 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002494 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2495 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2496 ASSERT_EQ(DEVICE_ID, args.deviceId);
2497 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2498 ASSERT_EQ(uint32_t(0), args.policyFlags);
2499 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2500 ASSERT_EQ(0, args.flags);
2501 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2502 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2503 ASSERT_EQ(0, args.edgeFlags);
2504 ASSERT_EQ(uint32_t(1), args.pointerCount);
2505 ASSERT_EQ(0, args.pointerProperties[0].id);
2506 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2507 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2508 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2509 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2510 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2511 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2512
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002513 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2514 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2515 ASSERT_EQ(DEVICE_ID, args.deviceId);
2516 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2517 ASSERT_EQ(uint32_t(0), args.policyFlags);
2518 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2519 ASSERT_EQ(0, args.flags);
2520 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2521 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2522 ASSERT_EQ(0, args.edgeFlags);
2523 ASSERT_EQ(uint32_t(1), args.pointerCount);
2524 ASSERT_EQ(0, args.pointerProperties[0].id);
2525 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2526 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2527 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2528 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2529 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2530 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2531
Michael Wrightd02c5b62014-02-10 15:10:22 -08002532 // Button release. Should have same down time.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002533 process(mapper, ARBITRARY_TIME + 1, EV_KEY, BTN_MOUSE, 0);
2534 process(mapper, ARBITRARY_TIME + 1, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002535 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2536 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2537 ASSERT_EQ(DEVICE_ID, args.deviceId);
2538 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2539 ASSERT_EQ(uint32_t(0), args.policyFlags);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002540 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2541 ASSERT_EQ(0, args.flags);
2542 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2543 ASSERT_EQ(0, args.buttonState);
2544 ASSERT_EQ(0, args.edgeFlags);
2545 ASSERT_EQ(uint32_t(1), args.pointerCount);
2546 ASSERT_EQ(0, args.pointerProperties[0].id);
2547 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2548 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2549 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2550 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2551 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2552 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2553
2554 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2555 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2556 ASSERT_EQ(DEVICE_ID, args.deviceId);
2557 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2558 ASSERT_EQ(uint32_t(0), args.policyFlags);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002559 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2560 ASSERT_EQ(0, args.flags);
2561 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2562 ASSERT_EQ(0, args.buttonState);
2563 ASSERT_EQ(0, args.edgeFlags);
2564 ASSERT_EQ(uint32_t(1), args.pointerCount);
2565 ASSERT_EQ(0, args.pointerProperties[0].id);
2566 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2567 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2568 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2569 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2570 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2571 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2572}
2573
2574TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
2575 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2576 addConfigurationProperty("cursor.mode", "navigation");
2577 addMapperAndConfigure(mapper);
2578
2579 NotifyMotionArgs args;
2580
2581 // Motion in X but not Y.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002582 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 1);
2583 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002584 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2585 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2586 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2587 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2588
2589 // Motion in Y but not X.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002590 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, -2);
2591 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002592 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2593 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2594 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2595 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2596}
2597
2598TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
2599 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2600 addConfigurationProperty("cursor.mode", "navigation");
2601 addMapperAndConfigure(mapper);
2602
2603 NotifyMotionArgs args;
2604
2605 // Button press.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002606 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2607 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002608 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2609 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2610 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2611 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2612
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002613 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2614 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2615 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2616 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2617
Michael Wrightd02c5b62014-02-10 15:10:22 -08002618 // Button release.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002619 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 0);
2620 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002621 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002622 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2623 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2624 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2625
2626 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002627 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2628 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2629 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2630}
2631
2632TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
2633 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2634 addConfigurationProperty("cursor.mode", "navigation");
2635 addMapperAndConfigure(mapper);
2636
2637 NotifyMotionArgs args;
2638
2639 // Combined X, Y and Button.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002640 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 1);
2641 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, -2);
2642 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2643 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002644 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2645 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2646 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2647 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2648 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2649
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002650 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2651 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2652 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2653 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2654 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2655
Michael Wrightd02c5b62014-02-10 15:10:22 -08002656 // Move X, Y a bit while pressed.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002657 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 2);
2658 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 1);
2659 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002660 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2661 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2662 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2663 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2664 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2665
2666 // Release Button.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002667 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 0);
2668 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002669 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002670 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2671 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2672 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2673
2674 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002675 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2676 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2677 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2678}
2679
2680TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
2681 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2682 addConfigurationProperty("cursor.mode", "navigation");
2683 addMapperAndConfigure(mapper);
2684
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002685 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002686 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2687 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2688 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2689 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2690 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2691 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2692 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2693 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2694}
2695
2696TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
2697 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2698 addConfigurationProperty("cursor.mode", "navigation");
2699 addConfigurationProperty("cursor.orientationAware", "1");
2700 addMapperAndConfigure(mapper);
2701
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002702 prepareDisplay(DISPLAY_ORIENTATION_0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002703 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2704 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2705 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2706 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2707 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2708 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2709 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2710 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2711
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002712 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002713 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0));
2714 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1));
2715 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1));
2716 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1));
2717 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0));
2718 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1));
2719 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1));
2720 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1));
2721
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002722 prepareDisplay(DISPLAY_ORIENTATION_180);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002723 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1));
2724 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1));
2725 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0));
2726 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1));
2727 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1));
2728 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1));
2729 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0));
2730 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1));
2731
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002732 prepareDisplay(DISPLAY_ORIENTATION_270);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002733 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0));
2734 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1));
2735 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1));
2736 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1));
2737 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0));
2738 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1));
2739 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1));
2740 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1));
2741}
2742
2743TEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) {
2744 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2745 addConfigurationProperty("cursor.mode", "pointer");
2746 addMapperAndConfigure(mapper);
2747
2748 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2749 mFakePointerController->setPosition(100, 200);
2750 mFakePointerController->setButtonState(0);
2751
2752 NotifyMotionArgs motionArgs;
2753 NotifyKeyArgs keyArgs;
2754
2755 // press BTN_LEFT, release BTN_LEFT
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002756 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_LEFT, 1);
2757 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002758 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2759 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2760 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2761 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2762 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2763 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2764
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002765 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2766 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2767 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2768 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2769 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2770 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2771
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002772 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_LEFT, 0);
2773 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002774 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002775 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002776 ASSERT_EQ(0, motionArgs.buttonState);
2777 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002778 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2779 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2780
2781 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002782 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002783 ASSERT_EQ(0, motionArgs.buttonState);
2784 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002785 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2786 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2787
2788 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002789 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002790 ASSERT_EQ(0, motionArgs.buttonState);
2791 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002792 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2793 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2794
2795 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002796 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_RIGHT, 1);
2797 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 1);
2798 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002799 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2800 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2801 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2802 motionArgs.buttonState);
2803 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2804 mFakePointerController->getButtonState());
2805 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2806 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2807
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002808 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2809 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2810 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2811 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2812 mFakePointerController->getButtonState());
2813 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2814 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2815
2816 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2817 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2818 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2819 motionArgs.buttonState);
2820 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2821 mFakePointerController->getButtonState());
2822 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2823 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2824
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002825 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_RIGHT, 0);
2826 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002827 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002828 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002829 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2830 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002831 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2832 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2833
2834 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002835 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002836 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2837 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002838 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2839 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2840
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002841 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 0);
2842 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002843 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002844 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2845 ASSERT_EQ(0, motionArgs.buttonState);
2846 ASSERT_EQ(0, mFakePointerController->getButtonState());
2847 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2848 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 -08002849 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 0);
2850 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002851
2852 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002853 ASSERT_EQ(0, motionArgs.buttonState);
2854 ASSERT_EQ(0, mFakePointerController->getButtonState());
2855 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2856 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2857 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 -08002858
Michael Wrightd02c5b62014-02-10 15:10:22 -08002859 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2860 ASSERT_EQ(0, motionArgs.buttonState);
2861 ASSERT_EQ(0, mFakePointerController->getButtonState());
2862 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2863 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2864 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2865
2866 // press BTN_BACK, release BTN_BACK
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002867 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_BACK, 1);
2868 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002869 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2870 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2871 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002872
Michael Wrightd02c5b62014-02-10 15:10:22 -08002873 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002874 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002875 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2876 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002877 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2878 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2879
2880 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2881 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2882 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2883 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002884 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2885 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2886
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002887 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_BACK, 0);
2888 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002889 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002890 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002891 ASSERT_EQ(0, motionArgs.buttonState);
2892 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002893 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2894 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2895
2896 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002897 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002898 ASSERT_EQ(0, motionArgs.buttonState);
2899 ASSERT_EQ(0, mFakePointerController->getButtonState());
2900
Michael Wrightd02c5b62014-02-10 15:10:22 -08002901 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2902 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2903 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2904 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2905 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2906
2907 // press BTN_SIDE, release BTN_SIDE
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002908 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_SIDE, 1);
2909 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002910 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2911 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2912 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002913
Michael Wrightd02c5b62014-02-10 15:10:22 -08002914 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002915 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002916 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2917 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002918 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2919 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2920
2921 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2922 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2923 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2924 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002925 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2926 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2927
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002928 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_SIDE, 0);
2929 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002930 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002931 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002932 ASSERT_EQ(0, motionArgs.buttonState);
2933 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002934 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2935 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 -08002936
2937 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2938 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2939 ASSERT_EQ(0, motionArgs.buttonState);
2940 ASSERT_EQ(0, mFakePointerController->getButtonState());
2941 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2942 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2943
Michael Wrightd02c5b62014-02-10 15:10:22 -08002944 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2945 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2946 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2947
2948 // press BTN_FORWARD, release BTN_FORWARD
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002949 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_FORWARD, 1);
2950 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002951 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2952 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2953 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002954
Michael Wrightd02c5b62014-02-10 15:10:22 -08002955 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002956 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002957 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2958 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -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
2962 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2963 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2964 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2965 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002966 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2967 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2968
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002969 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_FORWARD, 0);
2970 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002971 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002972 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002973 ASSERT_EQ(0, motionArgs.buttonState);
2974 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002975 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2976 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 -08002977
2978 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2979 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2980 ASSERT_EQ(0, motionArgs.buttonState);
2981 ASSERT_EQ(0, mFakePointerController->getButtonState());
2982 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2983 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2984
Michael Wrightd02c5b62014-02-10 15:10:22 -08002985 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2986 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2987 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2988
2989 // press BTN_EXTRA, release BTN_EXTRA
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002990 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_EXTRA, 1);
2991 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002992 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2993 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2994 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002995
Michael Wrightd02c5b62014-02-10 15:10:22 -08002996 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002997 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002998 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2999 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003000 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3001 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3002
3003 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3004 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3005 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3006 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003007 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3008 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3009
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003010 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_EXTRA, 0);
3011 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003012 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003013 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003014 ASSERT_EQ(0, motionArgs.buttonState);
3015 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003016 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3017 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 -08003018
3019 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3020 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3021 ASSERT_EQ(0, motionArgs.buttonState);
3022 ASSERT_EQ(0, mFakePointerController->getButtonState());
3023 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3024 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3025
Michael Wrightd02c5b62014-02-10 15:10:22 -08003026 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3027 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3028 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3029}
3030
3031TEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) {
3032 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3033 addConfigurationProperty("cursor.mode", "pointer");
3034 addMapperAndConfigure(mapper);
3035
3036 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3037 mFakePointerController->setPosition(100, 200);
3038 mFakePointerController->setButtonState(0);
3039
3040 NotifyMotionArgs args;
3041
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003042 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3043 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3044 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003045 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003046 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
3047 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3048 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3049 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3050 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3051}
3052
3053TEST_F(CursorInputMapperTest, Process_PointerCapture) {
3054 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3055 addConfigurationProperty("cursor.mode", "pointer");
3056 mFakePolicy->setPointerCapture(true);
3057 addMapperAndConfigure(mapper);
3058
3059 NotifyDeviceResetArgs resetArgs;
3060 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
3061 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
3062 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
3063
3064 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3065 mFakePointerController->setPosition(100, 200);
3066 mFakePointerController->setButtonState(0);
3067
3068 NotifyMotionArgs args;
3069
3070 // Move.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003071 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3072 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3073 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003074 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3075 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3076 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
3077 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3078 10.0f, 20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3079 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
3080
3081 // Button press.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003082 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
3083 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003084 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3085 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3086 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
3087 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3088 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3089 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3090 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3091 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
3092 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3093 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3094
3095 // Button release.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003096 process(mapper, ARBITRARY_TIME + 2, EV_KEY, BTN_MOUSE, 0);
3097 process(mapper, ARBITRARY_TIME + 2, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003098 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3099 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3100 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
3101 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3102 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3103 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3104 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3105 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
3106 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3107 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3108
3109 // Another move.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003110 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 30);
3111 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 40);
3112 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003113 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3114 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3115 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
3116 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3117 30.0f, 40.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3118 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
3119
3120 // Disable pointer capture and check that the device generation got bumped
3121 // and events are generated the usual way.
3122 const uint32_t generation = mFakeContext->getGeneration();
3123 mFakePolicy->setPointerCapture(false);
3124 configureDevice(InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
3125 ASSERT_TRUE(mFakeContext->getGeneration() != generation);
3126
3127 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
3128 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
3129 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
3130
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003131 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3132 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3133 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003134 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3135 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003136 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3137 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3138 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3139 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3140}
3141
Andrii Kulian620f6d92018-09-14 16:51:59 -07003142TEST_F(CursorInputMapperTest, Process_ShouldHandleDisplayId) {
3143 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3144 addMapperAndConfigure(mapper);
3145
3146 // Setup PointerController for second display.
3147 constexpr int32_t SECOND_DISPLAY_ID = 1;
3148 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3149 mFakePointerController->setPosition(100, 200);
3150 mFakePointerController->setButtonState(0);
3151 mFakePointerController->setDisplayId(SECOND_DISPLAY_ID);
3152
3153 NotifyMotionArgs args;
3154 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3155 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3156 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3157 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3158 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
3159 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3160 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3161 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3162 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3163 ASSERT_EQ(SECOND_DISPLAY_ID, args.displayId);
3164}
3165
Michael Wrightd02c5b62014-02-10 15:10:22 -08003166
3167// --- TouchInputMapperTest ---
3168
3169class TouchInputMapperTest : public InputMapperTest {
3170protected:
3171 static const int32_t RAW_X_MIN;
3172 static const int32_t RAW_X_MAX;
3173 static const int32_t RAW_Y_MIN;
3174 static const int32_t RAW_Y_MAX;
3175 static const int32_t RAW_TOUCH_MIN;
3176 static const int32_t RAW_TOUCH_MAX;
3177 static const int32_t RAW_TOOL_MIN;
3178 static const int32_t RAW_TOOL_MAX;
3179 static const int32_t RAW_PRESSURE_MIN;
3180 static const int32_t RAW_PRESSURE_MAX;
3181 static const int32_t RAW_ORIENTATION_MIN;
3182 static const int32_t RAW_ORIENTATION_MAX;
3183 static const int32_t RAW_DISTANCE_MIN;
3184 static const int32_t RAW_DISTANCE_MAX;
3185 static const int32_t RAW_TILT_MIN;
3186 static const int32_t RAW_TILT_MAX;
3187 static const int32_t RAW_ID_MIN;
3188 static const int32_t RAW_ID_MAX;
3189 static const int32_t RAW_SLOT_MIN;
3190 static const int32_t RAW_SLOT_MAX;
3191 static const float X_PRECISION;
3192 static const float Y_PRECISION;
Santos Cordonfa5cf462017-04-05 10:37:00 -07003193 static const float X_PRECISION_VIRTUAL;
3194 static const float Y_PRECISION_VIRTUAL;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003195
3196 static const float GEOMETRIC_SCALE;
Jason Gerecke489fda82012-09-07 17:19:40 -07003197 static const TouchAffineTransformation AFFINE_TRANSFORM;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003198
3199 static const VirtualKeyDefinition VIRTUAL_KEYS[2];
3200
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003201 const std::string UNIQUE_ID = "local:0";
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003202 const std::string SECONDARY_UNIQUE_ID = "local:1";
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003203
Michael Wrightd02c5b62014-02-10 15:10:22 -08003204 enum Axes {
3205 POSITION = 1 << 0,
3206 TOUCH = 1 << 1,
3207 TOOL = 1 << 2,
3208 PRESSURE = 1 << 3,
3209 ORIENTATION = 1 << 4,
3210 MINOR = 1 << 5,
3211 ID = 1 << 6,
3212 DISTANCE = 1 << 7,
3213 TILT = 1 << 8,
3214 SLOT = 1 << 9,
3215 TOOL_TYPE = 1 << 10,
3216 };
3217
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003218 void prepareDisplay(int32_t orientation, std::optional<uint8_t> port = NO_PORT);
3219 void prepareSecondaryDisplay(ViewportType type, std::optional<uint8_t> port = NO_PORT);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003220 void prepareVirtualDisplay(int32_t orientation);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003221 void prepareVirtualKeys();
Jason Gerecke489fda82012-09-07 17:19:40 -07003222 void prepareLocationCalibration();
Michael Wrightd02c5b62014-02-10 15:10:22 -08003223 int32_t toRawX(float displayX);
3224 int32_t toRawY(float displayY);
Jason Gerecke489fda82012-09-07 17:19:40 -07003225 float toCookedX(float rawX, float rawY);
3226 float toCookedY(float rawX, float rawY);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003227 float toDisplayX(int32_t rawX);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003228 float toDisplayX(int32_t rawX, int32_t displayWidth);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003229 float toDisplayY(int32_t rawY);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003230 float toDisplayY(int32_t rawY, int32_t displayHeight);
3231
Michael Wrightd02c5b62014-02-10 15:10:22 -08003232};
3233
3234const int32_t TouchInputMapperTest::RAW_X_MIN = 25;
3235const int32_t TouchInputMapperTest::RAW_X_MAX = 1019;
3236const int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
3237const int32_t TouchInputMapperTest::RAW_Y_MAX = 1009;
3238const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
3239const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
3240const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
3241const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
Michael Wrightaa449c92017-12-13 21:21:43 +00003242const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = 0;
3243const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = 255;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003244const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
3245const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
3246const int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0;
3247const int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7;
3248const int32_t TouchInputMapperTest::RAW_TILT_MIN = 0;
3249const int32_t TouchInputMapperTest::RAW_TILT_MAX = 150;
3250const int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
3251const int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
3252const int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0;
3253const int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9;
3254const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH;
3255const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT;
Santos Cordonfa5cf462017-04-05 10:37:00 -07003256const float TouchInputMapperTest::X_PRECISION_VIRTUAL =
3257 float(RAW_X_MAX - RAW_X_MIN + 1) / VIRTUAL_DISPLAY_WIDTH;
3258const float TouchInputMapperTest::Y_PRECISION_VIRTUAL =
3259 float(RAW_Y_MAX - RAW_Y_MIN + 1) / VIRTUAL_DISPLAY_HEIGHT;
Jason Gerecke489fda82012-09-07 17:19:40 -07003260const TouchAffineTransformation TouchInputMapperTest::AFFINE_TRANSFORM =
3261 TouchAffineTransformation(1, -2, 3, -4, 5, -6);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003262
3263const float TouchInputMapperTest::GEOMETRIC_SCALE =
3264 avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1),
3265 float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1));
3266
3267const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
3268 { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
3269 { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
3270};
3271
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003272void TouchInputMapperTest::prepareDisplay(int32_t orientation, std::optional<uint8_t> port) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003273 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003274 UNIQUE_ID, port, ViewportType::VIEWPORT_INTERNAL);
3275}
3276
3277void TouchInputMapperTest::prepareSecondaryDisplay(ViewportType type, std::optional<uint8_t> port) {
3278 setDisplayInfoAndReconfigure(SECONDARY_DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
3279 DISPLAY_ORIENTATION_0, SECONDARY_UNIQUE_ID, port, type);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003280}
3281
Santos Cordonfa5cf462017-04-05 10:37:00 -07003282void TouchInputMapperTest::prepareVirtualDisplay(int32_t orientation) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003283 setDisplayInfoAndReconfigure(VIRTUAL_DISPLAY_ID, VIRTUAL_DISPLAY_WIDTH,
3284 VIRTUAL_DISPLAY_HEIGHT, orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003285 VIRTUAL_DISPLAY_UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003286}
3287
Michael Wrightd02c5b62014-02-10 15:10:22 -08003288void TouchInputMapperTest::prepareVirtualKeys() {
3289 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]);
3290 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]);
3291 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
3292 mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE);
3293}
3294
Jason Gerecke489fda82012-09-07 17:19:40 -07003295void TouchInputMapperTest::prepareLocationCalibration() {
3296 mFakePolicy->setTouchAffineTransformation(AFFINE_TRANSFORM);
3297}
3298
Michael Wrightd02c5b62014-02-10 15:10:22 -08003299int32_t TouchInputMapperTest::toRawX(float displayX) {
3300 return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN);
3301}
3302
3303int32_t TouchInputMapperTest::toRawY(float displayY) {
3304 return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN);
3305}
3306
Jason Gerecke489fda82012-09-07 17:19:40 -07003307float TouchInputMapperTest::toCookedX(float rawX, float rawY) {
3308 AFFINE_TRANSFORM.applyTo(rawX, rawY);
3309 return rawX;
3310}
3311
3312float TouchInputMapperTest::toCookedY(float rawX, float rawY) {
3313 AFFINE_TRANSFORM.applyTo(rawX, rawY);
3314 return rawY;
3315}
3316
Michael Wrightd02c5b62014-02-10 15:10:22 -08003317float TouchInputMapperTest::toDisplayX(int32_t rawX) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07003318 return toDisplayX(rawX, DISPLAY_WIDTH);
3319}
3320
3321float TouchInputMapperTest::toDisplayX(int32_t rawX, int32_t displayWidth) {
3322 return float(rawX - RAW_X_MIN) * displayWidth / (RAW_X_MAX - RAW_X_MIN + 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003323}
3324
3325float TouchInputMapperTest::toDisplayY(int32_t rawY) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07003326 return toDisplayY(rawY, DISPLAY_HEIGHT);
3327}
3328
3329float TouchInputMapperTest::toDisplayY(int32_t rawY, int32_t displayHeight) {
3330 return float(rawY - RAW_Y_MIN) * displayHeight / (RAW_Y_MAX - RAW_Y_MIN + 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003331}
3332
3333
3334// --- SingleTouchInputMapperTest ---
3335
3336class SingleTouchInputMapperTest : public TouchInputMapperTest {
3337protected:
3338 void prepareButtons();
3339 void prepareAxes(int axes);
3340
3341 void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3342 void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3343 void processUp(SingleTouchInputMapper* mappery);
3344 void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
3345 void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
3346 void processDistance(SingleTouchInputMapper* mapper, int32_t distance);
3347 void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY);
3348 void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value);
3349 void processSync(SingleTouchInputMapper* mapper);
3350};
3351
3352void SingleTouchInputMapperTest::prepareButtons() {
3353 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
3354}
3355
3356void SingleTouchInputMapperTest::prepareAxes(int axes) {
3357 if (axes & POSITION) {
3358 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X,
3359 RAW_X_MIN, RAW_X_MAX, 0, 0);
3360 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y,
3361 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
3362 }
3363 if (axes & PRESSURE) {
3364 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE,
3365 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
3366 }
3367 if (axes & TOOL) {
3368 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH,
3369 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
3370 }
3371 if (axes & DISTANCE) {
3372 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE,
3373 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
3374 }
3375 if (axes & TILT) {
3376 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X,
3377 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3378 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y,
3379 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3380 }
3381}
3382
3383void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003384 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 1);
3385 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_X, x);
3386 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003387}
3388
3389void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003390 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_X, x);
3391 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003392}
3393
3394void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003395 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003396}
3397
3398void SingleTouchInputMapperTest::processPressure(
3399 SingleTouchInputMapper* mapper, int32_t pressure) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003400 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_PRESSURE, pressure);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003401}
3402
3403void SingleTouchInputMapperTest::processToolMajor(
3404 SingleTouchInputMapper* mapper, int32_t toolMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003405 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TOOL_WIDTH, toolMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003406}
3407
3408void SingleTouchInputMapperTest::processDistance(
3409 SingleTouchInputMapper* mapper, int32_t distance) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003410 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_DISTANCE, distance);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003411}
3412
3413void SingleTouchInputMapperTest::processTilt(
3414 SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003415 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TILT_X, tiltX);
3416 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TILT_Y, tiltY);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003417}
3418
3419void SingleTouchInputMapperTest::processKey(
3420 SingleTouchInputMapper* mapper, int32_t code, int32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003421 process(mapper, ARBITRARY_TIME, EV_KEY, code, value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003422}
3423
3424void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003425 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003426}
3427
3428
3429TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) {
3430 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3431 prepareButtons();
3432 prepareAxes(POSITION);
3433 addMapperAndConfigure(mapper);
3434
3435 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
3436}
3437
3438TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) {
3439 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3440 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X);
3441 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y);
3442 prepareButtons();
3443 prepareAxes(POSITION);
3444 addMapperAndConfigure(mapper);
3445
3446 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3447}
3448
3449TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) {
3450 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3451 prepareButtons();
3452 prepareAxes(POSITION);
3453 addConfigurationProperty("touch.deviceType", "touchPad");
3454 addMapperAndConfigure(mapper);
3455
3456 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3457}
3458
3459TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) {
3460 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3461 prepareButtons();
3462 prepareAxes(POSITION);
3463 addConfigurationProperty("touch.deviceType", "touchScreen");
3464 addMapperAndConfigure(mapper);
3465
3466 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
3467}
3468
3469TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
3470 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3471 addConfigurationProperty("touch.deviceType", "touchScreen");
3472 prepareDisplay(DISPLAY_ORIENTATION_0);
3473 prepareButtons();
3474 prepareAxes(POSITION);
3475 prepareVirtualKeys();
3476 addMapperAndConfigure(mapper);
3477
3478 // Unknown key.
3479 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
3480
3481 // Virtual key is down.
3482 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3483 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3484 processDown(mapper, x, y);
3485 processSync(mapper);
3486 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3487
3488 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3489
3490 // Virtual key is up.
3491 processUp(mapper);
3492 processSync(mapper);
3493 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3494
3495 ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3496}
3497
3498TEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
3499 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3500 addConfigurationProperty("touch.deviceType", "touchScreen");
3501 prepareDisplay(DISPLAY_ORIENTATION_0);
3502 prepareButtons();
3503 prepareAxes(POSITION);
3504 prepareVirtualKeys();
3505 addMapperAndConfigure(mapper);
3506
3507 // Unknown key.
3508 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
3509
3510 // Virtual key is down.
3511 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3512 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3513 processDown(mapper, x, y);
3514 processSync(mapper);
3515 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3516
3517 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3518
3519 // Virtual key is up.
3520 processUp(mapper);
3521 processSync(mapper);
3522 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3523
3524 ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3525}
3526
3527TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
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 const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
3537 uint8_t flags[2] = { 0, 0 };
3538 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
3539 ASSERT_TRUE(flags[0]);
3540 ASSERT_FALSE(flags[1]);
3541}
3542
3543TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
3544 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3545 addConfigurationProperty("touch.deviceType", "touchScreen");
3546 prepareDisplay(DISPLAY_ORIENTATION_0);
3547 prepareButtons();
3548 prepareAxes(POSITION);
3549 prepareVirtualKeys();
3550 addMapperAndConfigure(mapper);
3551
3552 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3553
3554 NotifyKeyArgs args;
3555
3556 // Press virtual key.
3557 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3558 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3559 processDown(mapper, x, y);
3560 processSync(mapper);
3561
3562 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3563 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3564 ASSERT_EQ(DEVICE_ID, args.deviceId);
3565 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3566 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3567 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
3568 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3569 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3570 ASSERT_EQ(KEY_HOME, args.scanCode);
3571 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3572 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3573
3574 // Release virtual key.
3575 processUp(mapper);
3576 processSync(mapper);
3577
3578 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3579 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3580 ASSERT_EQ(DEVICE_ID, args.deviceId);
3581 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3582 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3583 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
3584 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3585 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3586 ASSERT_EQ(KEY_HOME, args.scanCode);
3587 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3588 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3589
3590 // Should not have sent any motions.
3591 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3592}
3593
3594TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
3595 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3596 addConfigurationProperty("touch.deviceType", "touchScreen");
3597 prepareDisplay(DISPLAY_ORIENTATION_0);
3598 prepareButtons();
3599 prepareAxes(POSITION);
3600 prepareVirtualKeys();
3601 addMapperAndConfigure(mapper);
3602
3603 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3604
3605 NotifyKeyArgs keyArgs;
3606
3607 // Press virtual key.
3608 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3609 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3610 processDown(mapper, x, y);
3611 processSync(mapper);
3612
3613 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3614 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3615 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3616 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3617 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3618 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3619 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
3620 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3621 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3622 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3623 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3624
3625 // Move out of bounds. This should generate a cancel and a pointer down since we moved
3626 // into the display area.
3627 y -= 100;
3628 processMove(mapper, x, y);
3629 processSync(mapper);
3630
3631 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3632 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3633 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3634 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3635 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3636 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3637 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
3638 | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
3639 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3640 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3641 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3642 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3643
3644 NotifyMotionArgs motionArgs;
3645 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3646 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3647 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3648 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3649 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3650 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3651 ASSERT_EQ(0, motionArgs.flags);
3652 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3653 ASSERT_EQ(0, motionArgs.buttonState);
3654 ASSERT_EQ(0, motionArgs.edgeFlags);
3655 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3656 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3657 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3658 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3659 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3660 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3661 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3662 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3663
3664 // Keep moving out of bounds. Should generate a pointer move.
3665 y -= 50;
3666 processMove(mapper, x, y);
3667 processSync(mapper);
3668
3669 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3670 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3671 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3672 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3673 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3674 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3675 ASSERT_EQ(0, motionArgs.flags);
3676 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3677 ASSERT_EQ(0, motionArgs.buttonState);
3678 ASSERT_EQ(0, motionArgs.edgeFlags);
3679 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3680 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3681 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3682 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3683 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3684 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3685 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3686 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3687
3688 // Release out of bounds. Should generate a pointer up.
3689 processUp(mapper);
3690 processSync(mapper);
3691
3692 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3693 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3694 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3695 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3696 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3697 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3698 ASSERT_EQ(0, motionArgs.flags);
3699 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3700 ASSERT_EQ(0, motionArgs.buttonState);
3701 ASSERT_EQ(0, motionArgs.edgeFlags);
3702 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3703 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3704 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3705 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3706 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3707 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3708 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3709 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3710
3711 // Should not have sent any more keys or motions.
3712 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3713 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3714}
3715
3716TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
3717 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3718 addConfigurationProperty("touch.deviceType", "touchScreen");
3719 prepareDisplay(DISPLAY_ORIENTATION_0);
3720 prepareButtons();
3721 prepareAxes(POSITION);
3722 prepareVirtualKeys();
3723 addMapperAndConfigure(mapper);
3724
3725 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3726
3727 NotifyMotionArgs motionArgs;
3728
3729 // Initially go down out of bounds.
3730 int32_t x = -10;
3731 int32_t y = -10;
3732 processDown(mapper, x, y);
3733 processSync(mapper);
3734
3735 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3736
3737 // Move into the display area. Should generate a pointer down.
3738 x = 50;
3739 y = 75;
3740 processMove(mapper, x, y);
3741 processSync(mapper);
3742
3743 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3744 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3745 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3746 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3747 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3748 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3749 ASSERT_EQ(0, motionArgs.flags);
3750 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3751 ASSERT_EQ(0, motionArgs.buttonState);
3752 ASSERT_EQ(0, motionArgs.edgeFlags);
3753 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3754 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3755 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3756 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3757 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3758 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3759 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3760 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3761
3762 // Release. Should generate a pointer up.
3763 processUp(mapper);
3764 processSync(mapper);
3765
3766 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3767 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3768 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3769 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3770 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3771 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3772 ASSERT_EQ(0, motionArgs.flags);
3773 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3774 ASSERT_EQ(0, motionArgs.buttonState);
3775 ASSERT_EQ(0, motionArgs.edgeFlags);
3776 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3777 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3778 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3779 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3780 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3781 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3782 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3783 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3784
3785 // Should not have sent any more keys or motions.
3786 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3787 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3788}
3789
Santos Cordonfa5cf462017-04-05 10:37:00 -07003790TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture_VirtualDisplay) {
3791 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3792 addConfigurationProperty("touch.deviceType", "touchScreen");
3793 addConfigurationProperty("touch.displayId", VIRTUAL_DISPLAY_UNIQUE_ID);
3794
3795 prepareVirtualDisplay(DISPLAY_ORIENTATION_0);
3796 prepareButtons();
3797 prepareAxes(POSITION);
3798 prepareVirtualKeys();
3799 addMapperAndConfigure(mapper);
3800
3801 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3802
3803 NotifyMotionArgs motionArgs;
3804
3805 // Down.
3806 int32_t x = 100;
3807 int32_t y = 125;
3808 processDown(mapper, x, y);
3809 processSync(mapper);
3810
3811 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3812 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3813 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3814 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3815 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3816 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3817 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3818 ASSERT_EQ(0, motionArgs.flags);
3819 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3820 ASSERT_EQ(0, motionArgs.buttonState);
3821 ASSERT_EQ(0, motionArgs.edgeFlags);
3822 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3823 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3824 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3825 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3826 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3827 1, 0, 0, 0, 0, 0, 0, 0));
3828 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3829 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3830 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3831
3832 // Move.
3833 x += 50;
3834 y += 75;
3835 processMove(mapper, x, y);
3836 processSync(mapper);
3837
3838 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3839 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3840 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3841 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3842 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3843 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3844 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3845 ASSERT_EQ(0, motionArgs.flags);
3846 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3847 ASSERT_EQ(0, motionArgs.buttonState);
3848 ASSERT_EQ(0, motionArgs.edgeFlags);
3849 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3850 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3851 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3852 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3853 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3854 1, 0, 0, 0, 0, 0, 0, 0));
3855 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3856 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3857 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3858
3859 // Up.
3860 processUp(mapper);
3861 processSync(mapper);
3862
3863 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3864 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3865 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3866 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3867 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3868 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3869 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3870 ASSERT_EQ(0, motionArgs.flags);
3871 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3872 ASSERT_EQ(0, motionArgs.buttonState);
3873 ASSERT_EQ(0, motionArgs.edgeFlags);
3874 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3875 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3876 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3877 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3878 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3879 1, 0, 0, 0, 0, 0, 0, 0));
3880 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3881 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3882 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3883
3884 // Should not have sent any more keys or motions.
3885 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3886 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3887}
3888
Michael Wrightd02c5b62014-02-10 15:10:22 -08003889TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
3890 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3891 addConfigurationProperty("touch.deviceType", "touchScreen");
3892 prepareDisplay(DISPLAY_ORIENTATION_0);
3893 prepareButtons();
3894 prepareAxes(POSITION);
3895 prepareVirtualKeys();
3896 addMapperAndConfigure(mapper);
3897
3898 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3899
3900 NotifyMotionArgs motionArgs;
3901
3902 // Down.
3903 int32_t x = 100;
3904 int32_t y = 125;
3905 processDown(mapper, x, y);
3906 processSync(mapper);
3907
3908 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3909 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3910 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3911 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3912 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3913 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3914 ASSERT_EQ(0, motionArgs.flags);
3915 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3916 ASSERT_EQ(0, motionArgs.buttonState);
3917 ASSERT_EQ(0, motionArgs.edgeFlags);
3918 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3919 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3920 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3921 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3922 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3923 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3924 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3925 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3926
3927 // Move.
3928 x += 50;
3929 y += 75;
3930 processMove(mapper, x, y);
3931 processSync(mapper);
3932
3933 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3934 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3935 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3936 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3937 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3938 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3939 ASSERT_EQ(0, motionArgs.flags);
3940 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3941 ASSERT_EQ(0, motionArgs.buttonState);
3942 ASSERT_EQ(0, motionArgs.edgeFlags);
3943 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3944 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3945 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3946 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3947 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3948 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3949 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3950 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3951
3952 // Up.
3953 processUp(mapper);
3954 processSync(mapper);
3955
3956 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3957 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3958 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3959 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3960 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3961 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3962 ASSERT_EQ(0, motionArgs.flags);
3963 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3964 ASSERT_EQ(0, motionArgs.buttonState);
3965 ASSERT_EQ(0, motionArgs.edgeFlags);
3966 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3967 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3968 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3969 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3970 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3971 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3972 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3973 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3974
3975 // Should not have sent any more keys or motions.
3976 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3977 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3978}
3979
3980TEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) {
3981 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3982 addConfigurationProperty("touch.deviceType", "touchScreen");
3983 prepareButtons();
3984 prepareAxes(POSITION);
3985 addConfigurationProperty("touch.orientationAware", "0");
3986 addMapperAndConfigure(mapper);
3987
3988 NotifyMotionArgs args;
3989
3990 // Rotation 90.
3991 prepareDisplay(DISPLAY_ORIENTATION_90);
3992 processDown(mapper, toRawX(50), toRawY(75));
3993 processSync(mapper);
3994
3995 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3996 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3997 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3998
3999 processUp(mapper);
4000 processSync(mapper);
4001 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4002}
4003
4004TEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) {
4005 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4006 addConfigurationProperty("touch.deviceType", "touchScreen");
4007 prepareButtons();
4008 prepareAxes(POSITION);
4009 addMapperAndConfigure(mapper);
4010
4011 NotifyMotionArgs args;
4012
4013 // Rotation 0.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004014 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004015 prepareDisplay(DISPLAY_ORIENTATION_0);
4016 processDown(mapper, toRawX(50), toRawY(75));
4017 processSync(mapper);
4018
4019 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4020 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4021 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4022
4023 processUp(mapper);
4024 processSync(mapper);
4025 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4026
4027 // Rotation 90.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004028 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004029 prepareDisplay(DISPLAY_ORIENTATION_90);
4030 processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50));
4031 processSync(mapper);
4032
4033 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4034 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4035 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4036
4037 processUp(mapper);
4038 processSync(mapper);
4039 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4040
4041 // Rotation 180.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004042 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004043 prepareDisplay(DISPLAY_ORIENTATION_180);
4044 processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN);
4045 processSync(mapper);
4046
4047 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4048 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4049 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4050
4051 processUp(mapper);
4052 processSync(mapper);
4053 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4054
4055 // Rotation 270.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004056 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004057 prepareDisplay(DISPLAY_ORIENTATION_270);
4058 processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN);
4059 processSync(mapper);
4060
4061 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4062 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4063 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4064
4065 processUp(mapper);
4066 processSync(mapper);
4067 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4068}
4069
4070TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
4071 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4072 addConfigurationProperty("touch.deviceType", "touchScreen");
4073 prepareDisplay(DISPLAY_ORIENTATION_0);
4074 prepareButtons();
4075 prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT);
4076 addMapperAndConfigure(mapper);
4077
4078 // These calculations are based on the input device calibration documentation.
4079 int32_t rawX = 100;
4080 int32_t rawY = 200;
4081 int32_t rawPressure = 10;
4082 int32_t rawToolMajor = 12;
4083 int32_t rawDistance = 2;
4084 int32_t rawTiltX = 30;
4085 int32_t rawTiltY = 110;
4086
4087 float x = toDisplayX(rawX);
4088 float y = toDisplayY(rawY);
4089 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
4090 float size = float(rawToolMajor) / RAW_TOOL_MAX;
4091 float tool = float(rawToolMajor) * GEOMETRIC_SCALE;
4092 float distance = float(rawDistance);
4093
4094 float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f;
4095 float tiltScale = M_PI / 180;
4096 float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale;
4097 float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale;
4098 float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle));
4099 float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle));
4100
4101 processDown(mapper, rawX, rawY);
4102 processPressure(mapper, rawPressure);
4103 processToolMajor(mapper, rawToolMajor);
4104 processDistance(mapper, rawDistance);
4105 processTilt(mapper, rawTiltX, rawTiltY);
4106 processSync(mapper);
4107
4108 NotifyMotionArgs args;
4109 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4110 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4111 x, y, pressure, size, tool, tool, tool, tool, orientation, distance));
4112 ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT));
4113}
4114
Jason Gerecke489fda82012-09-07 17:19:40 -07004115TEST_F(SingleTouchInputMapperTest, Process_XYAxes_AffineCalibration) {
4116 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4117 addConfigurationProperty("touch.deviceType", "touchScreen");
4118 prepareDisplay(DISPLAY_ORIENTATION_0);
4119 prepareLocationCalibration();
4120 prepareButtons();
4121 prepareAxes(POSITION);
4122 addMapperAndConfigure(mapper);
4123
4124 int32_t rawX = 100;
4125 int32_t rawY = 200;
4126
4127 float x = toDisplayX(toCookedX(rawX, rawY));
4128 float y = toDisplayY(toCookedY(rawX, rawY));
4129
4130 processDown(mapper, rawX, rawY);
4131 processSync(mapper);
4132
4133 NotifyMotionArgs args;
4134 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4135 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4136 x, y, 1, 0, 0, 0, 0, 0, 0, 0));
4137}
4138
Michael Wrightd02c5b62014-02-10 15:10:22 -08004139TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) {
4140 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4141 addConfigurationProperty("touch.deviceType", "touchScreen");
4142 prepareDisplay(DISPLAY_ORIENTATION_0);
4143 prepareButtons();
4144 prepareAxes(POSITION);
4145 addMapperAndConfigure(mapper);
4146
4147 NotifyMotionArgs motionArgs;
4148 NotifyKeyArgs keyArgs;
4149
4150 processDown(mapper, 100, 200);
4151 processSync(mapper);
4152 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4153 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4154 ASSERT_EQ(0, motionArgs.buttonState);
4155
4156 // press BTN_LEFT, release BTN_LEFT
4157 processKey(mapper, BTN_LEFT, 1);
4158 processSync(mapper);
4159 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4160 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4161 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4162
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004163 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4164 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4165 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4166
Michael Wrightd02c5b62014-02-10 15:10:22 -08004167 processKey(mapper, BTN_LEFT, 0);
4168 processSync(mapper);
4169 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004170 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004171 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004172
4173 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004174 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004175 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004176
4177 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
4178 processKey(mapper, BTN_RIGHT, 1);
4179 processKey(mapper, BTN_MIDDLE, 1);
4180 processSync(mapper);
4181 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4182 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4183 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4184 motionArgs.buttonState);
4185
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004186 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4187 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4188 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4189
4190 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4191 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4192 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4193 motionArgs.buttonState);
4194
Michael Wrightd02c5b62014-02-10 15:10:22 -08004195 processKey(mapper, BTN_RIGHT, 0);
4196 processSync(mapper);
4197 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004198 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004199 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004200
4201 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004202 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004203 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004204
4205 processKey(mapper, BTN_MIDDLE, 0);
4206 processSync(mapper);
4207 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004208 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004209 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004210
4211 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004212 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004213 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004214
4215 // press BTN_BACK, release BTN_BACK
4216 processKey(mapper, BTN_BACK, 1);
4217 processSync(mapper);
4218 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4219 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4220 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004221
Michael Wrightd02c5b62014-02-10 15:10:22 -08004222 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004223 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004224 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4225
4226 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4227 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4228 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004229
4230 processKey(mapper, BTN_BACK, 0);
4231 processSync(mapper);
4232 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004233 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004234 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004235
4236 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004237 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004238 ASSERT_EQ(0, motionArgs.buttonState);
4239
Michael Wrightd02c5b62014-02-10 15:10:22 -08004240 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4241 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4242 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4243
4244 // press BTN_SIDE, release BTN_SIDE
4245 processKey(mapper, BTN_SIDE, 1);
4246 processSync(mapper);
4247 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4248 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4249 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004250
Michael Wrightd02c5b62014-02-10 15:10:22 -08004251 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004252 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004253 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4254
4255 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4256 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4257 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004258
4259 processKey(mapper, BTN_SIDE, 0);
4260 processSync(mapper);
4261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004262 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004263 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004264
4265 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004266 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004267 ASSERT_EQ(0, motionArgs.buttonState);
4268
Michael Wrightd02c5b62014-02-10 15:10:22 -08004269 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4270 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4271 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4272
4273 // press BTN_FORWARD, release BTN_FORWARD
4274 processKey(mapper, BTN_FORWARD, 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_FORWARD, 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_FORWARD, 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_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004287
4288 processKey(mapper, BTN_FORWARD, 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_FORWARD, keyArgs.keyCode);
4301
4302 // press BTN_EXTRA, release BTN_EXTRA
4303 processKey(mapper, BTN_EXTRA, 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_FORWARD, 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_FORWARD, 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_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004316
4317 processKey(mapper, BTN_EXTRA, 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_FORWARD, keyArgs.keyCode);
4330
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004331 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4332
Michael Wrightd02c5b62014-02-10 15:10:22 -08004333 // press BTN_STYLUS, release BTN_STYLUS
4334 processKey(mapper, BTN_STYLUS, 1);
4335 processSync(mapper);
4336 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4337 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004338 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
4339
4340 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4341 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4342 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004343
4344 processKey(mapper, BTN_STYLUS, 0);
4345 processSync(mapper);
4346 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004347 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004348 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004349
4350 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004351 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004352 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004353
4354 // press BTN_STYLUS2, release BTN_STYLUS2
4355 processKey(mapper, BTN_STYLUS2, 1);
4356 processSync(mapper);
4357 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4358 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004359 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
4360
4361 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4362 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4363 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004364
4365 processKey(mapper, BTN_STYLUS2, 0);
4366 processSync(mapper);
4367 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004368 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004369 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004370
4371 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004372 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004373 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004374
4375 // release touch
4376 processUp(mapper);
4377 processSync(mapper);
4378 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4379 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4380 ASSERT_EQ(0, motionArgs.buttonState);
4381}
4382
4383TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
4384 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4385 addConfigurationProperty("touch.deviceType", "touchScreen");
4386 prepareDisplay(DISPLAY_ORIENTATION_0);
4387 prepareButtons();
4388 prepareAxes(POSITION);
4389 addMapperAndConfigure(mapper);
4390
4391 NotifyMotionArgs motionArgs;
4392
4393 // default tool type is finger
4394 processDown(mapper, 100, 200);
4395 processSync(mapper);
4396 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4397 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4398 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4399
4400 // eraser
4401 processKey(mapper, BTN_TOOL_RUBBER, 1);
4402 processSync(mapper);
4403 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4404 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4405 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4406
4407 // stylus
4408 processKey(mapper, BTN_TOOL_RUBBER, 0);
4409 processKey(mapper, BTN_TOOL_PEN, 1);
4410 processSync(mapper);
4411 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4412 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4413 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4414
4415 // brush
4416 processKey(mapper, BTN_TOOL_PEN, 0);
4417 processKey(mapper, BTN_TOOL_BRUSH, 1);
4418 processSync(mapper);
4419 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4420 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4421 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4422
4423 // pencil
4424 processKey(mapper, BTN_TOOL_BRUSH, 0);
4425 processKey(mapper, BTN_TOOL_PENCIL, 1);
4426 processSync(mapper);
4427 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4428 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4429 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4430
4431 // airbrush
4432 processKey(mapper, BTN_TOOL_PENCIL, 0);
4433 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
4434 processSync(mapper);
4435 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4436 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4437 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4438
4439 // mouse
4440 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
4441 processKey(mapper, BTN_TOOL_MOUSE, 1);
4442 processSync(mapper);
4443 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4444 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4445 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4446
4447 // lens
4448 processKey(mapper, BTN_TOOL_MOUSE, 0);
4449 processKey(mapper, BTN_TOOL_LENS, 1);
4450 processSync(mapper);
4451 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4452 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4453 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4454
4455 // double-tap
4456 processKey(mapper, BTN_TOOL_LENS, 0);
4457 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
4458 processSync(mapper);
4459 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4460 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4461 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4462
4463 // triple-tap
4464 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
4465 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
4466 processSync(mapper);
4467 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4468 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4469 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4470
4471 // quad-tap
4472 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
4473 processKey(mapper, BTN_TOOL_QUADTAP, 1);
4474 processSync(mapper);
4475 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4476 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4477 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4478
4479 // finger
4480 processKey(mapper, BTN_TOOL_QUADTAP, 0);
4481 processKey(mapper, BTN_TOOL_FINGER, 1);
4482 processSync(mapper);
4483 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4484 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4485 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4486
4487 // stylus trumps finger
4488 processKey(mapper, BTN_TOOL_PEN, 1);
4489 processSync(mapper);
4490 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4491 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4492 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4493
4494 // eraser trumps stylus
4495 processKey(mapper, BTN_TOOL_RUBBER, 1);
4496 processSync(mapper);
4497 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4498 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4499 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4500
4501 // mouse trumps eraser
4502 processKey(mapper, BTN_TOOL_MOUSE, 1);
4503 processSync(mapper);
4504 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4505 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4506 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4507
4508 // back to default tool type
4509 processKey(mapper, BTN_TOOL_MOUSE, 0);
4510 processKey(mapper, BTN_TOOL_RUBBER, 0);
4511 processKey(mapper, BTN_TOOL_PEN, 0);
4512 processKey(mapper, BTN_TOOL_FINGER, 0);
4513 processSync(mapper);
4514 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4515 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4516 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4517}
4518
4519TEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
4520 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4521 addConfigurationProperty("touch.deviceType", "touchScreen");
4522 prepareDisplay(DISPLAY_ORIENTATION_0);
4523 prepareButtons();
4524 prepareAxes(POSITION);
4525 mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0);
4526 addMapperAndConfigure(mapper);
4527
4528 NotifyMotionArgs motionArgs;
4529
4530 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
4531 processKey(mapper, BTN_TOOL_FINGER, 1);
4532 processMove(mapper, 100, 200);
4533 processSync(mapper);
4534 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4535 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4536 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4537 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4538
4539 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4540 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4541 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4542 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4543
4544 // move a little
4545 processMove(mapper, 150, 250);
4546 processSync(mapper);
4547 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4548 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4549 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4550 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4551
4552 // down when BTN_TOUCH is pressed, pressure defaults to 1
4553 processKey(mapper, BTN_TOUCH, 1);
4554 processSync(mapper);
4555 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4556 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4557 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4558 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4559
4560 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4561 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4562 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4563 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4564
4565 // up when BTN_TOUCH is released, hover restored
4566 processKey(mapper, BTN_TOUCH, 0);
4567 processSync(mapper);
4568 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4569 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4570 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4571 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4572
4573 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4574 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4575 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4576 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4577
4578 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4579 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4580 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4581 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4582
4583 // exit hover when pointer goes away
4584 processKey(mapper, BTN_TOOL_FINGER, 0);
4585 processSync(mapper);
4586 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4587 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4588 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4589 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4590}
4591
4592TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) {
4593 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4594 addConfigurationProperty("touch.deviceType", "touchScreen");
4595 prepareDisplay(DISPLAY_ORIENTATION_0);
4596 prepareButtons();
4597 prepareAxes(POSITION | PRESSURE);
4598 addMapperAndConfigure(mapper);
4599
4600 NotifyMotionArgs motionArgs;
4601
4602 // initially hovering because pressure is 0
4603 processDown(mapper, 100, 200);
4604 processPressure(mapper, 0);
4605 processSync(mapper);
4606 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4607 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4608 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4609 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4610
4611 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4612 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4613 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4614 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4615
4616 // move a little
4617 processMove(mapper, 150, 250);
4618 processSync(mapper);
4619 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4620 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4621 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4622 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4623
4624 // down when pressure is non-zero
4625 processPressure(mapper, RAW_PRESSURE_MAX);
4626 processSync(mapper);
4627 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4628 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4629 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4630 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4631
4632 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4633 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4634 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4635 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4636
4637 // up when pressure becomes 0, hover restored
4638 processPressure(mapper, 0);
4639 processSync(mapper);
4640 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4641 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4642 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4643 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4644
4645 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4646 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4647 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4648 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4649
4650 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4651 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4652 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4653 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4654
4655 // exit hover when pointer goes away
4656 processUp(mapper);
4657 processSync(mapper);
4658 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4659 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4660 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4661 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4662}
4663
Michael Wrightd02c5b62014-02-10 15:10:22 -08004664// --- MultiTouchInputMapperTest ---
4665
4666class MultiTouchInputMapperTest : public TouchInputMapperTest {
4667protected:
4668 void prepareAxes(int axes);
4669
4670 void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
4671 void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
4672 void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
4673 void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
4674 void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
4675 void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
4676 void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
4677 void processDistance(MultiTouchInputMapper* mapper, int32_t distance);
4678 void processId(MultiTouchInputMapper* mapper, int32_t id);
4679 void processSlot(MultiTouchInputMapper* mapper, int32_t slot);
4680 void processToolType(MultiTouchInputMapper* mapper, int32_t toolType);
4681 void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value);
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004682 void processTimestamp(MultiTouchInputMapper* mapper, uint32_t value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004683 void processMTSync(MultiTouchInputMapper* mapper);
4684 void processSync(MultiTouchInputMapper* mapper);
4685};
4686
4687void MultiTouchInputMapperTest::prepareAxes(int axes) {
4688 if (axes & POSITION) {
4689 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X,
4690 RAW_X_MIN, RAW_X_MAX, 0, 0);
4691 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y,
4692 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
4693 }
4694 if (axes & TOUCH) {
4695 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR,
4696 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4697 if (axes & MINOR) {
4698 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
4699 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4700 }
4701 }
4702 if (axes & TOOL) {
4703 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR,
4704 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
4705 if (axes & MINOR) {
4706 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
4707 RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
4708 }
4709 }
4710 if (axes & ORIENTATION) {
4711 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION,
4712 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
4713 }
4714 if (axes & PRESSURE) {
4715 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE,
4716 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
4717 }
4718 if (axes & DISTANCE) {
4719 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE,
4720 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
4721 }
4722 if (axes & ID) {
4723 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
4724 RAW_ID_MIN, RAW_ID_MAX, 0, 0);
4725 }
4726 if (axes & SLOT) {
4727 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT,
4728 RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0);
4729 mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0);
4730 }
4731 if (axes & TOOL_TYPE) {
4732 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE,
4733 0, MT_TOOL_MAX, 0, 0);
4734 }
4735}
4736
4737void MultiTouchInputMapperTest::processPosition(
4738 MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004739 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, x);
4740 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004741}
4742
4743void MultiTouchInputMapperTest::processTouchMajor(
4744 MultiTouchInputMapper* mapper, int32_t touchMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004745 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004746}
4747
4748void MultiTouchInputMapperTest::processTouchMinor(
4749 MultiTouchInputMapper* mapper, int32_t touchMinor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004750 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004751}
4752
4753void MultiTouchInputMapperTest::processToolMajor(
4754 MultiTouchInputMapper* mapper, int32_t toolMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004755 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004756}
4757
4758void MultiTouchInputMapperTest::processToolMinor(
4759 MultiTouchInputMapper* mapper, int32_t toolMinor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004760 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004761}
4762
4763void MultiTouchInputMapperTest::processOrientation(
4764 MultiTouchInputMapper* mapper, int32_t orientation) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004765 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_ORIENTATION, orientation);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004766}
4767
4768void MultiTouchInputMapperTest::processPressure(
4769 MultiTouchInputMapper* mapper, int32_t pressure) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004770 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_PRESSURE, pressure);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004771}
4772
4773void MultiTouchInputMapperTest::processDistance(
4774 MultiTouchInputMapper* mapper, int32_t distance) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004775 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_DISTANCE, distance);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004776}
4777
4778void MultiTouchInputMapperTest::processId(
4779 MultiTouchInputMapper* mapper, int32_t id) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004780 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, id);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004781}
4782
4783void MultiTouchInputMapperTest::processSlot(
4784 MultiTouchInputMapper* mapper, int32_t slot) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004785 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, slot);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004786}
4787
4788void MultiTouchInputMapperTest::processToolType(
4789 MultiTouchInputMapper* mapper, int32_t toolType) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004790 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, toolType);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004791}
4792
4793void MultiTouchInputMapperTest::processKey(
4794 MultiTouchInputMapper* mapper, int32_t code, int32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004795 process(mapper, ARBITRARY_TIME, EV_KEY, code, value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004796}
4797
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004798void MultiTouchInputMapperTest::processTimestamp(MultiTouchInputMapper* mapper, uint32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004799 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_TIMESTAMP, value);
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004800}
4801
Michael Wrightd02c5b62014-02-10 15:10:22 -08004802void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004803 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_MT_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004804}
4805
4806void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004807 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004808}
4809
4810
4811TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) {
4812 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4813 addConfigurationProperty("touch.deviceType", "touchScreen");
4814 prepareDisplay(DISPLAY_ORIENTATION_0);
4815 prepareAxes(POSITION);
4816 prepareVirtualKeys();
4817 addMapperAndConfigure(mapper);
4818
4819 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4820
4821 NotifyMotionArgs motionArgs;
4822
4823 // Two fingers down at once.
4824 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4825 processPosition(mapper, x1, y1);
4826 processMTSync(mapper);
4827 processPosition(mapper, x2, y2);
4828 processMTSync(mapper);
4829 processSync(mapper);
4830
4831 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4832 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4833 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4834 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4835 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4836 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4837 ASSERT_EQ(0, motionArgs.flags);
4838 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4839 ASSERT_EQ(0, motionArgs.buttonState);
4840 ASSERT_EQ(0, motionArgs.edgeFlags);
4841 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4842 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4843 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4844 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4845 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4846 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4847 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4848 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4849
4850 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4851 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4852 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4853 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4854 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4855 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4856 motionArgs.action);
4857 ASSERT_EQ(0, motionArgs.flags);
4858 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4859 ASSERT_EQ(0, motionArgs.buttonState);
4860 ASSERT_EQ(0, motionArgs.edgeFlags);
4861 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4862 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4863 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4864 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4865 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4866 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4867 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4868 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4869 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4870 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4871 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4872 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4873
4874 // Move.
4875 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4876 processPosition(mapper, x1, y1);
4877 processMTSync(mapper);
4878 processPosition(mapper, x2, y2);
4879 processMTSync(mapper);
4880 processSync(mapper);
4881
4882 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4883 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4884 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4885 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4886 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4887 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4888 ASSERT_EQ(0, motionArgs.flags);
4889 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4890 ASSERT_EQ(0, motionArgs.buttonState);
4891 ASSERT_EQ(0, motionArgs.edgeFlags);
4892 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4893 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4894 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4895 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4896 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4897 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4898 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4899 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4900 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4901 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4902 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4903 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4904
4905 // First finger up.
4906 x2 += 15; y2 -= 20;
4907 processPosition(mapper, x2, y2);
4908 processMTSync(mapper);
4909 processSync(mapper);
4910
4911 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4912 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4913 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4914 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4915 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4916 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4917 motionArgs.action);
4918 ASSERT_EQ(0, motionArgs.flags);
4919 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4920 ASSERT_EQ(0, motionArgs.buttonState);
4921 ASSERT_EQ(0, motionArgs.edgeFlags);
4922 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4923 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4924 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4925 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4926 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4927 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4928 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4929 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4930 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4931 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4932 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4933 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4934
4935 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4936 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4937 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4938 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4939 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4940 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4941 ASSERT_EQ(0, motionArgs.flags);
4942 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4943 ASSERT_EQ(0, motionArgs.buttonState);
4944 ASSERT_EQ(0, motionArgs.edgeFlags);
4945 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4946 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4947 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4948 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4949 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4950 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4951 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4952 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4953
4954 // Move.
4955 x2 += 20; y2 -= 25;
4956 processPosition(mapper, x2, y2);
4957 processMTSync(mapper);
4958 processSync(mapper);
4959
4960 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4961 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4962 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4963 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4964 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4965 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4966 ASSERT_EQ(0, motionArgs.flags);
4967 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4968 ASSERT_EQ(0, motionArgs.buttonState);
4969 ASSERT_EQ(0, motionArgs.edgeFlags);
4970 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4971 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4972 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4973 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4974 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4975 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4976 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4977 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4978
4979 // New finger down.
4980 int32_t x3 = 700, y3 = 300;
4981 processPosition(mapper, x2, y2);
4982 processMTSync(mapper);
4983 processPosition(mapper, x3, y3);
4984 processMTSync(mapper);
4985 processSync(mapper);
4986
4987 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4988 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4989 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4990 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4991 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4992 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4993 motionArgs.action);
4994 ASSERT_EQ(0, motionArgs.flags);
4995 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4996 ASSERT_EQ(0, motionArgs.buttonState);
4997 ASSERT_EQ(0, motionArgs.edgeFlags);
4998 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4999 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5000 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5001 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5002 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5003 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5004 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5005 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5006 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5007 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5008 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5009 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5010
5011 // Second finger up.
5012 x3 += 30; y3 -= 20;
5013 processPosition(mapper, x3, y3);
5014 processMTSync(mapper);
5015 processSync(mapper);
5016
5017 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5018 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5019 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5020 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5021 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5022 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5023 motionArgs.action);
5024 ASSERT_EQ(0, motionArgs.flags);
5025 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5026 ASSERT_EQ(0, motionArgs.buttonState);
5027 ASSERT_EQ(0, motionArgs.edgeFlags);
5028 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5029 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5030 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5031 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5032 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5033 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5034 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5035 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5036 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5037 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5038 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5039 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5040
5041 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5042 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5043 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5044 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5045 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5046 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5047 ASSERT_EQ(0, motionArgs.flags);
5048 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5049 ASSERT_EQ(0, motionArgs.buttonState);
5050 ASSERT_EQ(0, motionArgs.edgeFlags);
5051 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5052 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5053 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5054 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5055 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5056 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5057 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5058 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5059
5060 // Last finger up.
5061 processMTSync(mapper);
5062 processSync(mapper);
5063
5064 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5065 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5066 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5067 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5068 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5069 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5070 ASSERT_EQ(0, motionArgs.flags);
5071 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5072 ASSERT_EQ(0, motionArgs.buttonState);
5073 ASSERT_EQ(0, motionArgs.edgeFlags);
5074 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5075 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5076 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5077 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5078 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5079 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5080 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5081 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5082
5083 // Should not have sent any more keys or motions.
5084 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5085 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5086}
5087
5088TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
5089 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5090 addConfigurationProperty("touch.deviceType", "touchScreen");
5091 prepareDisplay(DISPLAY_ORIENTATION_0);
5092 prepareAxes(POSITION | ID);
5093 prepareVirtualKeys();
5094 addMapperAndConfigure(mapper);
5095
5096 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5097
5098 NotifyMotionArgs motionArgs;
5099
5100 // Two fingers down at once.
5101 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5102 processPosition(mapper, x1, y1);
5103 processId(mapper, 1);
5104 processMTSync(mapper);
5105 processPosition(mapper, x2, y2);
5106 processId(mapper, 2);
5107 processMTSync(mapper);
5108 processSync(mapper);
5109
5110 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5111 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5112 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5113 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5114 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5115 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5116 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5117
5118 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5119 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5120 motionArgs.action);
5121 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5122 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5123 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5124 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5125 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5126 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5127 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5128 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5129 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5130
5131 // Move.
5132 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5133 processPosition(mapper, x1, y1);
5134 processId(mapper, 1);
5135 processMTSync(mapper);
5136 processPosition(mapper, x2, y2);
5137 processId(mapper, 2);
5138 processMTSync(mapper);
5139 processSync(mapper);
5140
5141 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5142 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5143 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5144 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5145 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5146 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5147 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5148 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5149 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5150 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5151 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5152
5153 // First finger up.
5154 x2 += 15; y2 -= 20;
5155 processPosition(mapper, x2, y2);
5156 processId(mapper, 2);
5157 processMTSync(mapper);
5158 processSync(mapper);
5159
5160 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5161 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5162 motionArgs.action);
5163 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5164 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5165 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5166 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5167 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5168 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5169 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5170 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5171 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5172
5173 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5174 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5175 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5176 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5177 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5178 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5179 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5180
5181 // Move.
5182 x2 += 20; y2 -= 25;
5183 processPosition(mapper, x2, y2);
5184 processId(mapper, 2);
5185 processMTSync(mapper);
5186 processSync(mapper);
5187
5188 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5189 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5190 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5191 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5192 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5193 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5194 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5195
5196 // New finger down.
5197 int32_t x3 = 700, y3 = 300;
5198 processPosition(mapper, x2, y2);
5199 processId(mapper, 2);
5200 processMTSync(mapper);
5201 processPosition(mapper, x3, y3);
5202 processId(mapper, 3);
5203 processMTSync(mapper);
5204 processSync(mapper);
5205
5206 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5207 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5208 motionArgs.action);
5209 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5210 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5211 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5212 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5213 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5214 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5215 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5216 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5217 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5218
5219 // Second finger up.
5220 x3 += 30; y3 -= 20;
5221 processPosition(mapper, x3, y3);
5222 processId(mapper, 3);
5223 processMTSync(mapper);
5224 processSync(mapper);
5225
5226 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5227 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5228 motionArgs.action);
5229 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5230 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5231 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5232 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5233 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5234 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5235 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5236 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5237 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5238
5239 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5240 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5241 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5242 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5243 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5244 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5245 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5246
5247 // Last finger up.
5248 processMTSync(mapper);
5249 processSync(mapper);
5250
5251 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5252 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5253 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5254 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5255 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5256 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5257 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5258
5259 // Should not have sent any more keys or motions.
5260 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5262}
5263
5264TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) {
5265 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5266 addConfigurationProperty("touch.deviceType", "touchScreen");
5267 prepareDisplay(DISPLAY_ORIENTATION_0);
5268 prepareAxes(POSITION | ID | SLOT);
5269 prepareVirtualKeys();
5270 addMapperAndConfigure(mapper);
5271
5272 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5273
5274 NotifyMotionArgs motionArgs;
5275
5276 // Two fingers down at once.
5277 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5278 processPosition(mapper, x1, y1);
5279 processId(mapper, 1);
5280 processSlot(mapper, 1);
5281 processPosition(mapper, x2, y2);
5282 processId(mapper, 2);
5283 processSync(mapper);
5284
5285 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5286 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5287 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5288 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5289 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5290 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5291 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5292
5293 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5294 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5295 motionArgs.action);
5296 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5297 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5298 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5299 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5300 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5301 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5302 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5303 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5304 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5305
5306 // Move.
5307 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5308 processSlot(mapper, 0);
5309 processPosition(mapper, x1, y1);
5310 processSlot(mapper, 1);
5311 processPosition(mapper, x2, y2);
5312 processSync(mapper);
5313
5314 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5315 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5316 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5317 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5318 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5319 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5320 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5321 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5322 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5323 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5324 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5325
5326 // First finger up.
5327 x2 += 15; y2 -= 20;
5328 processSlot(mapper, 0);
5329 processId(mapper, -1);
5330 processSlot(mapper, 1);
5331 processPosition(mapper, x2, y2);
5332 processSync(mapper);
5333
5334 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5335 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5336 motionArgs.action);
5337 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5338 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5339 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5340 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5341 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5342 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5343 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5344 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5345 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5346
5347 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5348 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5349 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5350 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5351 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5352 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5353 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5354
5355 // Move.
5356 x2 += 20; y2 -= 25;
5357 processPosition(mapper, x2, y2);
5358 processSync(mapper);
5359
5360 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5361 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5362 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5363 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5364 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5365 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5366 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5367
5368 // New finger down.
5369 int32_t x3 = 700, y3 = 300;
5370 processPosition(mapper, x2, y2);
5371 processSlot(mapper, 0);
5372 processId(mapper, 3);
5373 processPosition(mapper, x3, y3);
5374 processSync(mapper);
5375
5376 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5377 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5378 motionArgs.action);
5379 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5380 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5381 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5382 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5383 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5384 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5385 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5386 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5387 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5388
5389 // Second finger up.
5390 x3 += 30; y3 -= 20;
5391 processSlot(mapper, 1);
5392 processId(mapper, -1);
5393 processSlot(mapper, 0);
5394 processPosition(mapper, x3, y3);
5395 processSync(mapper);
5396
5397 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5398 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5399 motionArgs.action);
5400 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5401 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5402 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5403 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5404 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5405 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5406 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5407 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5408 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5409
5410 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5411 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5412 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5413 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5414 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5415 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5416 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5417
5418 // Last finger up.
5419 processId(mapper, -1);
5420 processSync(mapper);
5421
5422 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5423 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5424 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5425 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5426 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5427 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5428 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5429
5430 // Should not have sent any more keys or motions.
5431 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5432 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5433}
5434
5435TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
5436 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5437 addConfigurationProperty("touch.deviceType", "touchScreen");
5438 prepareDisplay(DISPLAY_ORIENTATION_0);
5439 prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE);
5440 addMapperAndConfigure(mapper);
5441
5442 // These calculations are based on the input device calibration documentation.
5443 int32_t rawX = 100;
5444 int32_t rawY = 200;
5445 int32_t rawTouchMajor = 7;
5446 int32_t rawTouchMinor = 6;
5447 int32_t rawToolMajor = 9;
5448 int32_t rawToolMinor = 8;
5449 int32_t rawPressure = 11;
5450 int32_t rawDistance = 0;
5451 int32_t rawOrientation = 3;
5452 int32_t id = 5;
5453
5454 float x = toDisplayX(rawX);
5455 float y = toDisplayY(rawY);
5456 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
5457 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5458 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5459 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5460 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5461 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5462 float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
5463 float distance = float(rawDistance);
5464
5465 processPosition(mapper, rawX, rawY);
5466 processTouchMajor(mapper, rawTouchMajor);
5467 processTouchMinor(mapper, rawTouchMinor);
5468 processToolMajor(mapper, rawToolMajor);
5469 processToolMinor(mapper, rawToolMinor);
5470 processPressure(mapper, rawPressure);
5471 processOrientation(mapper, rawOrientation);
5472 processDistance(mapper, rawDistance);
5473 processId(mapper, id);
5474 processMTSync(mapper);
5475 processSync(mapper);
5476
5477 NotifyMotionArgs args;
5478 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5479 ASSERT_EQ(0, args.pointerProperties[0].id);
5480 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5481 x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor,
5482 orientation, distance));
5483}
5484
5485TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
5486 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5487 addConfigurationProperty("touch.deviceType", "touchScreen");
5488 prepareDisplay(DISPLAY_ORIENTATION_0);
5489 prepareAxes(POSITION | TOUCH | TOOL | MINOR);
5490 addConfigurationProperty("touch.size.calibration", "geometric");
5491 addMapperAndConfigure(mapper);
5492
5493 // These calculations are based on the input device calibration documentation.
5494 int32_t rawX = 100;
5495 int32_t rawY = 200;
5496 int32_t rawTouchMajor = 140;
5497 int32_t rawTouchMinor = 120;
5498 int32_t rawToolMajor = 180;
5499 int32_t rawToolMinor = 160;
5500
5501 float x = toDisplayX(rawX);
5502 float y = toDisplayY(rawY);
5503 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5504 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5505 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5506 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5507 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5508
5509 processPosition(mapper, rawX, rawY);
5510 processTouchMajor(mapper, rawTouchMajor);
5511 processTouchMinor(mapper, rawTouchMinor);
5512 processToolMajor(mapper, rawToolMajor);
5513 processToolMinor(mapper, rawToolMinor);
5514 processMTSync(mapper);
5515 processSync(mapper);
5516
5517 NotifyMotionArgs args;
5518 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5519 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5520 x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0));
5521}
5522
5523TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) {
5524 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5525 addConfigurationProperty("touch.deviceType", "touchScreen");
5526 prepareDisplay(DISPLAY_ORIENTATION_0);
5527 prepareAxes(POSITION | TOUCH | TOOL);
5528 addConfigurationProperty("touch.size.calibration", "diameter");
5529 addConfigurationProperty("touch.size.scale", "10");
5530 addConfigurationProperty("touch.size.bias", "160");
5531 addConfigurationProperty("touch.size.isSummed", "1");
5532 addMapperAndConfigure(mapper);
5533
5534 // These calculations are based on the input device calibration documentation.
5535 // Note: We only provide a single common touch/tool value because the device is assumed
5536 // not to emit separate values for each pointer (isSummed = 1).
5537 int32_t rawX = 100;
5538 int32_t rawY = 200;
5539 int32_t rawX2 = 150;
5540 int32_t rawY2 = 250;
5541 int32_t rawTouchMajor = 5;
5542 int32_t rawToolMajor = 8;
5543
5544 float x = toDisplayX(rawX);
5545 float y = toDisplayY(rawY);
5546 float x2 = toDisplayX(rawX2);
5547 float y2 = toDisplayY(rawY2);
5548 float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX;
5549 float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f;
5550 float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f;
5551
5552 processPosition(mapper, rawX, rawY);
5553 processTouchMajor(mapper, rawTouchMajor);
5554 processToolMajor(mapper, rawToolMajor);
5555 processMTSync(mapper);
5556 processPosition(mapper, rawX2, rawY2);
5557 processTouchMajor(mapper, rawTouchMajor);
5558 processToolMajor(mapper, rawToolMajor);
5559 processMTSync(mapper);
5560 processSync(mapper);
5561
5562 NotifyMotionArgs args;
5563 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5564 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
5565
5566 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5567 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5568 args.action);
5569 ASSERT_EQ(size_t(2), args.pointerCount);
5570 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5571 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5572 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
5573 x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0));
5574}
5575
5576TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) {
5577 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5578 addConfigurationProperty("touch.deviceType", "touchScreen");
5579 prepareDisplay(DISPLAY_ORIENTATION_0);
5580 prepareAxes(POSITION | TOUCH | TOOL);
5581 addConfigurationProperty("touch.size.calibration", "area");
5582 addConfigurationProperty("touch.size.scale", "43");
5583 addConfigurationProperty("touch.size.bias", "3");
5584 addMapperAndConfigure(mapper);
5585
5586 // These calculations are based on the input device calibration documentation.
5587 int32_t rawX = 100;
5588 int32_t rawY = 200;
5589 int32_t rawTouchMajor = 5;
5590 int32_t rawToolMajor = 8;
5591
5592 float x = toDisplayX(rawX);
5593 float y = toDisplayY(rawY);
5594 float size = float(rawTouchMajor) / RAW_TOUCH_MAX;
5595 float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f;
5596 float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f;
5597
5598 processPosition(mapper, rawX, rawY);
5599 processTouchMajor(mapper, rawTouchMajor);
5600 processToolMajor(mapper, rawToolMajor);
5601 processMTSync(mapper);
5602 processSync(mapper);
5603
5604 NotifyMotionArgs args;
5605 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5606 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5607 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5608}
5609
5610TEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) {
5611 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5612 addConfigurationProperty("touch.deviceType", "touchScreen");
5613 prepareDisplay(DISPLAY_ORIENTATION_0);
5614 prepareAxes(POSITION | PRESSURE);
5615 addConfigurationProperty("touch.pressure.calibration", "amplitude");
5616 addConfigurationProperty("touch.pressure.scale", "0.01");
5617 addMapperAndConfigure(mapper);
5618
Michael Wrightaa449c92017-12-13 21:21:43 +00005619 InputDeviceInfo info;
5620 mapper->populateDeviceInfo(&info);
5621 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
5622 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TOUCHSCREEN,
5623 0.0f, RAW_PRESSURE_MAX * 0.01, 0.0f, 0.0f));
5624
Michael Wrightd02c5b62014-02-10 15:10:22 -08005625 // These calculations are based on the input device calibration documentation.
5626 int32_t rawX = 100;
5627 int32_t rawY = 200;
5628 int32_t rawPressure = 60;
5629
5630 float x = toDisplayX(rawX);
5631 float y = toDisplayY(rawY);
5632 float pressure = float(rawPressure) * 0.01f;
5633
5634 processPosition(mapper, rawX, rawY);
5635 processPressure(mapper, rawPressure);
5636 processMTSync(mapper);
5637 processSync(mapper);
5638
5639 NotifyMotionArgs args;
5640 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5641 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5642 x, y, pressure, 0, 0, 0, 0, 0, 0, 0));
5643}
5644
5645TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) {
5646 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5647 addConfigurationProperty("touch.deviceType", "touchScreen");
5648 prepareDisplay(DISPLAY_ORIENTATION_0);
5649 prepareAxes(POSITION | ID | SLOT);
5650 addMapperAndConfigure(mapper);
5651
5652 NotifyMotionArgs motionArgs;
5653 NotifyKeyArgs keyArgs;
5654
5655 processId(mapper, 1);
5656 processPosition(mapper, 100, 200);
5657 processSync(mapper);
5658 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5659 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5660 ASSERT_EQ(0, motionArgs.buttonState);
5661
5662 // press BTN_LEFT, release BTN_LEFT
5663 processKey(mapper, BTN_LEFT, 1);
5664 processSync(mapper);
5665 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5666 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5667 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5668
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005669 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5670 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5671 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5672
Michael Wrightd02c5b62014-02-10 15:10:22 -08005673 processKey(mapper, BTN_LEFT, 0);
5674 processSync(mapper);
5675 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005676 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005677 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005678
5679 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005680 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005681 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005682
5683 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
5684 processKey(mapper, BTN_RIGHT, 1);
5685 processKey(mapper, BTN_MIDDLE, 1);
5686 processSync(mapper);
5687 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5688 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5689 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5690 motionArgs.buttonState);
5691
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005692 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5693 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5694 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
5695
5696 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5697 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5698 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5699 motionArgs.buttonState);
5700
Michael Wrightd02c5b62014-02-10 15:10:22 -08005701 processKey(mapper, BTN_RIGHT, 0);
5702 processSync(mapper);
5703 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005704 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005705 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005706
5707 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005708 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005709 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005710
5711 processKey(mapper, BTN_MIDDLE, 0);
5712 processSync(mapper);
5713 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005714 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005715 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005716
5717 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005718 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005719 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005720
5721 // press BTN_BACK, release BTN_BACK
5722 processKey(mapper, BTN_BACK, 1);
5723 processSync(mapper);
5724 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5725 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5726 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005727
Michael Wrightd02c5b62014-02-10 15:10:22 -08005728 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005729 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005730 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5731
5732 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5733 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5734 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005735
5736 processKey(mapper, BTN_BACK, 0);
5737 processSync(mapper);
5738 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005739 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005740 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005741
5742 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005743 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005744 ASSERT_EQ(0, motionArgs.buttonState);
5745
Michael Wrightd02c5b62014-02-10 15:10:22 -08005746 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5747 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5748 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5749
5750 // press BTN_SIDE, release BTN_SIDE
5751 processKey(mapper, BTN_SIDE, 1);
5752 processSync(mapper);
5753 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5754 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5755 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005756
Michael Wrightd02c5b62014-02-10 15:10:22 -08005757 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005758 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005759 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5760
5761 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5762 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5763 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005764
5765 processKey(mapper, BTN_SIDE, 0);
5766 processSync(mapper);
5767 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005768 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005769 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005770
5771 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005772 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005773 ASSERT_EQ(0, motionArgs.buttonState);
5774
Michael Wrightd02c5b62014-02-10 15:10:22 -08005775 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5776 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5777 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5778
5779 // press BTN_FORWARD, release BTN_FORWARD
5780 processKey(mapper, BTN_FORWARD, 1);
5781 processSync(mapper);
5782 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5783 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5784 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005785
Michael Wrightd02c5b62014-02-10 15:10:22 -08005786 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005787 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005788 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5789
5790 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5791 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5792 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005793
5794 processKey(mapper, BTN_FORWARD, 0);
5795 processSync(mapper);
5796 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005797 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005798 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005799
5800 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005801 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005802 ASSERT_EQ(0, motionArgs.buttonState);
5803
Michael Wrightd02c5b62014-02-10 15:10:22 -08005804 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5805 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5806 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5807
5808 // press BTN_EXTRA, release BTN_EXTRA
5809 processKey(mapper, BTN_EXTRA, 1);
5810 processSync(mapper);
5811 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5812 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5813 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005814
Michael Wrightd02c5b62014-02-10 15:10:22 -08005815 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005816 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005817 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5818
5819 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5820 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5821 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005822
5823 processKey(mapper, BTN_EXTRA, 0);
5824 processSync(mapper);
5825 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005826 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005827 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005828
5829 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005830 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005831 ASSERT_EQ(0, motionArgs.buttonState);
5832
Michael Wrightd02c5b62014-02-10 15:10:22 -08005833 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5834 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5835 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5836
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005837 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5838
Michael Wrightd02c5b62014-02-10 15:10:22 -08005839 // press BTN_STYLUS, release BTN_STYLUS
5840 processKey(mapper, BTN_STYLUS, 1);
5841 processSync(mapper);
5842 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5843 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005844 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
5845
5846 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5847 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5848 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005849
5850 processKey(mapper, BTN_STYLUS, 0);
5851 processSync(mapper);
5852 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005853 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005854 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005855
5856 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005857 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005858 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005859
5860 // press BTN_STYLUS2, release BTN_STYLUS2
5861 processKey(mapper, BTN_STYLUS2, 1);
5862 processSync(mapper);
5863 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5864 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005865 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
5866
5867 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5868 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5869 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005870
5871 processKey(mapper, BTN_STYLUS2, 0);
5872 processSync(mapper);
5873 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005874 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005875 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005876
5877 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005878 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005879 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005880
5881 // release touch
5882 processId(mapper, -1);
5883 processSync(mapper);
5884 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5885 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5886 ASSERT_EQ(0, motionArgs.buttonState);
5887}
5888
5889TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
5890 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5891 addConfigurationProperty("touch.deviceType", "touchScreen");
5892 prepareDisplay(DISPLAY_ORIENTATION_0);
5893 prepareAxes(POSITION | ID | SLOT | TOOL_TYPE);
5894 addMapperAndConfigure(mapper);
5895
5896 NotifyMotionArgs motionArgs;
5897
5898 // default tool type is finger
5899 processId(mapper, 1);
5900 processPosition(mapper, 100, 200);
5901 processSync(mapper);
5902 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5903 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5904 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5905
5906 // eraser
5907 processKey(mapper, BTN_TOOL_RUBBER, 1);
5908 processSync(mapper);
5909 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5910 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5911 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
5912
5913 // stylus
5914 processKey(mapper, BTN_TOOL_RUBBER, 0);
5915 processKey(mapper, BTN_TOOL_PEN, 1);
5916 processSync(mapper);
5917 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5918 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5919 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5920
5921 // brush
5922 processKey(mapper, BTN_TOOL_PEN, 0);
5923 processKey(mapper, BTN_TOOL_BRUSH, 1);
5924 processSync(mapper);
5925 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5926 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5927 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5928
5929 // pencil
5930 processKey(mapper, BTN_TOOL_BRUSH, 0);
5931 processKey(mapper, BTN_TOOL_PENCIL, 1);
5932 processSync(mapper);
5933 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5934 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5935 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5936
5937 // airbrush
5938 processKey(mapper, BTN_TOOL_PENCIL, 0);
5939 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
5940 processSync(mapper);
5941 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5942 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5943 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5944
5945 // mouse
5946 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
5947 processKey(mapper, BTN_TOOL_MOUSE, 1);
5948 processSync(mapper);
5949 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5950 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5951 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5952
5953 // lens
5954 processKey(mapper, BTN_TOOL_MOUSE, 0);
5955 processKey(mapper, BTN_TOOL_LENS, 1);
5956 processSync(mapper);
5957 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5958 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5959 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5960
5961 // double-tap
5962 processKey(mapper, BTN_TOOL_LENS, 0);
5963 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
5964 processSync(mapper);
5965 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5966 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5967 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5968
5969 // triple-tap
5970 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
5971 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
5972 processSync(mapper);
5973 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5974 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5975 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5976
5977 // quad-tap
5978 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
5979 processKey(mapper, BTN_TOOL_QUADTAP, 1);
5980 processSync(mapper);
5981 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5982 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5983 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5984
5985 // finger
5986 processKey(mapper, BTN_TOOL_QUADTAP, 0);
5987 processKey(mapper, BTN_TOOL_FINGER, 1);
5988 processSync(mapper);
5989 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5990 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5991 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5992
5993 // stylus trumps finger
5994 processKey(mapper, BTN_TOOL_PEN, 1);
5995 processSync(mapper);
5996 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5997 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5998 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5999
6000 // eraser trumps stylus
6001 processKey(mapper, BTN_TOOL_RUBBER, 1);
6002 processSync(mapper);
6003 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6004 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6005 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
6006
6007 // mouse trumps eraser
6008 processKey(mapper, BTN_TOOL_MOUSE, 1);
6009 processSync(mapper);
6010 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6011 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6012 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
6013
6014 // MT tool type trumps BTN tool types: MT_TOOL_FINGER
6015 processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE
6016 processSync(mapper);
6017 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6018 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6019 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6020
6021 // MT tool type trumps BTN tool types: MT_TOOL_PEN
6022 processToolType(mapper, MT_TOOL_PEN);
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_STYLUS, motionArgs.pointerProperties[0].toolType);
6027
6028 // back to default tool type
6029 processToolType(mapper, -1); // use a deliberately undefined tool type, for testing
6030 processKey(mapper, BTN_TOOL_MOUSE, 0);
6031 processKey(mapper, BTN_TOOL_RUBBER, 0);
6032 processKey(mapper, BTN_TOOL_PEN, 0);
6033 processKey(mapper, BTN_TOOL_FINGER, 0);
6034 processSync(mapper);
6035 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6036 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6037 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6038}
6039
6040TEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
6041 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6042 addConfigurationProperty("touch.deviceType", "touchScreen");
6043 prepareDisplay(DISPLAY_ORIENTATION_0);
6044 prepareAxes(POSITION | ID | SLOT);
6045 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
6046 addMapperAndConfigure(mapper);
6047
6048 NotifyMotionArgs motionArgs;
6049
6050 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
6051 processId(mapper, 1);
6052 processPosition(mapper, 100, 200);
6053 processSync(mapper);
6054 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6055 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6056 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6057 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6058
6059 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6060 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6061 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6062 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6063
6064 // move a little
6065 processPosition(mapper, 150, 250);
6066 processSync(mapper);
6067 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6068 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6069 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6070 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6071
6072 // down when BTN_TOUCH is pressed, pressure defaults to 1
6073 processKey(mapper, BTN_TOUCH, 1);
6074 processSync(mapper);
6075 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6076 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6077 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6078 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6079
6080 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6081 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
6082 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6083 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6084
6085 // up when BTN_TOUCH is released, hover restored
6086 processKey(mapper, BTN_TOUCH, 0);
6087 processSync(mapper);
6088 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6089 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
6090 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6091 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6092
6093 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6094 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6095 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6096 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6097
6098 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6099 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6100 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6101 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6102
6103 // exit hover when pointer goes away
6104 processId(mapper, -1);
6105 processSync(mapper);
6106 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6107 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6108 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6109 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6110}
6111
6112TEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) {
6113 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6114 addConfigurationProperty("touch.deviceType", "touchScreen");
6115 prepareDisplay(DISPLAY_ORIENTATION_0);
6116 prepareAxes(POSITION | ID | SLOT | PRESSURE);
6117 addMapperAndConfigure(mapper);
6118
6119 NotifyMotionArgs motionArgs;
6120
6121 // initially hovering because pressure is 0
6122 processId(mapper, 1);
6123 processPosition(mapper, 100, 200);
6124 processPressure(mapper, 0);
6125 processSync(mapper);
6126 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6127 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6128 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6129 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6130
6131 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6132 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6133 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6134 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6135
6136 // move a little
6137 processPosition(mapper, 150, 250);
6138 processSync(mapper);
6139 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6140 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6141 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6142 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6143
6144 // down when pressure becomes non-zero
6145 processPressure(mapper, RAW_PRESSURE_MAX);
6146 processSync(mapper);
6147 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6148 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6149 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6150 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6151
6152 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6153 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
6154 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6155 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6156
6157 // up when pressure becomes 0, hover restored
6158 processPressure(mapper, 0);
6159 processSync(mapper);
6160 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6161 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
6162 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6163 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6164
6165 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6166 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, 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 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6171 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6172 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6173 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6174
6175 // exit hover when pointer goes away
6176 processId(mapper, -1);
6177 processSync(mapper);
6178 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6179 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6180 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6181 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6182}
6183
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08006184TEST_F(MultiTouchInputMapperTest, Process_HandlesTimestamp) {
6185 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6186
6187 addConfigurationProperty("touch.deviceType", "touchScreen");
6188 prepareDisplay(DISPLAY_ORIENTATION_0);
6189 prepareAxes(POSITION);
6190 addMapperAndConfigure(mapper);
6191 NotifyMotionArgs args;
6192
6193 // By default, deviceTimestamp should be zero
6194 processPosition(mapper, 100, 100);
6195 processMTSync(mapper);
6196 processSync(mapper);
6197 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6198 ASSERT_EQ(0U, args.deviceTimestamp);
6199
6200 // Now the timestamp of 1000 is reported by evdev and should appear in MotionArgs
6201 processPosition(mapper, 0, 0);
6202 processTimestamp(mapper, 1000);
6203 processMTSync(mapper);
6204 processSync(mapper);
6205 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6206 ASSERT_EQ(1000U, args.deviceTimestamp);
6207}
6208
Siarhei Vishniakoueaf7acd2018-01-09 12:35:51 -08006209TEST_F(MultiTouchInputMapperTest, WhenMapperIsReset_TimestampIsCleared) {
6210 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6211
6212 addConfigurationProperty("touch.deviceType", "touchScreen");
6213 prepareDisplay(DISPLAY_ORIENTATION_0);
6214 prepareAxes(POSITION);
6215 addMapperAndConfigure(mapper);
6216 NotifyMotionArgs args;
6217
6218 // Send a touch event with a timestamp
6219 processPosition(mapper, 100, 100);
6220 processTimestamp(mapper, 1);
6221 processMTSync(mapper);
6222 processSync(mapper);
6223 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6224 ASSERT_EQ(1U, args.deviceTimestamp);
6225
6226 // Since the data accumulates, and new timestamp has not arrived, deviceTimestamp won't change
6227 processPosition(mapper, 100, 200);
6228 processMTSync(mapper);
6229 processSync(mapper);
6230 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6231 ASSERT_EQ(1U, args.deviceTimestamp);
6232
6233 mapper->reset(/* when */ 0);
6234 // After the mapper is reset, deviceTimestamp should become zero again
6235 processPosition(mapper, 100, 300);
6236 processMTSync(mapper);
6237 processSync(mapper);
6238 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6239 ASSERT_EQ(0U, args.deviceTimestamp);
6240}
6241
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07006242/**
6243 * Set the input device port <--> display port associations, and check that the
6244 * events are routed to the display that matches the display port.
6245 * This can be checked by looking at the displayId of the resulting NotifyMotionArgs.
6246 */
6247TEST_F(MultiTouchInputMapperTest, Configure_AssignsDisplayPort) {
6248 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6249 const std::string usb2 = "USB2";
6250 const uint8_t hdmi1 = 0;
6251 const uint8_t hdmi2 = 1;
6252 const std::string secondaryUniqueId = "uniqueId2";
6253 constexpr ViewportType type = ViewportType::VIEWPORT_EXTERNAL;
6254
6255 addConfigurationProperty("touch.deviceType", "touchScreen");
6256 prepareAxes(POSITION);
6257 addMapperAndConfigure(mapper);
6258
6259 mFakePolicy->addInputPortAssociation(DEVICE_LOCATION, hdmi1);
6260 mFakePolicy->addInputPortAssociation(usb2, hdmi2);
6261
6262 // We are intentionally not adding the viewport for display 1 yet. Since the port association
6263 // for this input device is specified, and the matching viewport is not present,
6264 // the input device should be disabled (at the mapper level).
6265
6266 // Add viewport for display 2 on hdmi2
6267 prepareSecondaryDisplay(type, hdmi2);
6268 // Send a touch event
6269 processPosition(mapper, 100, 100);
6270 processSync(mapper);
6271 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
6272
6273 // Add viewport for display 1 on hdmi1
6274 prepareDisplay(DISPLAY_ORIENTATION_0, hdmi1);
6275 // Send a touch event again
6276 processPosition(mapper, 100, 100);
6277 processSync(mapper);
6278
6279 NotifyMotionArgs args;
6280 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6281 ASSERT_EQ(DISPLAY_ID, args.displayId);
6282}
Michael Wrightd02c5b62014-02-10 15:10:22 -08006283
Andrii Kulian620f6d92018-09-14 16:51:59 -07006284TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShouldHandleDisplayId) {
6285 // Setup PointerController for second display.
6286 sp<FakePointerController> fakePointerController = new FakePointerController();
6287 fakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
6288 fakePointerController->setPosition(100, 200);
6289 fakePointerController->setButtonState(0);
6290 fakePointerController->setDisplayId(SECONDARY_DISPLAY_ID);
6291 mFakePolicy->setPointerController(mDevice->getId(), fakePointerController);
6292
6293 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6294 prepareDisplay(DISPLAY_ORIENTATION_0);
6295 prepareAxes(POSITION);
6296 addMapperAndConfigure(mapper);
6297
6298 // Check source is mouse that would obtain the PointerController.
6299 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
6300
6301 NotifyMotionArgs motionArgs;
6302 processPosition(mapper, 100, 100);
6303 processSync(mapper);
6304
6305 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6306 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6307 ASSERT_EQ(SECONDARY_DISPLAY_ID, motionArgs.displayId);
6308}
6309
Michael Wrightd02c5b62014-02-10 15:10:22 -08006310} // namespace android