blob: f0687324d24205232778d65708ed7a41e6a753d7 [file] [log] [blame]
James Dong199d1c12011-03-17 11:48:13 -07001/*
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 */
Jeff Brownc3db8582010-10-20 15:33:38 -070016
Jeff Brownb4ff35d2011-01-02 16:37:43 -080017#include "../InputReader.h"
18
Jeff Brownc3db8582010-10-20 15:33:38 -070019#include <utils/List.h>
20#include <gtest/gtest.h>
21#include <math.h>
22
23namespace android {
24
25// An arbitrary time value.
26static const nsecs_t ARBITRARY_TIME = 1234;
27
28// Arbitrary display properties.
29static const int32_t DISPLAY_ID = 0;
30static const int32_t DISPLAY_WIDTH = 480;
31static const int32_t DISPLAY_HEIGHT = 800;
32
33// Error tolerance for floating point assertions.
34static const float EPSILON = 0.001f;
35
36template<typename T>
37static inline T min(T a, T b) {
38 return a < b ? a : b;
39}
40
41static inline float avg(float x, float y) {
42 return (x + y) / 2;
43}
44
45
Jeff Brown83c09682010-12-23 17:50:18 -080046// --- FakePointerController ---
47
48class FakePointerController : public PointerControllerInterface {
49 bool mHaveBounds;
50 float mMinX, mMinY, mMaxX, mMaxY;
Jeff Brownbe1aa822011-07-27 16:04:54 -070051 float mX, mY;
52 int32_t mButtonState;
Jeff Brown83c09682010-12-23 17:50:18 -080053
54protected:
55 virtual ~FakePointerController() { }
56
57public:
Jeff Brownb4ff35d2011-01-02 16:37:43 -080058 FakePointerController() :
Jeff Brownbe1aa822011-07-27 16:04:54 -070059 mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0),
60 mButtonState(0) {
Jeff Brown83c09682010-12-23 17:50:18 -080061 }
62
63 void setBounds(float minX, float minY, float maxX, float maxY) {
64 mHaveBounds = true;
65 mMinX = minX;
66 mMinY = minY;
67 mMaxX = maxX;
68 mMaxY = maxY;
69 }
70
Jeff Brownbe1aa822011-07-27 16:04:54 -070071 virtual void setPosition(float x, float y) {
72 mX = x;
73 mY = y;
74 }
75
76 virtual void setButtonState(int32_t buttonState) {
77 mButtonState = buttonState;
78 }
79
80 virtual int32_t getButtonState() const {
81 return mButtonState;
82 }
83
84 virtual void getPosition(float* outX, float* outY) const {
85 *outX = mX;
86 *outY = mY;
87 }
88
Jeff Brown83c09682010-12-23 17:50:18 -080089private:
90 virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
91 *outMinX = mMinX;
Jeff Brown83c09682010-12-23 17:50:18 -080092 *outMinY = mMinY;
Jeff Brownb4ff35d2011-01-02 16:37:43 -080093 *outMaxX = mMaxX;
Jeff Brown83c09682010-12-23 17:50:18 -080094 *outMaxY = mMaxY;
95 return mHaveBounds;
96 }
97
98 virtual void move(float deltaX, float deltaY) {
Jeff Brownbe1aa822011-07-27 16:04:54 -070099 mX += deltaX;
100 if (mX < mMinX) mX = mMinX;
101 if (mX > mMaxX) mX = mMaxX;
102 mY += deltaY;
103 if (mY < mMinY) mY = mMinY;
104 if (mY > mMaxY) mY = mMaxY;
Jeff Brown83c09682010-12-23 17:50:18 -0800105 }
Jeff Brown05dc66a2011-03-02 14:41:58 -0800106
Jeff Brown538881e2011-05-25 18:23:38 -0700107 virtual void fade(Transition transition) {
Jeff Brown05dc66a2011-03-02 14:41:58 -0800108 }
109
Jeff Brown538881e2011-05-25 18:23:38 -0700110 virtual void unfade(Transition transition) {
Jeff Brown05dc66a2011-03-02 14:41:58 -0800111 }
Jeff Brown2352b972011-04-12 22:39:53 -0700112
113 virtual void setPresentation(Presentation presentation) {
114 }
115
Jeff Brown9181a5f42011-06-06 21:04:14 -0700116 virtual void setSpots(const PointerCoords* spotCoords,
117 const uint32_t* spotIdToIndex, BitSet32 spotIdBits) {
Jeff Brown2352b972011-04-12 22:39:53 -0700118 }
119
120 virtual void clearSpots() {
121 }
Jeff Brown83c09682010-12-23 17:50:18 -0800122};
123
124
Jeff Brownc3db8582010-10-20 15:33:38 -0700125// --- FakeInputReaderPolicy ---
126
127class FakeInputReaderPolicy : public InputReaderPolicyInterface {
Jeff Brown214eaf42011-05-26 19:17:02 -0700128 InputReaderConfiguration mConfig;
Jeff Brown83c09682010-12-23 17:50:18 -0800129 KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700130 Vector<InputDeviceInfo> mInputDevices;
Jeff Brownc3db8582010-10-20 15:33:38 -0700131
132protected:
133 virtual ~FakeInputReaderPolicy() { }
134
135public:
Jeff Brown214eaf42011-05-26 19:17:02 -0700136 FakeInputReaderPolicy() {
Jeff Brownc3db8582010-10-20 15:33:38 -0700137 }
138
Jeff Brownc3db8582010-10-20 15:33:38 -0700139 void setDisplayInfo(int32_t displayId, int32_t width, int32_t height, int32_t orientation) {
Jeff Brown65fd2512011-08-18 11:20:58 -0700140 // Set the size of both the internal and external display at the same time.
Jeff Brownd728bf52012-09-08 18:05:28 -0700141 bool isRotated = (orientation == DISPLAY_ORIENTATION_90
142 || orientation == DISPLAY_ORIENTATION_270);
143 DisplayViewport v;
144 v.displayId = displayId;
145 v.orientation = orientation;
146 v.logicalLeft = 0;
147 v.logicalTop = 0;
148 v.logicalRight = isRotated ? height : width;
149 v.logicalBottom = isRotated ? width : height;
150 v.physicalLeft = 0;
151 v.physicalTop = 0;
152 v.physicalRight = isRotated ? height : width;
153 v.physicalBottom = isRotated ? width : height;
Jeff Brown83d616a2012-09-09 20:33:43 -0700154 v.deviceWidth = isRotated ? height : width;
155 v.deviceHeight = isRotated ? width : height;
Jeff Brownd728bf52012-09-08 18:05:28 -0700156 mConfig.setDisplayInfo(false /*external*/, v);
157 mConfig.setDisplayInfo(true /*external*/, v);
Jeff Brownc3db8582010-10-20 15:33:38 -0700158 }
159
Jeff Brownc3db8582010-10-20 15:33:38 -0700160 void addExcludedDeviceName(const String8& deviceName) {
Jeff Brown214eaf42011-05-26 19:17:02 -0700161 mConfig.excludedDeviceNames.push(deviceName);
Jeff Brownc3db8582010-10-20 15:33:38 -0700162 }
163
Jeff Brown83c09682010-12-23 17:50:18 -0800164 void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
165 mPointerControllers.add(deviceId, controller);
166 }
167
Jeff Brown65fd2512011-08-18 11:20:58 -0700168 const InputReaderConfiguration* getReaderConfiguration() const {
169 return &mConfig;
Jeff Brownc3db8582010-10-20 15:33:38 -0700170 }
171
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700172 const Vector<InputDeviceInfo>& getInputDevices() const {
173 return mInputDevices;
174 }
175
Jeff Brown65fd2512011-08-18 11:20:58 -0700176private:
Jeff Brown214eaf42011-05-26 19:17:02 -0700177 virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) {
178 *outConfig = mConfig;
Jeff Brownc3db8582010-10-20 15:33:38 -0700179 }
Jeff Brown83c09682010-12-23 17:50:18 -0800180
181 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
182 return mPointerControllers.valueFor(deviceId);
183 }
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700184
185 virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) {
186 mInputDevices = inputDevices;
187 }
Jeff Brown6ec6f792012-04-17 16:52:41 -0700188
Jeff Brown426f9052012-04-17 19:52:56 -0700189 virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const String8& inputDeviceDescriptor) {
Jeff Brown6ec6f792012-04-17 16:52:41 -0700190 return NULL;
191 }
Jeff Brown5bbd4b42012-04-20 19:28:00 -0700192
193 virtual String8 getDeviceAlias(const InputDeviceIdentifier& identifier) {
194 return String8::empty();
195 }
Jeff Brownc3db8582010-10-20 15:33:38 -0700196};
197
198
Jeff Brownbe1aa822011-07-27 16:04:54 -0700199// --- FakeInputListener ---
Jeff Brownc3db8582010-10-20 15:33:38 -0700200
Jeff Brownbe1aa822011-07-27 16:04:54 -0700201class FakeInputListener : public InputListenerInterface {
Jeff Brownc3db8582010-10-20 15:33:38 -0700202private:
Jeff Brownbe1aa822011-07-27 16:04:54 -0700203 List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue;
Jeff Brown65fd2512011-08-18 11:20:58 -0700204 List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue;
Jeff Brownbe1aa822011-07-27 16:04:54 -0700205 List<NotifyKeyArgs> mNotifyKeyArgsQueue;
206 List<NotifyMotionArgs> mNotifyMotionArgsQueue;
207 List<NotifySwitchArgs> mNotifySwitchArgsQueue;
Jeff Brownc3db8582010-10-20 15:33:38 -0700208
209protected:
Jeff Brownbe1aa822011-07-27 16:04:54 -0700210 virtual ~FakeInputListener() { }
Jeff Brownc3db8582010-10-20 15:33:38 -0700211
212public:
Jeff Brownbe1aa822011-07-27 16:04:54 -0700213 FakeInputListener() {
Jeff Brownc3db8582010-10-20 15:33:38 -0700214 }
215
Jeff Brownbe1aa822011-07-27 16:04:54 -0700216 void assertNotifyConfigurationChangedWasCalled(
217 NotifyConfigurationChangedArgs* outEventArgs = NULL) {
218 ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty())
Jeff Brownc3db8582010-10-20 15:33:38 -0700219 << "Expected notifyConfigurationChanged() to have been called.";
Jeff Brownbe1aa822011-07-27 16:04:54 -0700220 if (outEventArgs) {
221 *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin();
Jeff Brownc3db8582010-10-20 15:33:38 -0700222 }
Jeff Brownbe1aa822011-07-27 16:04:54 -0700223 mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin());
Jeff Brownc3db8582010-10-20 15:33:38 -0700224 }
225
Jeff Brown65fd2512011-08-18 11:20:58 -0700226 void assertNotifyDeviceResetWasCalled(
227 NotifyDeviceResetArgs* outEventArgs = NULL) {
228 ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty())
229 << "Expected notifyDeviceReset() to have been called.";
230 if (outEventArgs) {
231 *outEventArgs = *mNotifyDeviceResetArgsQueue.begin();
232 }
233 mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin());
234 }
235
Jeff Brownbe1aa822011-07-27 16:04:54 -0700236 void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = NULL) {
237 ASSERT_FALSE(mNotifyKeyArgsQueue.empty())
Jeff Brownc3db8582010-10-20 15:33:38 -0700238 << "Expected notifyKey() to have been called.";
Jeff Brownbe1aa822011-07-27 16:04:54 -0700239 if (outEventArgs) {
240 *outEventArgs = *mNotifyKeyArgsQueue.begin();
Jeff Brownc3db8582010-10-20 15:33:38 -0700241 }
Jeff Brownbe1aa822011-07-27 16:04:54 -0700242 mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin());
Jeff Brownc3db8582010-10-20 15:33:38 -0700243 }
244
245 void assertNotifyKeyWasNotCalled() {
Jeff Brownbe1aa822011-07-27 16:04:54 -0700246 ASSERT_TRUE(mNotifyKeyArgsQueue.empty())
Jeff Brownc3db8582010-10-20 15:33:38 -0700247 << "Expected notifyKey() to not have been called.";
248 }
249
Jeff Brownbe1aa822011-07-27 16:04:54 -0700250 void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = NULL) {
251 ASSERT_FALSE(mNotifyMotionArgsQueue.empty())
Jeff Brownc3db8582010-10-20 15:33:38 -0700252 << "Expected notifyMotion() to have been called.";
Jeff Brownbe1aa822011-07-27 16:04:54 -0700253 if (outEventArgs) {
254 *outEventArgs = *mNotifyMotionArgsQueue.begin();
Jeff Brownc3db8582010-10-20 15:33:38 -0700255 }
Jeff Brownbe1aa822011-07-27 16:04:54 -0700256 mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin());
Jeff Brownc3db8582010-10-20 15:33:38 -0700257 }
258
259 void assertNotifyMotionWasNotCalled() {
Jeff Brownbe1aa822011-07-27 16:04:54 -0700260 ASSERT_TRUE(mNotifyMotionArgsQueue.empty())
Jeff Brownc3db8582010-10-20 15:33:38 -0700261 << "Expected notifyMotion() to not have been called.";
262 }
263
Jeff Brownbe1aa822011-07-27 16:04:54 -0700264 void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = NULL) {
265 ASSERT_FALSE(mNotifySwitchArgsQueue.empty())
Jeff Brownc3db8582010-10-20 15:33:38 -0700266 << "Expected notifySwitch() to have been called.";
Jeff Brownbe1aa822011-07-27 16:04:54 -0700267 if (outEventArgs) {
268 *outEventArgs = *mNotifySwitchArgsQueue.begin();
Jeff Brownc3db8582010-10-20 15:33:38 -0700269 }
Jeff Brownbe1aa822011-07-27 16:04:54 -0700270 mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin());
Jeff Brownc3db8582010-10-20 15:33:38 -0700271 }
272
273private:
Jeff Brownbe1aa822011-07-27 16:04:54 -0700274 virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
275 mNotifyConfigurationChangedArgsQueue.push_back(*args);
Jeff Brownc3db8582010-10-20 15:33:38 -0700276 }
277
Jeff Brown65fd2512011-08-18 11:20:58 -0700278 virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) {
279 mNotifyDeviceResetArgsQueue.push_back(*args);
280 }
281
Jeff Brownbe1aa822011-07-27 16:04:54 -0700282 virtual void notifyKey(const NotifyKeyArgs* args) {
283 mNotifyKeyArgsQueue.push_back(*args);
Jeff Brownc3db8582010-10-20 15:33:38 -0700284 }
285
Jeff Brownbe1aa822011-07-27 16:04:54 -0700286 virtual void notifyMotion(const NotifyMotionArgs* args) {
287 mNotifyMotionArgsQueue.push_back(*args);
Jeff Brownc3db8582010-10-20 15:33:38 -0700288 }
289
Jeff Brownbe1aa822011-07-27 16:04:54 -0700290 virtual void notifySwitch(const NotifySwitchArgs* args) {
291 mNotifySwitchArgsQueue.push_back(*args);
Jeff Brownc3db8582010-10-20 15:33:38 -0700292 }
293};
294
295
296// --- FakeEventHub ---
297
298class FakeEventHub : public EventHubInterface {
299 struct KeyInfo {
300 int32_t keyCode;
301 uint32_t flags;
302 };
303
304 struct Device {
Jeff Browne38fdfa2012-04-06 14:51:01 -0700305 InputDeviceIdentifier identifier;
Jeff Brownc3db8582010-10-20 15:33:38 -0700306 uint32_t classes;
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800307 PropertyMap configuration;
Jeff Brownefd32662011-03-08 15:13:06 -0800308 KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
309 KeyedVector<int, bool> relativeAxes;
Jeff Brownc3db8582010-10-20 15:33:38 -0700310 KeyedVector<int32_t, int32_t> keyCodeStates;
311 KeyedVector<int32_t, int32_t> scanCodeStates;
312 KeyedVector<int32_t, int32_t> switchStates;
Jeff Brown2717eff2011-06-30 23:53:07 -0700313 KeyedVector<int32_t, int32_t> absoluteAxisValue;
Jeff Brown49ccac52012-04-11 18:27:33 -0700314 KeyedVector<int32_t, KeyInfo> keysByScanCode;
315 KeyedVector<int32_t, KeyInfo> keysByUsageCode;
Jeff Brown51e7fe72010-10-29 22:19:53 -0700316 KeyedVector<int32_t, bool> leds;
Jeff Brown90655042010-12-02 13:50:46 -0800317 Vector<VirtualKeyDefinition> virtualKeys;
Jeff Brownc3db8582010-10-20 15:33:38 -0700318
Jeff Browne38fdfa2012-04-06 14:51:01 -0700319 Device(uint32_t classes) :
320 classes(classes) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700321 }
322 };
323
324 KeyedVector<int32_t, Device*> mDevices;
325 Vector<String8> mExcludedDevices;
326 List<RawEvent> mEvents;
327
328protected:
329 virtual ~FakeEventHub() {
330 for (size_t i = 0; i < mDevices.size(); i++) {
331 delete mDevices.valueAt(i);
332 }
333 }
334
335public:
336 FakeEventHub() { }
337
338 void addDevice(int32_t deviceId, const String8& name, uint32_t classes) {
Jeff Browne38fdfa2012-04-06 14:51:01 -0700339 Device* device = new Device(classes);
340 device->identifier.name = name;
Jeff Brownc3db8582010-10-20 15:33:38 -0700341 mDevices.add(deviceId, device);
342
Jeff Brown49ccac52012-04-11 18:27:33 -0700343 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -0700344 }
345
346 void removeDevice(int32_t deviceId) {
347 delete mDevices.valueFor(deviceId);
348 mDevices.removeItem(deviceId);
349
Jeff Brown49ccac52012-04-11 18:27:33 -0700350 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -0700351 }
352
353 void finishDeviceScan() {
Jeff Brown49ccac52012-04-11 18:27:33 -0700354 enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -0700355 }
356
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800357 void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) {
358 Device* device = getDevice(deviceId);
359 device->configuration.addProperty(key, value);
360 }
361
Jeff Brown83c09682010-12-23 17:50:18 -0800362 void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
363 Device* device = getDevice(deviceId);
364 device->configuration.addAll(configuration);
365 }
366
Jeff Brownefd32662011-03-08 15:13:06 -0800367 void addAbsoluteAxis(int32_t deviceId, int axis,
Jeff Brownb3a2d132011-06-12 18:14:50 -0700368 int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700369 Device* device = getDevice(deviceId);
370
371 RawAbsoluteAxisInfo info;
372 info.valid = true;
373 info.minValue = minValue;
374 info.maxValue = maxValue;
375 info.flat = flat;
376 info.fuzz = fuzz;
Jeff Brownb3a2d132011-06-12 18:14:50 -0700377 info.resolution = resolution;
Jeff Brownefd32662011-03-08 15:13:06 -0800378 device->absoluteAxes.add(axis, info);
379 }
380
381 void addRelativeAxis(int32_t deviceId, int32_t axis) {
382 Device* device = getDevice(deviceId);
383 device->relativeAxes.add(axis, true);
Jeff Brownc3db8582010-10-20 15:33:38 -0700384 }
385
386 void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
387 Device* device = getDevice(deviceId);
388 device->keyCodeStates.replaceValueFor(keyCode, state);
389 }
390
391 void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
392 Device* device = getDevice(deviceId);
393 device->scanCodeStates.replaceValueFor(scanCode, state);
394 }
395
396 void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
397 Device* device = getDevice(deviceId);
398 device->switchStates.replaceValueFor(switchCode, state);
399 }
400
Jeff Brown2717eff2011-06-30 23:53:07 -0700401 void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) {
402 Device* device = getDevice(deviceId);
403 device->absoluteAxisValue.replaceValueFor(axis, value);
404 }
405
Jeff Brown49ccac52012-04-11 18:27:33 -0700406 void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
407 int32_t keyCode, uint32_t flags) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700408 Device* device = getDevice(deviceId);
409 KeyInfo info;
410 info.keyCode = keyCode;
411 info.flags = flags;
Jeff Brown49ccac52012-04-11 18:27:33 -0700412 if (scanCode) {
413 device->keysByScanCode.add(scanCode, info);
414 }
415 if (usageCode) {
416 device->keysByUsageCode.add(usageCode, info);
417 }
Jeff Brownc3db8582010-10-20 15:33:38 -0700418 }
419
Jeff Brown51e7fe72010-10-29 22:19:53 -0700420 void addLed(int32_t deviceId, int32_t led, bool initialState) {
421 Device* device = getDevice(deviceId);
422 device->leds.add(led, initialState);
423 }
424
425 bool getLedState(int32_t deviceId, int32_t led) {
426 Device* device = getDevice(deviceId);
427 return device->leds.valueFor(led);
428 }
429
Jeff Brownc3db8582010-10-20 15:33:38 -0700430 Vector<String8>& getExcludedDevices() {
431 return mExcludedDevices;
432 }
433
Jeff Brown90655042010-12-02 13:50:46 -0800434 void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) {
435 Device* device = getDevice(deviceId);
436 device->virtualKeys.push(definition);
437 }
438
Jeff Brownc3db8582010-10-20 15:33:38 -0700439 void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
Jeff Brown49ccac52012-04-11 18:27:33 -0700440 int32_t code, int32_t value) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700441 RawEvent event;
442 event.when = when;
443 event.deviceId = deviceId;
444 event.type = type;
Jeff Brown49ccac52012-04-11 18:27:33 -0700445 event.code = code;
Jeff Brownc3db8582010-10-20 15:33:38 -0700446 event.value = value;
Jeff Brownc3db8582010-10-20 15:33:38 -0700447 mEvents.push_back(event);
Jeff Brownbe1aa822011-07-27 16:04:54 -0700448
449 if (type == EV_ABS) {
Jeff Brown49ccac52012-04-11 18:27:33 -0700450 setAbsoluteAxisValue(deviceId, code, value);
Jeff Brownbe1aa822011-07-27 16:04:54 -0700451 }
Jeff Brownc3db8582010-10-20 15:33:38 -0700452 }
453
454 void assertQueueIsEmpty() {
455 ASSERT_EQ(size_t(0), mEvents.size())
456 << "Expected the event queue to be empty (fully consumed).";
457 }
458
459private:
460 Device* getDevice(int32_t deviceId) const {
461 ssize_t index = mDevices.indexOfKey(deviceId);
462 return index >= 0 ? mDevices.valueAt(index) : NULL;
463 }
464
465 virtual uint32_t getDeviceClasses(int32_t deviceId) const {
466 Device* device = getDevice(deviceId);
467 return device ? device->classes : 0;
468 }
469
Jeff Browne38fdfa2012-04-06 14:51:01 -0700470 virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
Jeff Brownc3db8582010-10-20 15:33:38 -0700471 Device* device = getDevice(deviceId);
Jeff Browne38fdfa2012-04-06 14:51:01 -0700472 return device ? device->identifier : InputDeviceIdentifier();
Jeff Brownc3db8582010-10-20 15:33:38 -0700473 }
474
Michael Wrightac6c78b2013-07-17 13:21:45 -0700475 virtual int32_t getDeviceControllerNumber(int32_t deviceId) const {
476 return 0;
477 }
478
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800479 virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
480 Device* device = getDevice(deviceId);
481 if (device) {
482 *outConfiguration = device->configuration;
483 }
484 }
485
Jeff Brownc3db8582010-10-20 15:33:38 -0700486 virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
487 RawAbsoluteAxisInfo* outAxisInfo) const {
488 Device* device = getDevice(deviceId);
489 if (device) {
Jeff Brownefd32662011-03-08 15:13:06 -0800490 ssize_t index = device->absoluteAxes.indexOfKey(axis);
Jeff Brownc3db8582010-10-20 15:33:38 -0700491 if (index >= 0) {
Jeff Brownefd32662011-03-08 15:13:06 -0800492 *outAxisInfo = device->absoluteAxes.valueAt(index);
Jeff Brownc3db8582010-10-20 15:33:38 -0700493 return OK;
494 }
495 }
Jeff Brown83d616a2012-09-09 20:33:43 -0700496 outAxisInfo->clear();
Jeff Brownc3db8582010-10-20 15:33:38 -0700497 return -1;
498 }
499
Jeff Browncc0c1592011-02-19 05:07:28 -0800500 virtual bool hasRelativeAxis(int32_t deviceId, int axis) const {
Jeff Brownefd32662011-03-08 15:13:06 -0800501 Device* device = getDevice(deviceId);
502 if (device) {
503 return device->relativeAxes.indexOfKey(axis) >= 0;
504 }
Jeff Browncc0c1592011-02-19 05:07:28 -0800505 return false;
506 }
507
Jeff Brown80fd47c2011-05-24 01:07:44 -0700508 virtual bool hasInputProperty(int32_t deviceId, int property) const {
509 return false;
510 }
511
Jeff Brown49ccac52012-04-11 18:27:33 -0700512 virtual status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
Jeff Brownc3db8582010-10-20 15:33:38 -0700513 int32_t* outKeycode, uint32_t* outFlags) const {
514 Device* device = getDevice(deviceId);
515 if (device) {
Jeff Browncc116982012-04-12 10:05:41 -0700516 const KeyInfo* key = getKey(device, scanCode, usageCode);
Jeff Brown49ccac52012-04-11 18:27:33 -0700517 if (key) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700518 if (outKeycode) {
Jeff Brown49ccac52012-04-11 18:27:33 -0700519 *outKeycode = key->keyCode;
Jeff Brownc3db8582010-10-20 15:33:38 -0700520 }
521 if (outFlags) {
Jeff Brown49ccac52012-04-11 18:27:33 -0700522 *outFlags = key->flags;
Jeff Brownc3db8582010-10-20 15:33:38 -0700523 }
524 return OK;
525 }
526 }
527 return NAME_NOT_FOUND;
528 }
529
Jeff Browncc116982012-04-12 10:05:41 -0700530 const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const {
531 if (usageCode) {
532 ssize_t index = device->keysByUsageCode.indexOfKey(usageCode);
533 if (index >= 0) {
534 return &device->keysByUsageCode.valueAt(index);
535 }
536 }
537 if (scanCode) {
538 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
539 if (index >= 0) {
540 return &device->keysByScanCode.valueAt(index);
541 }
542 }
543 return NULL;
544 }
545
Jeff Brown49ccac52012-04-11 18:27:33 -0700546 virtual status_t mapAxis(int32_t deviceId, int32_t scanCode,
Jeff Brown85297452011-03-04 13:07:49 -0800547 AxisInfo* outAxisInfo) const {
Jeff Brown6f2fba42011-02-19 01:08:02 -0800548 return NAME_NOT_FOUND;
549 }
550
Jeff Brown1a84fd12011-06-02 01:26:32 -0700551 virtual void setExcludedDevices(const Vector<String8>& devices) {
552 mExcludedDevices = devices;
Jeff Brownc3db8582010-10-20 15:33:38 -0700553 }
554
Jeff Brownb7198742011-03-18 18:14:26 -0700555 virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700556 if (mEvents.empty()) {
Jeff Brownb7198742011-03-18 18:14:26 -0700557 return 0;
Jeff Brownc3db8582010-10-20 15:33:38 -0700558 }
559
Jeff Brownb7198742011-03-18 18:14:26 -0700560 *buffer = *mEvents.begin();
Jeff Brownc3db8582010-10-20 15:33:38 -0700561 mEvents.erase(mEvents.begin());
Jeff Brownb7198742011-03-18 18:14:26 -0700562 return 1;
Jeff Brownc3db8582010-10-20 15:33:38 -0700563 }
564
565 virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
566 Device* device = getDevice(deviceId);
567 if (device) {
568 ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
569 if (index >= 0) {
570 return device->scanCodeStates.valueAt(index);
571 }
572 }
573 return AKEY_STATE_UNKNOWN;
574 }
575
576 virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const {
577 Device* device = getDevice(deviceId);
578 if (device) {
579 ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
580 if (index >= 0) {
581 return device->keyCodeStates.valueAt(index);
582 }
583 }
584 return AKEY_STATE_UNKNOWN;
585 }
586
587 virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const {
588 Device* device = getDevice(deviceId);
589 if (device) {
590 ssize_t index = device->switchStates.indexOfKey(sw);
591 if (index >= 0) {
592 return device->switchStates.valueAt(index);
593 }
594 }
595 return AKEY_STATE_UNKNOWN;
596 }
597
Jeff Brown2717eff2011-06-30 23:53:07 -0700598 virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis,
599 int32_t* outValue) const {
600 Device* device = getDevice(deviceId);
601 if (device) {
602 ssize_t index = device->absoluteAxisValue.indexOfKey(axis);
603 if (index >= 0) {
604 *outValue = device->absoluteAxisValue.valueAt(index);
605 return OK;
606 }
607 }
608 *outValue = 0;
609 return -1;
610 }
611
Jeff Brownc3db8582010-10-20 15:33:38 -0700612 virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
613 uint8_t* outFlags) const {
614 bool result = false;
615 Device* device = getDevice(deviceId);
616 if (device) {
617 for (size_t i = 0; i < numCodes; i++) {
Jeff Brown49ccac52012-04-11 18:27:33 -0700618 for (size_t j = 0; j < device->keysByScanCode.size(); j++) {
619 if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) {
620 outFlags[i] = 1;
621 result = true;
622 }
623 }
624 for (size_t j = 0; j < device->keysByUsageCode.size(); j++) {
625 if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700626 outFlags[i] = 1;
627 result = true;
628 }
629 }
630 }
631 }
632 return result;
633 }
634
Jeff Brown49754db2011-07-01 17:37:58 -0700635 virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const {
636 Device* device = getDevice(deviceId);
637 if (device) {
Jeff Brown49ccac52012-04-11 18:27:33 -0700638 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
Jeff Brown49754db2011-07-01 17:37:58 -0700639 return index >= 0;
640 }
641 return false;
642 }
643
Jeff Brown7631cbb2010-10-24 15:22:06 -0700644 virtual bool hasLed(int32_t deviceId, int32_t led) const {
Jeff Brown51e7fe72010-10-29 22:19:53 -0700645 Device* device = getDevice(deviceId);
646 return device && device->leds.indexOfKey(led) >= 0;
Jeff Brown7631cbb2010-10-24 15:22:06 -0700647 }
648
649 virtual void setLedState(int32_t deviceId, int32_t led, bool on) {
Jeff Brown51e7fe72010-10-29 22:19:53 -0700650 Device* device = getDevice(deviceId);
651 if (device) {
652 ssize_t index = device->leds.indexOfKey(led);
653 if (index >= 0) {
654 device->leds.replaceValueAt(led, on);
655 } else {
656 ADD_FAILURE()
657 << "Attempted to set the state of an LED that the EventHub declared "
658 "was not present. led=" << led;
659 }
660 }
Jeff Brown7631cbb2010-10-24 15:22:06 -0700661 }
662
Jeff Brown90655042010-12-02 13:50:46 -0800663 virtual void getVirtualKeyDefinitions(int32_t deviceId,
664 Vector<VirtualKeyDefinition>& outVirtualKeys) const {
665 outVirtualKeys.clear();
666
667 Device* device = getDevice(deviceId);
668 if (device) {
669 outVirtualKeys.appendVector(device->virtualKeys);
670 }
671 }
672
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700673 virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t deviceId) const {
674 return NULL;
Jeff Brown1e08fe92011-11-15 17:48:10 -0800675 }
676
Jeff Brown6ec6f792012-04-17 16:52:41 -0700677 virtual bool setKeyboardLayoutOverlay(int32_t deviceId, const sp<KeyCharacterMap>& map) {
678 return false;
679 }
680
Jeff Browna47425a2012-04-13 04:09:27 -0700681 virtual void vibrate(int32_t deviceId, nsecs_t duration) {
682 }
683
684 virtual void cancelVibrate(int32_t deviceId) {
685 }
686
Jeff Brown56194eb2011-03-02 19:23:13 -0800687 virtual bool isExternal(int32_t deviceId) const {
688 return false;
689 }
690
Jeff Brownc3db8582010-10-20 15:33:38 -0700691 virtual void dump(String8& dump) {
692 }
Jeff Brown1a84fd12011-06-02 01:26:32 -0700693
Jeff Brown89ef0722011-08-10 16:25:21 -0700694 virtual void monitor() {
695 }
696
Jeff Brown93fa9b32011-06-14 17:09:25 -0700697 virtual void requestReopenDevices() {
698 }
699
700 virtual void wake() {
Jeff Brown1a84fd12011-06-02 01:26:32 -0700701 }
Jeff Brownc3db8582010-10-20 15:33:38 -0700702};
703
704
705// --- FakeInputReaderContext ---
706
707class FakeInputReaderContext : public InputReaderContext {
708 sp<EventHubInterface> mEventHub;
709 sp<InputReaderPolicyInterface> mPolicy;
Jeff Brownbe1aa822011-07-27 16:04:54 -0700710 sp<InputListenerInterface> mListener;
Jeff Brownc3db8582010-10-20 15:33:38 -0700711 int32_t mGlobalMetaState;
712 bool mUpdateGlobalMetaStateWasCalled;
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700713 int32_t mGeneration;
Jeff Brownc3db8582010-10-20 15:33:38 -0700714
715public:
716 FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
717 const sp<InputReaderPolicyInterface>& policy,
Jeff Brownbe1aa822011-07-27 16:04:54 -0700718 const sp<InputListenerInterface>& listener) :
719 mEventHub(eventHub), mPolicy(policy), mListener(listener),
Jeff Brownc3db8582010-10-20 15:33:38 -0700720 mGlobalMetaState(0) {
721 }
722
723 virtual ~FakeInputReaderContext() { }
724
725 void assertUpdateGlobalMetaStateWasCalled() {
726 ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
727 << "Expected updateGlobalMetaState() to have been called.";
728 mUpdateGlobalMetaStateWasCalled = false;
729 }
730
731 void setGlobalMetaState(int32_t state) {
732 mGlobalMetaState = state;
733 }
734
735private:
736 virtual void updateGlobalMetaState() {
737 mUpdateGlobalMetaStateWasCalled = true;
738 }
739
740 virtual int32_t getGlobalMetaState() {
741 return mGlobalMetaState;
742 }
743
744 virtual EventHubInterface* getEventHub() {
745 return mEventHub.get();
746 }
747
748 virtual InputReaderPolicyInterface* getPolicy() {
749 return mPolicy.get();
750 }
751
Jeff Brownbe1aa822011-07-27 16:04:54 -0700752 virtual InputListenerInterface* getListener() {
753 return mListener.get();
Jeff Brownc3db8582010-10-20 15:33:38 -0700754 }
Jeff Brownfe508922011-01-18 15:10:10 -0800755
756 virtual void disableVirtualKeysUntil(nsecs_t time) {
757 }
758
759 virtual bool shouldDropVirtualKey(nsecs_t now,
760 InputDevice* device, int32_t keyCode, int32_t scanCode) {
761 return false;
762 }
Jeff Brown05dc66a2011-03-02 14:41:58 -0800763
764 virtual void fadePointer() {
765 }
Jeff Brownaa3855d2011-03-17 01:34:19 -0700766
767 virtual void requestTimeoutAtTime(nsecs_t when) {
768 }
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700769
770 virtual int32_t bumpGeneration() {
771 return ++mGeneration;
772 }
Jeff Brownc3db8582010-10-20 15:33:38 -0700773};
774
775
776// --- FakeInputMapper ---
777
778class FakeInputMapper : public InputMapper {
779 uint32_t mSources;
780 int32_t mKeyboardType;
781 int32_t mMetaState;
782 KeyedVector<int32_t, int32_t> mKeyCodeStates;
783 KeyedVector<int32_t, int32_t> mScanCodeStates;
784 KeyedVector<int32_t, int32_t> mSwitchStates;
785 Vector<int32_t> mSupportedKeyCodes;
786 RawEvent mLastEvent;
787
788 bool mConfigureWasCalled;
789 bool mResetWasCalled;
790 bool mProcessWasCalled;
791
792public:
793 FakeInputMapper(InputDevice* device, uint32_t sources) :
794 InputMapper(device),
795 mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
796 mMetaState(0),
797 mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
798 }
799
800 virtual ~FakeInputMapper() { }
801
802 void setKeyboardType(int32_t keyboardType) {
803 mKeyboardType = keyboardType;
804 }
805
806 void setMetaState(int32_t metaState) {
807 mMetaState = metaState;
808 }
809
810 void assertConfigureWasCalled() {
811 ASSERT_TRUE(mConfigureWasCalled)
812 << "Expected configure() to have been called.";
813 mConfigureWasCalled = false;
814 }
815
816 void assertResetWasCalled() {
817 ASSERT_TRUE(mResetWasCalled)
818 << "Expected reset() to have been called.";
819 mResetWasCalled = false;
820 }
821
822 void assertProcessWasCalled(RawEvent* outLastEvent = NULL) {
823 ASSERT_TRUE(mProcessWasCalled)
824 << "Expected process() to have been called.";
825 if (outLastEvent) {
826 *outLastEvent = mLastEvent;
827 }
828 mProcessWasCalled = false;
829 }
830
831 void setKeyCodeState(int32_t keyCode, int32_t state) {
832 mKeyCodeStates.replaceValueFor(keyCode, state);
833 }
834
835 void setScanCodeState(int32_t scanCode, int32_t state) {
836 mScanCodeStates.replaceValueFor(scanCode, state);
837 }
838
839 void setSwitchState(int32_t switchCode, int32_t state) {
840 mSwitchStates.replaceValueFor(switchCode, state);
841 }
842
843 void addSupportedKeyCode(int32_t keyCode) {
844 mSupportedKeyCodes.add(keyCode);
845 }
846
847private:
848 virtual uint32_t getSources() {
849 return mSources;
850 }
851
852 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
853 InputMapper::populateDeviceInfo(deviceInfo);
854
855 if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
856 deviceInfo->setKeyboardType(mKeyboardType);
857 }
858 }
859
Jeff Brown65fd2512011-08-18 11:20:58 -0700860 virtual void configure(nsecs_t when,
861 const InputReaderConfiguration* config, uint32_t changes) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700862 mConfigureWasCalled = true;
863 }
864
Jeff Brown65fd2512011-08-18 11:20:58 -0700865 virtual void reset(nsecs_t when) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700866 mResetWasCalled = true;
867 }
868
869 virtual void process(const RawEvent* rawEvent) {
870 mLastEvent = *rawEvent;
871 mProcessWasCalled = true;
872 }
873
874 virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode) {
875 ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
876 return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
877 }
878
879 virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode) {
880 ssize_t index = mScanCodeStates.indexOfKey(scanCode);
881 return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
882 }
883
884 virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode) {
885 ssize_t index = mSwitchStates.indexOfKey(switchCode);
886 return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
887 }
888
889 virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
890 const int32_t* keyCodes, uint8_t* outFlags) {
891 bool result = false;
892 for (size_t i = 0; i < numCodes; i++) {
893 for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
894 if (keyCodes[i] == mSupportedKeyCodes[j]) {
895 outFlags[i] = 1;
896 result = true;
897 }
898 }
899 }
900 return result;
901 }
902
903 virtual int32_t getMetaState() {
904 return mMetaState;
905 }
Jeff Brown05dc66a2011-03-02 14:41:58 -0800906
907 virtual void fadePointer() {
908 }
Jeff Brownc3db8582010-10-20 15:33:38 -0700909};
910
911
912// --- InstrumentedInputReader ---
913
914class InstrumentedInputReader : public InputReader {
915 InputDevice* mNextDevice;
916
917public:
918 InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
919 const sp<InputReaderPolicyInterface>& policy,
Jeff Brownbe1aa822011-07-27 16:04:54 -0700920 const sp<InputListenerInterface>& listener) :
921 InputReader(eventHub, policy, listener),
Jeff Brown71c86ad2011-02-07 20:29:08 -0800922 mNextDevice(NULL) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700923 }
924
925 virtual ~InstrumentedInputReader() {
926 if (mNextDevice) {
927 delete mNextDevice;
928 }
929 }
930
931 void setNextDevice(InputDevice* device) {
932 mNextDevice = device;
933 }
934
Michael Wrightac6c78b2013-07-17 13:21:45 -0700935 InputDevice* newDevice(int32_t deviceId, int32_t controllerNumber, const String8& name,
936 uint32_t classes) {
Jeff Browne38fdfa2012-04-06 14:51:01 -0700937 InputDeviceIdentifier identifier;
938 identifier.name = name;
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700939 int32_t generation = deviceId + 1;
Michael Wrightac6c78b2013-07-17 13:21:45 -0700940 return new InputDevice(&mContext, deviceId, generation, controllerNumber, identifier,
941 classes);
Jeff Brownbe1aa822011-07-27 16:04:54 -0700942 }
943
Jeff Brownc3db8582010-10-20 15:33:38 -0700944protected:
Michael Wrightac6c78b2013-07-17 13:21:45 -0700945 virtual InputDevice* createDeviceLocked(int32_t deviceId, int32_t controllerNumber,
Jeff Browne38fdfa2012-04-06 14:51:01 -0700946 const InputDeviceIdentifier& identifier, uint32_t classes) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700947 if (mNextDevice) {
948 InputDevice* device = mNextDevice;
949 mNextDevice = NULL;
950 return device;
951 }
Michael Wrightac6c78b2013-07-17 13:21:45 -0700952 return InputReader::createDeviceLocked(deviceId, controllerNumber, identifier, classes);
Jeff Brownc3db8582010-10-20 15:33:38 -0700953 }
954
955 friend class InputReaderTest;
956};
957
958
959// --- InputReaderTest ---
960
961class InputReaderTest : public testing::Test {
962protected:
Jeff Brownbe1aa822011-07-27 16:04:54 -0700963 sp<FakeInputListener> mFakeListener;
Jeff Brownc3db8582010-10-20 15:33:38 -0700964 sp<FakeInputReaderPolicy> mFakePolicy;
965 sp<FakeEventHub> mFakeEventHub;
966 sp<InstrumentedInputReader> mReader;
967
968 virtual void SetUp() {
969 mFakeEventHub = new FakeEventHub();
970 mFakePolicy = new FakeInputReaderPolicy();
Jeff Brownbe1aa822011-07-27 16:04:54 -0700971 mFakeListener = new FakeInputListener();
Jeff Brownc3db8582010-10-20 15:33:38 -0700972
Jeff Brownbe1aa822011-07-27 16:04:54 -0700973 mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener);
Jeff Brownc3db8582010-10-20 15:33:38 -0700974 }
975
976 virtual void TearDown() {
977 mReader.clear();
978
Jeff Brownbe1aa822011-07-27 16:04:54 -0700979 mFakeListener.clear();
Jeff Brownc3db8582010-10-20 15:33:38 -0700980 mFakePolicy.clear();
981 mFakeEventHub.clear();
982 }
983
Jeff Brown83c09682010-12-23 17:50:18 -0800984 void addDevice(int32_t deviceId, const String8& name, uint32_t classes,
985 const PropertyMap* configuration) {
Jeff Brownc3db8582010-10-20 15:33:38 -0700986 mFakeEventHub->addDevice(deviceId, name, classes);
Jeff Brown65fd2512011-08-18 11:20:58 -0700987
Jeff Brown83c09682010-12-23 17:50:18 -0800988 if (configuration) {
989 mFakeEventHub->addConfigurationMap(deviceId, configuration);
990 }
Jeff Brownc3db8582010-10-20 15:33:38 -0700991 mFakeEventHub->finishDeviceScan();
992 mReader->loopOnce();
993 mReader->loopOnce();
994 mFakeEventHub->assertQueueIsEmpty();
995 }
996
Michael Wrightac6c78b2013-07-17 13:21:45 -0700997 FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, int32_t controllerNumber,
Jeff Brown83c09682010-12-23 17:50:18 -0800998 const String8& name, uint32_t classes, uint32_t sources,
999 const PropertyMap* configuration) {
Michael Wrightac6c78b2013-07-17 13:21:45 -07001000 InputDevice* device = mReader->newDevice(deviceId, controllerNumber, name, classes);
Jeff Brownc3db8582010-10-20 15:33:38 -07001001 FakeInputMapper* mapper = new FakeInputMapper(device, sources);
1002 device->addMapper(mapper);
1003 mReader->setNextDevice(device);
Jeff Brown83c09682010-12-23 17:50:18 -08001004 addDevice(deviceId, name, classes, configuration);
Jeff Brownc3db8582010-10-20 15:33:38 -07001005 return mapper;
1006 }
1007};
1008
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001009TEST_F(InputReaderTest, GetInputDevices) {
Jeff Brownc3db8582010-10-20 15:33:38 -07001010 ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"),
Jeff Brown83c09682010-12-23 17:50:18 -08001011 INPUT_DEVICE_CLASS_KEYBOARD, NULL));
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001012 ASSERT_NO_FATAL_FAILURE(addDevice(2, String8("ignored"),
1013 0, NULL)); // no classes so device will be ignored
Jeff Brownc3db8582010-10-20 15:33:38 -07001014
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001015 Vector<InputDeviceInfo> inputDevices;
1016 mReader->getInputDevices(inputDevices);
Jeff Brownc3db8582010-10-20 15:33:38 -07001017
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001018 ASSERT_EQ(1U, inputDevices.size());
1019 ASSERT_EQ(1, inputDevices[0].getId());
Jeff Brown5bbd4b42012-04-20 19:28:00 -07001020 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.string());
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001021 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1022 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1023 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
Jeff Brownc3db8582010-10-20 15:33:38 -07001024
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001025 // Should also have received a notification describing the new input devices.
1026 inputDevices = mFakePolicy->getInputDevices();
1027 ASSERT_EQ(1U, inputDevices.size());
1028 ASSERT_EQ(1, inputDevices[0].getId());
Jeff Brown5bbd4b42012-04-20 19:28:00 -07001029 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.string());
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001030 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1031 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1032 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
Jeff Brownc3db8582010-10-20 15:33:38 -07001033}
1034
1035TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
1036 FakeInputMapper* mapper = NULL;
Michael Wrightac6c78b2013-07-17 13:21:45 -07001037 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, String8("fake"),
Jeff Brown83c09682010-12-23 17:50:18 -08001038 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
Jeff Brownc3db8582010-10-20 15:33:38 -07001039 mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1040
1041 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
1042 AINPUT_SOURCE_ANY, AKEYCODE_A))
1043 << "Should return unknown when the device id is >= 0 but unknown.";
1044
1045 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
1046 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1047 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1048
1049 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
1050 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1051 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1052
1053 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
1054 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1055 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1056
1057 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
1058 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1059 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1060}
1061
1062TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
1063 FakeInputMapper* mapper = NULL;
Michael Wrightac6c78b2013-07-17 13:21:45 -07001064 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, String8("fake"),
Jeff Brown83c09682010-12-23 17:50:18 -08001065 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
Jeff Brownc3db8582010-10-20 15:33:38 -07001066 mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
1067
1068 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
1069 AINPUT_SOURCE_ANY, KEY_A))
1070 << "Should return unknown when the device id is >= 0 but unknown.";
1071
1072 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
1073 AINPUT_SOURCE_TRACKBALL, KEY_A))
1074 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1075
1076 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
1077 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1078 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1079
1080 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
1081 AINPUT_SOURCE_TRACKBALL, KEY_A))
1082 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1083
1084 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
1085 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1086 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1087}
1088
1089TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
1090 FakeInputMapper* mapper = NULL;
Michael Wrightac6c78b2013-07-17 13:21:45 -07001091 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, String8("fake"),
Jeff Brown83c09682010-12-23 17:50:18 -08001092 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
Jeff Brownc3db8582010-10-20 15:33:38 -07001093 mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
1094
1095 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
1096 AINPUT_SOURCE_ANY, SW_LID))
1097 << "Should return unknown when the device id is >= 0 but unknown.";
1098
1099 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
1100 AINPUT_SOURCE_TRACKBALL, SW_LID))
1101 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1102
1103 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
1104 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1105 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1106
1107 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
1108 AINPUT_SOURCE_TRACKBALL, SW_LID))
1109 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1110
1111 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
1112 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1113 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1114}
1115
1116TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
1117 FakeInputMapper* mapper = NULL;
Michael Wrightac6c78b2013-07-17 13:21:45 -07001118 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, String8("fake"),
Jeff Brown83c09682010-12-23 17:50:18 -08001119 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
Jeff Brownc3db8582010-10-20 15:33:38 -07001120 mapper->addSupportedKeyCode(AKEYCODE_A);
1121 mapper->addSupportedKeyCode(AKEYCODE_B);
1122
1123 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1124 uint8_t flags[4] = { 0, 0, 0, 1 };
1125
1126 ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
1127 << "Should return false when device id is >= 0 but unknown.";
1128 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1129
1130 flags[3] = 1;
1131 ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1132 << "Should return false when device id is valid but the sources are not supported by the device.";
1133 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1134
1135 flags[3] = 1;
1136 ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1137 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1138 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1139
1140 flags[3] = 1;
1141 ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1142 << "Should return false when the device id is < 0 but the sources are not supported by any device.";
1143 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1144
1145 flags[3] = 1;
1146 ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1147 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1148 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1149}
1150
1151TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
Jeff Brown83c09682010-12-23 17:50:18 -08001152 addDevice(1, String8("ignored"), INPUT_DEVICE_CLASS_KEYBOARD, NULL);
Jeff Brownc3db8582010-10-20 15:33:38 -07001153
Jeff Brownbe1aa822011-07-27 16:04:54 -07001154 NotifyConfigurationChangedArgs args;
1155
1156 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001157 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1158}
1159
1160TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
1161 FakeInputMapper* mapper = NULL;
Michael Wrightac6c78b2013-07-17 13:21:45 -07001162 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, String8("fake"),
Jeff Brown83c09682010-12-23 17:50:18 -08001163 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
Jeff Brownc3db8582010-10-20 15:33:38 -07001164
Jeff Brown49ccac52012-04-11 18:27:33 -07001165 mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1);
Jeff Brownc3db8582010-10-20 15:33:38 -07001166 mReader->loopOnce();
1167 ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
1168
1169 RawEvent event;
1170 ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
1171 ASSERT_EQ(0, event.when);
1172 ASSERT_EQ(1, event.deviceId);
1173 ASSERT_EQ(EV_KEY, event.type);
Jeff Brown49ccac52012-04-11 18:27:33 -07001174 ASSERT_EQ(KEY_A, event.code);
Jeff Brownc3db8582010-10-20 15:33:38 -07001175 ASSERT_EQ(1, event.value);
Jeff Brownc3db8582010-10-20 15:33:38 -07001176}
1177
1178
1179// --- InputDeviceTest ---
1180
1181class InputDeviceTest : public testing::Test {
1182protected:
1183 static const char* DEVICE_NAME;
1184 static const int32_t DEVICE_ID;
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001185 static const int32_t DEVICE_GENERATION;
Michael Wrightac6c78b2013-07-17 13:21:45 -07001186 static const int32_t DEVICE_CONTROLLER_NUMBER;
Jeff Brown9ee285a2011-08-31 12:56:34 -07001187 static const uint32_t DEVICE_CLASSES;
Jeff Brownc3db8582010-10-20 15:33:38 -07001188
1189 sp<FakeEventHub> mFakeEventHub;
1190 sp<FakeInputReaderPolicy> mFakePolicy;
Jeff Brownbe1aa822011-07-27 16:04:54 -07001191 sp<FakeInputListener> mFakeListener;
Jeff Brownc3db8582010-10-20 15:33:38 -07001192 FakeInputReaderContext* mFakeContext;
1193
1194 InputDevice* mDevice;
1195
1196 virtual void SetUp() {
1197 mFakeEventHub = new FakeEventHub();
1198 mFakePolicy = new FakeInputReaderPolicy();
Jeff Brownbe1aa822011-07-27 16:04:54 -07001199 mFakeListener = new FakeInputListener();
1200 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
Jeff Brownc3db8582010-10-20 15:33:38 -07001201
Jeff Brown49ed71d2010-12-06 17:13:33 -08001202 mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
Jeff Browne38fdfa2012-04-06 14:51:01 -07001203 InputDeviceIdentifier identifier;
1204 identifier.name = DEVICE_NAME;
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001205 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
Michael Wrightac6c78b2013-07-17 13:21:45 -07001206 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
Jeff Brownc3db8582010-10-20 15:33:38 -07001207 }
1208
1209 virtual void TearDown() {
1210 delete mDevice;
1211
1212 delete mFakeContext;
Jeff Brownbe1aa822011-07-27 16:04:54 -07001213 mFakeListener.clear();
Jeff Brownc3db8582010-10-20 15:33:38 -07001214 mFakePolicy.clear();
1215 mFakeEventHub.clear();
1216 }
1217};
1218
1219const char* InputDeviceTest::DEVICE_NAME = "device";
1220const int32_t InputDeviceTest::DEVICE_ID = 1;
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001221const int32_t InputDeviceTest::DEVICE_GENERATION = 2;
Michael Wrightac6c78b2013-07-17 13:21:45 -07001222const int32_t InputDeviceTest::DEVICE_CONTROLLER_NUMBER = 0;
Jeff Brown9ee285a2011-08-31 12:56:34 -07001223const uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD
1224 | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK;
Jeff Brownc3db8582010-10-20 15:33:38 -07001225
1226TEST_F(InputDeviceTest, ImmutableProperties) {
1227 ASSERT_EQ(DEVICE_ID, mDevice->getId());
1228 ASSERT_STREQ(DEVICE_NAME, mDevice->getName());
Jeff Brown9ee285a2011-08-31 12:56:34 -07001229 ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses());
Jeff Brownc3db8582010-10-20 15:33:38 -07001230}
1231
1232TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
1233 // Configuration.
Jeff Brown474dcb52011-06-14 20:22:50 -07001234 InputReaderConfiguration config;
Jeff Brown65fd2512011-08-18 11:20:58 -07001235 mDevice->configure(ARBITRARY_TIME, &config, 0);
1236
1237 // Reset.
1238 mDevice->reset(ARBITRARY_TIME);
1239
1240 NotifyDeviceResetArgs resetArgs;
1241 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1242 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1243 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
Jeff Brownc3db8582010-10-20 15:33:38 -07001244
1245 // Metadata.
1246 ASSERT_TRUE(mDevice->isIgnored());
1247 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources());
1248
1249 InputDeviceInfo info;
1250 mDevice->getDeviceInfo(&info);
1251 ASSERT_EQ(DEVICE_ID, info.getId());
Jeff Brown5bbd4b42012-04-20 19:28:00 -07001252 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.string());
Jeff Brownc3db8582010-10-20 15:33:38 -07001253 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType());
1254 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
1255
1256 // State queries.
1257 ASSERT_EQ(0, mDevice->getMetaState());
1258
1259 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1260 << "Ignored device should return unknown key code state.";
1261 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1262 << "Ignored device should return unknown scan code state.";
1263 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
1264 << "Ignored device should return unknown switch state.";
1265
1266 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1267 uint8_t flags[2] = { 0, 1 };
1268 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
1269 << "Ignored device should never mark any key codes.";
1270 ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
1271 ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
Jeff Brownc3db8582010-10-20 15:33:38 -07001272}
1273
1274TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
1275 // Configuration.
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001276 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value"));
Jeff Brownc3db8582010-10-20 15:33:38 -07001277
1278 FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
1279 mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1280 mapper1->setMetaState(AMETA_ALT_ON);
1281 mapper1->addSupportedKeyCode(AKEYCODE_A);
1282 mapper1->addSupportedKeyCode(AKEYCODE_B);
1283 mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1284 mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
1285 mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
1286 mapper1->setScanCodeState(3, AKEY_STATE_UP);
1287 mapper1->setSwitchState(4, AKEY_STATE_DOWN);
1288 mDevice->addMapper(mapper1);
1289
1290 FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
1291 mapper2->setMetaState(AMETA_SHIFT_ON);
1292 mDevice->addMapper(mapper2);
1293
Jeff Brown474dcb52011-06-14 20:22:50 -07001294 InputReaderConfiguration config;
Jeff Brown65fd2512011-08-18 11:20:58 -07001295 mDevice->configure(ARBITRARY_TIME, &config, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07001296
1297 String8 propertyValue;
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001298 ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue))
1299 << "Device should have read configuration during configuration phase.";
Jeff Brownc3db8582010-10-20 15:33:38 -07001300 ASSERT_STREQ("value", propertyValue.string());
1301
1302 ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
1303 ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
1304
Jeff Brown65fd2512011-08-18 11:20:58 -07001305 // Reset
1306 mDevice->reset(ARBITRARY_TIME);
1307 ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
1308 ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
1309
1310 NotifyDeviceResetArgs resetArgs;
1311 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1312 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1313 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1314
Jeff Brownc3db8582010-10-20 15:33:38 -07001315 // Metadata.
1316 ASSERT_FALSE(mDevice->isIgnored());
1317 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
1318
1319 InputDeviceInfo info;
1320 mDevice->getDeviceInfo(&info);
1321 ASSERT_EQ(DEVICE_ID, info.getId());
Jeff Brown5bbd4b42012-04-20 19:28:00 -07001322 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.string());
Jeff Brownc3db8582010-10-20 15:33:38 -07001323 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
1324 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
1325
1326 // State queries.
1327 ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
1328 << "Should query mappers and combine meta states.";
1329
1330 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1331 << "Should return unknown key code state when source not supported.";
1332 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1333 << "Should return unknown scan code state when source not supported.";
1334 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1335 << "Should return unknown switch state when source not supported.";
1336
1337 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
1338 << "Should query mapper when source is supported.";
1339 ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
1340 << "Should query mapper when source is supported.";
1341 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
1342 << "Should query mapper when source is supported.";
1343
1344 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1345 uint8_t flags[4] = { 0, 0, 0, 1 };
1346 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1347 << "Should do nothing when source is unsupported.";
1348 ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
1349 ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
1350 ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
1351 ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
1352
1353 ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
1354 << "Should query mapper when source is supported.";
1355 ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
1356 ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
1357 ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
1358 ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
1359
1360 // Event handling.
1361 RawEvent event;
Jeff Brownb7198742011-03-18 18:14:26 -07001362 mDevice->process(&event, 1);
Jeff Brownc3db8582010-10-20 15:33:38 -07001363
1364 ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
1365 ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07001366}
1367
1368
1369// --- InputMapperTest ---
1370
1371class InputMapperTest : public testing::Test {
1372protected:
1373 static const char* DEVICE_NAME;
1374 static const int32_t DEVICE_ID;
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001375 static const int32_t DEVICE_GENERATION;
Michael Wrightac6c78b2013-07-17 13:21:45 -07001376 static const int32_t DEVICE_CONTROLLER_NUMBER;
Jeff Brown9ee285a2011-08-31 12:56:34 -07001377 static const uint32_t DEVICE_CLASSES;
Jeff Brownc3db8582010-10-20 15:33:38 -07001378
1379 sp<FakeEventHub> mFakeEventHub;
1380 sp<FakeInputReaderPolicy> mFakePolicy;
Jeff Brownbe1aa822011-07-27 16:04:54 -07001381 sp<FakeInputListener> mFakeListener;
Jeff Brownc3db8582010-10-20 15:33:38 -07001382 FakeInputReaderContext* mFakeContext;
1383 InputDevice* mDevice;
1384
1385 virtual void SetUp() {
1386 mFakeEventHub = new FakeEventHub();
1387 mFakePolicy = new FakeInputReaderPolicy();
Jeff Brownbe1aa822011-07-27 16:04:54 -07001388 mFakeListener = new FakeInputListener();
1389 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
Jeff Browne38fdfa2012-04-06 14:51:01 -07001390 InputDeviceIdentifier identifier;
1391 identifier.name = DEVICE_NAME;
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001392 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
Michael Wrightac6c78b2013-07-17 13:21:45 -07001393 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
Jeff Brownc3db8582010-10-20 15:33:38 -07001394
1395 mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
1396 }
1397
1398 virtual void TearDown() {
1399 delete mDevice;
1400 delete mFakeContext;
Jeff Brownbe1aa822011-07-27 16:04:54 -07001401 mFakeListener.clear();
Jeff Brownc3db8582010-10-20 15:33:38 -07001402 mFakePolicy.clear();
1403 mFakeEventHub.clear();
1404 }
1405
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001406 void addConfigurationProperty(const char* key, const char* value) {
1407 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8(key), String8(value));
Jeff Brownc3db8582010-10-20 15:33:38 -07001408 }
1409
1410 void addMapperAndConfigure(InputMapper* mapper) {
1411 mDevice->addMapper(mapper);
Jeff Brown65fd2512011-08-18 11:20:58 -07001412 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 0);
1413 mDevice->reset(ARBITRARY_TIME);
1414 }
1415
1416 void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
1417 int32_t orientation) {
1418 mFakePolicy->setDisplayInfo(displayId, width, height, orientation);
1419 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
1420 InputReaderConfiguration::CHANGE_DISPLAY_INFO);
Jeff Brownc3db8582010-10-20 15:33:38 -07001421 }
1422
1423 static void process(InputMapper* mapper, nsecs_t when, int32_t deviceId, int32_t type,
Jeff Brown49ccac52012-04-11 18:27:33 -07001424 int32_t code, int32_t value) {
Jeff Brownc3db8582010-10-20 15:33:38 -07001425 RawEvent event;
1426 event.when = when;
1427 event.deviceId = deviceId;
1428 event.type = type;
Jeff Brown49ccac52012-04-11 18:27:33 -07001429 event.code = code;
Jeff Brownc3db8582010-10-20 15:33:38 -07001430 event.value = value;
Jeff Brownc3db8582010-10-20 15:33:38 -07001431 mapper->process(&event);
1432 }
1433
1434 static void assertMotionRange(const InputDeviceInfo& info,
Jeff Brownefd32662011-03-08 15:13:06 -08001435 int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
1436 const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
1437 ASSERT_TRUE(range != NULL) << "Axis: " << axis << " Source: " << source;
1438 ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source;
1439 ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source;
1440 ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source;
1441 ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source;
1442 ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source;
1443 ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source;
Jeff Brownc3db8582010-10-20 15:33:38 -07001444 }
1445
1446 static void assertPointerCoords(const PointerCoords& coords,
1447 float x, float y, float pressure, float size,
1448 float touchMajor, float touchMinor, float toolMajor, float toolMinor,
Jeff Brownbe1aa822011-07-27 16:04:54 -07001449 float orientation, float distance) {
Jeff Brownebbd5d12011-02-17 13:01:34 -08001450 ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1);
1451 ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
1452 ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON);
1453 ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON);
1454 ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1);
1455 ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1);
1456 ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1);
1457 ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1);
1458 ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001459 ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON);
1460 }
1461
1462 static void assertPosition(const sp<FakePointerController>& controller, float x, float y) {
1463 float actualX, actualY;
1464 controller->getPosition(&actualX, &actualY);
1465 ASSERT_NEAR(x, actualX, 1);
1466 ASSERT_NEAR(y, actualY, 1);
Jeff Brownc3db8582010-10-20 15:33:38 -07001467 }
1468};
1469
1470const char* InputMapperTest::DEVICE_NAME = "device";
1471const int32_t InputMapperTest::DEVICE_ID = 1;
Jeff Brownaf9e8d32012-04-12 17:32:48 -07001472const int32_t InputMapperTest::DEVICE_GENERATION = 2;
Michael Wrightac6c78b2013-07-17 13:21:45 -07001473const int32_t InputMapperTest::DEVICE_CONTROLLER_NUMBER = 0;
Jeff Brown9ee285a2011-08-31 12:56:34 -07001474const uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests
Jeff Brownc3db8582010-10-20 15:33:38 -07001475
1476
1477// --- SwitchInputMapperTest ---
1478
1479class SwitchInputMapperTest : public InputMapperTest {
1480protected:
1481};
1482
1483TEST_F(SwitchInputMapperTest, GetSources) {
1484 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1485 addMapperAndConfigure(mapper);
1486
Jeff Brown89de57a2011-01-19 18:41:38 -08001487 ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources());
Jeff Brownc3db8582010-10-20 15:33:38 -07001488}
1489
1490TEST_F(SwitchInputMapperTest, GetSwitchState) {
1491 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1492 addMapperAndConfigure(mapper);
1493
1494 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
1495 ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1496
1497 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
1498 ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1499}
1500
1501TEST_F(SwitchInputMapperTest, Process) {
1502 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1503 addMapperAndConfigure(mapper);
1504
Jeff Brown49ccac52012-04-11 18:27:33 -07001505 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_LID, 1);
Jeff Brownbcc046a2012-09-27 20:46:43 -07001506 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_JACK_PHYSICAL_INSERT, 1);
1507 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_HEADPHONE_INSERT, 0);
1508 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07001509
Jeff Brownbe1aa822011-07-27 16:04:54 -07001510 NotifySwitchArgs args;
1511 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args));
1512 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
Jeff Brownbcc046a2012-09-27 20:46:43 -07001513 ASSERT_EQ((1 << SW_LID) | (1 << SW_JACK_PHYSICAL_INSERT), args.switchValues);
1514 ASSERT_EQ((1 << SW_LID) | (1 << SW_JACK_PHYSICAL_INSERT) | (1 << SW_HEADPHONE_INSERT),
1515 args.switchMask);
Jeff Brownc3db8582010-10-20 15:33:38 -07001516 ASSERT_EQ(uint32_t(0), args.policyFlags);
1517}
1518
1519
1520// --- KeyboardInputMapperTest ---
1521
1522class KeyboardInputMapperTest : public InputMapperTest {
1523protected:
1524 void testDPadKeyRotation(KeyboardInputMapper* mapper,
1525 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode);
1526};
1527
1528void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
1529 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) {
Jeff Brownbe1aa822011-07-27 16:04:54 -07001530 NotifyKeyArgs args;
Jeff Brownc3db8582010-10-20 15:33:38 -07001531
Jeff Brown49ccac52012-04-11 18:27:33 -07001532 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 1);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001533 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001534 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1535 ASSERT_EQ(originalScanCode, args.scanCode);
1536 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1537
Jeff Brown49ccac52012-04-11 18:27:33 -07001538 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001539 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001540 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1541 ASSERT_EQ(originalScanCode, args.scanCode);
1542 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1543}
1544
1545
1546TEST_F(KeyboardInputMapperTest, GetSources) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001547 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
Jeff Brownc3db8582010-10-20 15:33:38 -07001548 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1549 addMapperAndConfigure(mapper);
1550
1551 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
1552}
1553
1554TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
Jeff Brown49ccac52012-04-11 18:27:33 -07001555 const int32_t USAGE_A = 0x070004;
1556 const int32_t USAGE_UNKNOWN = 0x07ffff;
1557 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
1558 mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
1559
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001560 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
Jeff Brownc3db8582010-10-20 15:33:38 -07001561 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1562 addMapperAndConfigure(mapper);
1563
Jeff Brown49ccac52012-04-11 18:27:33 -07001564 // Key down by scan code.
Jeff Brownc3db8582010-10-20 15:33:38 -07001565 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001566 EV_KEY, KEY_HOME, 1);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001567 NotifyKeyArgs args;
1568 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001569 ASSERT_EQ(DEVICE_ID, args.deviceId);
1570 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1571 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1572 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1573 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1574 ASSERT_EQ(KEY_HOME, args.scanCode);
1575 ASSERT_EQ(AMETA_NONE, args.metaState);
1576 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1577 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1578 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1579
Jeff Brown49ccac52012-04-11 18:27:33 -07001580 // Key up by scan code.
Jeff Brownc3db8582010-10-20 15:33:38 -07001581 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001582 EV_KEY, KEY_HOME, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001583 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001584 ASSERT_EQ(DEVICE_ID, args.deviceId);
1585 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1586 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1587 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1588 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1589 ASSERT_EQ(KEY_HOME, args.scanCode);
1590 ASSERT_EQ(AMETA_NONE, args.metaState);
1591 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1592 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1593 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
Jeff Brown49ccac52012-04-11 18:27:33 -07001594
1595 // Key down by usage code.
1596 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1597 EV_MSC, MSC_SCAN, USAGE_A);
1598 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1599 EV_KEY, 0, 1);
1600 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1601 ASSERT_EQ(DEVICE_ID, args.deviceId);
1602 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1603 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1604 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1605 ASSERT_EQ(AKEYCODE_A, args.keyCode);
1606 ASSERT_EQ(0, args.scanCode);
1607 ASSERT_EQ(AMETA_NONE, args.metaState);
1608 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1609 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1610 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1611
1612 // Key up by usage code.
1613 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1614 EV_MSC, MSC_SCAN, USAGE_A);
1615 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1616 EV_KEY, 0, 0);
1617 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1618 ASSERT_EQ(DEVICE_ID, args.deviceId);
1619 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1620 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1621 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1622 ASSERT_EQ(AKEYCODE_A, args.keyCode);
1623 ASSERT_EQ(0, args.scanCode);
1624 ASSERT_EQ(AMETA_NONE, args.metaState);
1625 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1626 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1627 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1628
1629 // Key down with unknown scan code or usage code.
1630 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1631 EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
1632 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1633 EV_KEY, KEY_UNKNOWN, 1);
1634 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1635 ASSERT_EQ(DEVICE_ID, args.deviceId);
1636 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1637 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1638 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1639 ASSERT_EQ(0, args.keyCode);
1640 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
1641 ASSERT_EQ(AMETA_NONE, args.metaState);
1642 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1643 ASSERT_EQ(0U, args.policyFlags);
1644 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1645
1646 // Key up with unknown scan code or usage code.
1647 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1648 EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
1649 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1650 EV_KEY, KEY_UNKNOWN, 0);
1651 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1652 ASSERT_EQ(DEVICE_ID, args.deviceId);
1653 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1654 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1655 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1656 ASSERT_EQ(0, args.keyCode);
1657 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
1658 ASSERT_EQ(AMETA_NONE, args.metaState);
1659 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1660 ASSERT_EQ(0U, args.policyFlags);
1661 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
Jeff Brownc3db8582010-10-20 15:33:38 -07001662}
1663
Jeff Brownc3db8582010-10-20 15:33:38 -07001664TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
Jeff Brown49ccac52012-04-11 18:27:33 -07001665 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
1666 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
1667
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001668 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
Jeff Brownc3db8582010-10-20 15:33:38 -07001669 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1670 addMapperAndConfigure(mapper);
1671
1672 // Initial metastate.
1673 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1674
1675 // Metakey down.
1676 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001677 EV_KEY, KEY_LEFTSHIFT, 1);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001678 NotifyKeyArgs args;
1679 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001680 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1681 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1682 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
1683
1684 // Key down.
1685 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001686 EV_KEY, KEY_A, 1);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001687 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001688 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1689 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1690
1691 // Key up.
1692 process(mapper, ARBITRARY_TIME + 2, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001693 EV_KEY, KEY_A, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001694 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001695 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1696 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1697
1698 // Metakey up.
1699 process(mapper, ARBITRARY_TIME + 3, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001700 EV_KEY, KEY_LEFTSHIFT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001701 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001702 ASSERT_EQ(AMETA_NONE, args.metaState);
1703 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1704 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
1705}
1706
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001707TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
Jeff Brown49ccac52012-04-11 18:27:33 -07001708 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
1709 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
1710 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
1711 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
1712
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001713 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
Jeff Brownc3db8582010-10-20 15:33:38 -07001714 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1715 addMapperAndConfigure(mapper);
1716
Jeff Brown65fd2512011-08-18 11:20:58 -07001717 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001718 DISPLAY_WIDTH, DISPLAY_HEIGHT,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08001719 DISPLAY_ORIENTATION_90);
Jeff Brownc3db8582010-10-20 15:33:38 -07001720 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1721 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
1722 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1723 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
1724 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1725 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
1726 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1727 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
1728}
1729
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001730TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
Jeff Brown49ccac52012-04-11 18:27:33 -07001731 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
1732 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
1733 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
1734 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
1735
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001736 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
Jeff Brownc3db8582010-10-20 15:33:38 -07001737 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001738 addConfigurationProperty("keyboard.orientationAware", "1");
Jeff Brownc3db8582010-10-20 15:33:38 -07001739 addMapperAndConfigure(mapper);
1740
Jeff Brown65fd2512011-08-18 11:20:58 -07001741 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brownc3db8582010-10-20 15:33:38 -07001742 DISPLAY_WIDTH, DISPLAY_HEIGHT,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08001743 DISPLAY_ORIENTATION_0);
Jeff Brownc3db8582010-10-20 15:33:38 -07001744 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1745 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
1746 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1747 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
1748 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1749 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
1750 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1751 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
1752
Jeff Brown65fd2512011-08-18 11:20:58 -07001753 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brownc3db8582010-10-20 15:33:38 -07001754 DISPLAY_WIDTH, DISPLAY_HEIGHT,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08001755 DISPLAY_ORIENTATION_90);
Jeff Brownc3db8582010-10-20 15:33:38 -07001756 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1757 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT));
1758 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1759 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP));
1760 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1761 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT));
1762 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1763 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN));
1764
Jeff Brown65fd2512011-08-18 11:20:58 -07001765 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brownc3db8582010-10-20 15:33:38 -07001766 DISPLAY_WIDTH, DISPLAY_HEIGHT,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08001767 DISPLAY_ORIENTATION_180);
Jeff Brownc3db8582010-10-20 15:33:38 -07001768 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1769 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN));
1770 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1771 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT));
1772 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1773 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP));
1774 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1775 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT));
1776
Jeff Brown65fd2512011-08-18 11:20:58 -07001777 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brownc3db8582010-10-20 15:33:38 -07001778 DISPLAY_WIDTH, DISPLAY_HEIGHT,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08001779 DISPLAY_ORIENTATION_270);
Jeff Brownc3db8582010-10-20 15:33:38 -07001780 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1781 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT));
1782 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1783 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN));
1784 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1785 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT));
1786 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1787 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP));
1788
1789 // Special case: if orientation changes while key is down, we still emit the same keycode
1790 // in the key up as we did in the key down.
Jeff Brownbe1aa822011-07-27 16:04:54 -07001791 NotifyKeyArgs args;
Jeff Brownc3db8582010-10-20 15:33:38 -07001792
Jeff Brown65fd2512011-08-18 11:20:58 -07001793 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brownc3db8582010-10-20 15:33:38 -07001794 DISPLAY_WIDTH, DISPLAY_HEIGHT,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08001795 DISPLAY_ORIENTATION_270);
Jeff Brown49ccac52012-04-11 18:27:33 -07001796 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001797 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001798 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1799 ASSERT_EQ(KEY_UP, args.scanCode);
1800 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
1801
Jeff Brown65fd2512011-08-18 11:20:58 -07001802 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brownc3db8582010-10-20 15:33:38 -07001803 DISPLAY_WIDTH, DISPLAY_HEIGHT,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08001804 DISPLAY_ORIENTATION_180);
Jeff Brown49ccac52012-04-11 18:27:33 -07001805 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001806 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001807 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1808 ASSERT_EQ(KEY_UP, args.scanCode);
1809 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
1810}
1811
1812TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001813 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
Jeff Brownc3db8582010-10-20 15:33:38 -07001814 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1815 addMapperAndConfigure(mapper);
1816
1817 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
1818 ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
1819
1820 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
1821 ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
1822}
1823
1824TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001825 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
Jeff Brownc3db8582010-10-20 15:33:38 -07001826 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1827 addMapperAndConfigure(mapper);
1828
1829 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
1830 ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
1831
1832 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
1833 ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
1834}
1835
1836TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001837 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
Jeff Brownc3db8582010-10-20 15:33:38 -07001838 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1839 addMapperAndConfigure(mapper);
1840
Jeff Brown49ccac52012-04-11 18:27:33 -07001841 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07001842
1843 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1844 uint8_t flags[2] = { 0, 0 };
1845 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
1846 ASSERT_TRUE(flags[0]);
1847 ASSERT_FALSE(flags[1]);
1848}
1849
Jeff Brown51e7fe72010-10-29 22:19:53 -07001850TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
1851 mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/);
1852 mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/);
1853 mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/);
Jeff Brown49ccac52012-04-11 18:27:33 -07001854 mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
1855 mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
1856 mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001857
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001858 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
Jeff Brown51e7fe72010-10-29 22:19:53 -07001859 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1860 addMapperAndConfigure(mapper);
1861
1862 // Initialization should have turned all of the lights off.
1863 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1864 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1865 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1866
1867 // Toggle caps lock on.
1868 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001869 EV_KEY, KEY_CAPSLOCK, 1);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001870 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001871 EV_KEY, KEY_CAPSLOCK, 0);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001872 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1873 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1874 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1875 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState());
1876
1877 // Toggle num lock on.
1878 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001879 EV_KEY, KEY_NUMLOCK, 1);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001880 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001881 EV_KEY, KEY_NUMLOCK, 0);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001882 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1883 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1884 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1885 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState());
1886
1887 // Toggle caps lock off.
1888 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001889 EV_KEY, KEY_CAPSLOCK, 1);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001890 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001891 EV_KEY, KEY_CAPSLOCK, 0);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001892 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1893 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1894 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1895 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState());
1896
1897 // Toggle scroll lock on.
1898 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001899 EV_KEY, KEY_SCROLLLOCK, 1);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001900 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001901 EV_KEY, KEY_SCROLLLOCK, 0);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001902 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1903 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1904 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1905 ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
1906
1907 // Toggle num lock off.
1908 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001909 EV_KEY, KEY_NUMLOCK, 1);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001910 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001911 EV_KEY, KEY_NUMLOCK, 0);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001912 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1913 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1914 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1915 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
1916
1917 // Toggle scroll lock off.
1918 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001919 EV_KEY, KEY_SCROLLLOCK, 1);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001920 process(mapper, ARBITRARY_TIME, DEVICE_ID,
Jeff Brown49ccac52012-04-11 18:27:33 -07001921 EV_KEY, KEY_SCROLLLOCK, 0);
Jeff Brown51e7fe72010-10-29 22:19:53 -07001922 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
1923 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
1924 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
1925 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1926}
1927
Jeff Brownc3db8582010-10-20 15:33:38 -07001928
Jeff Brown83c09682010-12-23 17:50:18 -08001929// --- CursorInputMapperTest ---
Jeff Brownc3db8582010-10-20 15:33:38 -07001930
Jeff Brown83c09682010-12-23 17:50:18 -08001931class CursorInputMapperTest : public InputMapperTest {
Jeff Brownc3db8582010-10-20 15:33:38 -07001932protected:
1933 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
1934
Jeff Brown83c09682010-12-23 17:50:18 -08001935 sp<FakePointerController> mFakePointerController;
1936
1937 virtual void SetUp() {
1938 InputMapperTest::SetUp();
1939
1940 mFakePointerController = new FakePointerController();
1941 mFakePolicy->setPointerController(DEVICE_ID, mFakePointerController);
1942 }
1943
1944 void testMotionRotation(CursorInputMapper* mapper,
Jeff Brownc3db8582010-10-20 15:33:38 -07001945 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
1946};
1947
Jeff Brown83c09682010-12-23 17:50:18 -08001948const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
Jeff Brownc3db8582010-10-20 15:33:38 -07001949
Jeff Brown83c09682010-12-23 17:50:18 -08001950void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
Jeff Brownc3db8582010-10-20 15:33:38 -07001951 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
Jeff Brownbe1aa822011-07-27 16:04:54 -07001952 NotifyMotionArgs args;
Jeff Brownc3db8582010-10-20 15:33:38 -07001953
Jeff Brown49ccac52012-04-11 18:27:33 -07001954 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, originalX);
1955 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, originalY);
1956 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07001957 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07001958 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
1959 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
1960 float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
1961 float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
Jeff Brownbe1aa822011-07-27 16:04:54 -07001962 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07001963}
1964
Jeff Brown83c09682010-12-23 17:50:18 -08001965TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
1966 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
1967 addConfigurationProperty("cursor.mode", "pointer");
1968 addMapperAndConfigure(mapper);
1969
1970 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
1971}
1972
1973TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
1974 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
1975 addConfigurationProperty("cursor.mode", "navigation");
Jeff Brownc3db8582010-10-20 15:33:38 -07001976 addMapperAndConfigure(mapper);
1977
1978 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
1979}
1980
Jeff Brown83c09682010-12-23 17:50:18 -08001981TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
1982 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
1983 addConfigurationProperty("cursor.mode", "pointer");
1984 addMapperAndConfigure(mapper);
1985
1986 InputDeviceInfo info;
1987 mapper->populateDeviceInfo(&info);
1988
1989 // Initially there may not be a valid motion range.
Jeff Brownefd32662011-03-08 15:13:06 -08001990 ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE));
1991 ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE));
1992 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
1993 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f));
Jeff Brown83c09682010-12-23 17:50:18 -08001994
1995 // When the bounds are set, then there should be a valid motion range.
Jeff Brown9626b142011-03-03 02:09:54 -08001996 mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1);
Jeff Brown83c09682010-12-23 17:50:18 -08001997
1998 InputDeviceInfo info2;
1999 mapper->populateDeviceInfo(&info2);
2000
Jeff Brownefd32662011-03-08 15:13:06 -08002001 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2002 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE,
Jeff Brown9626b142011-03-03 02:09:54 -08002003 1, 800 - 1, 0.0f, 0.0f));
Jeff Brownefd32662011-03-08 15:13:06 -08002004 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2005 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE,
Jeff Brown9626b142011-03-03 02:09:54 -08002006 2, 480 - 1, 0.0f, 0.0f));
Jeff Brownefd32662011-03-08 15:13:06 -08002007 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2008 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002009 0.0f, 1.0f, 0.0f, 0.0f));
Jeff Brown83c09682010-12-23 17:50:18 -08002010}
2011
2012TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
2013 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2014 addConfigurationProperty("cursor.mode", "navigation");
Jeff Brownc3db8582010-10-20 15:33:38 -07002015 addMapperAndConfigure(mapper);
2016
2017 InputDeviceInfo info;
2018 mapper->populateDeviceInfo(&info);
2019
Jeff Brownefd32662011-03-08 15:13:06 -08002020 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2021 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL,
Jeff Brownc3db8582010-10-20 15:33:38 -07002022 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
Jeff Brownefd32662011-03-08 15:13:06 -08002023 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2024 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL,
Jeff Brownc3db8582010-10-20 15:33:38 -07002025 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
Jeff Brownefd32662011-03-08 15:13:06 -08002026 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2027 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002028 0.0f, 1.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07002029}
2030
Jeff Brown83c09682010-12-23 17:50:18 -08002031TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
2032 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2033 addConfigurationProperty("cursor.mode", "navigation");
Jeff Brownc3db8582010-10-20 15:33:38 -07002034 addMapperAndConfigure(mapper);
2035
2036 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2037
Jeff Brownbe1aa822011-07-27 16:04:54 -07002038 NotifyMotionArgs args;
Jeff Brownc3db8582010-10-20 15:33:38 -07002039
2040 // Button press.
2041 // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
Jeff Brown49ccac52012-04-11 18:27:33 -07002042 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2043 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002044 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002045 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2046 ASSERT_EQ(DEVICE_ID, args.deviceId);
2047 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2048 ASSERT_EQ(uint32_t(0), args.policyFlags);
2049 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2050 ASSERT_EQ(0, args.flags);
2051 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002052 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07002053 ASSERT_EQ(0, args.edgeFlags);
2054 ASSERT_EQ(uint32_t(1), args.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002055 ASSERT_EQ(0, args.pointerProperties[0].id);
2056 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07002057 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002058 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07002059 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2060 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2061 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2062
2063 // Button release. Should have same down time.
Jeff Brown49ccac52012-04-11 18:27:33 -07002064 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2065 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002066 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002067 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2068 ASSERT_EQ(DEVICE_ID, args.deviceId);
2069 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2070 ASSERT_EQ(uint32_t(0), args.policyFlags);
2071 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2072 ASSERT_EQ(0, args.flags);
2073 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002074 ASSERT_EQ(0, args.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07002075 ASSERT_EQ(0, args.edgeFlags);
2076 ASSERT_EQ(uint32_t(1), args.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002077 ASSERT_EQ(0, args.pointerProperties[0].id);
2078 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07002079 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002080 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07002081 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2082 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2083 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2084}
2085
Jeff Brown83c09682010-12-23 17:50:18 -08002086TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
2087 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2088 addConfigurationProperty("cursor.mode", "navigation");
Jeff Brownc3db8582010-10-20 15:33:38 -07002089 addMapperAndConfigure(mapper);
2090
Jeff Brownbe1aa822011-07-27 16:04:54 -07002091 NotifyMotionArgs args;
Jeff Brownc3db8582010-10-20 15:33:38 -07002092
2093 // Motion in X but not Y.
Jeff Brown49ccac52012-04-11 18:27:33 -07002094 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1);
2095 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002096 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002097 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2098 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002099 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07002100
2101 // Motion in Y but not X.
Jeff Brown49ccac52012-04-11 18:27:33 -07002102 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2);
2103 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002104 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002105 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
Jeff Brownc3db8582010-10-20 15:33:38 -07002106 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002107 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07002108}
2109
Jeff Brown83c09682010-12-23 17:50:18 -08002110TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
2111 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2112 addConfigurationProperty("cursor.mode", "navigation");
Jeff Brownc3db8582010-10-20 15:33:38 -07002113 addMapperAndConfigure(mapper);
2114
Jeff Brownbe1aa822011-07-27 16:04:54 -07002115 NotifyMotionArgs args;
Jeff Brownc3db8582010-10-20 15:33:38 -07002116
Jeff Brownbe1aa822011-07-27 16:04:54 -07002117 // Button press.
Jeff Brown49ccac52012-04-11 18:27:33 -07002118 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2119 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002120 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002121 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2122 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002123 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07002124
Jeff Brownbe1aa822011-07-27 16:04:54 -07002125 // Button release.
Jeff Brown49ccac52012-04-11 18:27:33 -07002126 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2127 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002128 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002129 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2130 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002131 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07002132}
2133
Jeff Brown83c09682010-12-23 17:50:18 -08002134TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
2135 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2136 addConfigurationProperty("cursor.mode", "navigation");
Jeff Brownc3db8582010-10-20 15:33:38 -07002137 addMapperAndConfigure(mapper);
2138
Jeff Brownbe1aa822011-07-27 16:04:54 -07002139 NotifyMotionArgs args;
Jeff Brownc3db8582010-10-20 15:33:38 -07002140
2141 // Combined X, Y and Button.
Jeff Brown49ccac52012-04-11 18:27:33 -07002142 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1);
2143 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2);
2144 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2145 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002146 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002147 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2148 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2149 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
Jeff Brownbe1aa822011-07-27 16:04:54 -07002150 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07002151
2152 // Move X, Y a bit while pressed.
Jeff Brown49ccac52012-04-11 18:27:33 -07002153 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 2);
2154 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 1);
2155 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002156 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002157 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2158 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2159 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
Jeff Brownbe1aa822011-07-27 16:04:54 -07002160 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07002161
2162 // Release Button.
Jeff Brown49ccac52012-04-11 18:27:33 -07002163 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2164 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002165 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002166 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2167 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002168 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Jeff Brownc3db8582010-10-20 15:33:38 -07002169}
2170
Jeff Brown83c09682010-12-23 17:50:18 -08002171TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
2172 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2173 addConfigurationProperty("cursor.mode", "navigation");
Jeff Brownc3db8582010-10-20 15:33:38 -07002174 addMapperAndConfigure(mapper);
2175
Jeff Brown65fd2512011-08-18 11:20:58 -07002176 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brown47e6b1b2010-11-29 17:37:49 -08002177 DISPLAY_WIDTH, DISPLAY_HEIGHT,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002178 DISPLAY_ORIENTATION_90);
Jeff Brownc3db8582010-10-20 15:33:38 -07002179 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2180 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2181 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2182 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2183 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2184 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2185 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2186 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2187}
2188
Jeff Brown83c09682010-12-23 17:50:18 -08002189TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
2190 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2191 addConfigurationProperty("cursor.mode", "navigation");
2192 addConfigurationProperty("cursor.orientationAware", "1");
Jeff Brownc3db8582010-10-20 15:33:38 -07002193 addMapperAndConfigure(mapper);
2194
Jeff Brown65fd2512011-08-18 11:20:58 -07002195 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002196 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0);
Jeff Brownc3db8582010-10-20 15:33:38 -07002197 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2198 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2199 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2200 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2201 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2202 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2203 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2204 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2205
Jeff Brown65fd2512011-08-18 11:20:58 -07002206 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002207 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_90);
Jeff Brownc3db8582010-10-20 15:33:38 -07002208 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0));
2209 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1));
2210 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1));
2211 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1));
2212 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0));
2213 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1));
2214 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1));
2215 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1));
2216
Jeff Brown65fd2512011-08-18 11:20:58 -07002217 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002218 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_180);
Jeff Brownc3db8582010-10-20 15:33:38 -07002219 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1));
2220 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1));
2221 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0));
2222 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1));
2223 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1));
2224 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1));
2225 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0));
2226 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1));
2227
Jeff Brown65fd2512011-08-18 11:20:58 -07002228 setDisplayInfoAndReconfigure(DISPLAY_ID,
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002229 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_270);
Jeff Brownc3db8582010-10-20 15:33:38 -07002230 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0));
2231 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1));
2232 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1));
2233 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1));
2234 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0));
2235 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1));
2236 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1));
2237 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1));
2238}
2239
Jeff Brownbe1aa822011-07-27 16:04:54 -07002240TEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) {
2241 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2242 addConfigurationProperty("cursor.mode", "pointer");
2243 addMapperAndConfigure(mapper);
2244
2245 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2246 mFakePointerController->setPosition(100, 200);
2247 mFakePointerController->setButtonState(0);
2248
2249 NotifyMotionArgs motionArgs;
2250 NotifyKeyArgs keyArgs;
2251
2252 // press BTN_LEFT, release BTN_LEFT
Jeff Brown49ccac52012-04-11 18:27:33 -07002253 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 1);
2254 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002255 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2256 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2257 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2258 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2259 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2260 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2261
Jeff Brown49ccac52012-04-11 18:27:33 -07002262 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 0);
2263 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002264 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2265 ASSERT_EQ(0, motionArgs.buttonState);
2266 ASSERT_EQ(0, mFakePointerController->getButtonState());
2267 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2268 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2269 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2270
2271 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2272 ASSERT_EQ(0, motionArgs.buttonState);
2273 ASSERT_EQ(0, mFakePointerController->getButtonState());
2274 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2275 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2276 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2277
2278 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
Jeff Brown49ccac52012-04-11 18:27:33 -07002279 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 1);
2280 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 1);
2281 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002282 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2283 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2284 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2285 motionArgs.buttonState);
2286 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2287 mFakePointerController->getButtonState());
2288 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2289 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2290
Jeff Brown49ccac52012-04-11 18:27:33 -07002291 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 0);
2292 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002293 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2294 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2295 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
2296 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
2297 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2298 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2299
Jeff Brown49ccac52012-04-11 18:27:33 -07002300 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 0);
2301 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002302 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2303 ASSERT_EQ(0, motionArgs.buttonState);
2304 ASSERT_EQ(0, mFakePointerController->getButtonState());
2305 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2306 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2307 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2308 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2309 ASSERT_EQ(0, motionArgs.buttonState);
2310 ASSERT_EQ(0, mFakePointerController->getButtonState());
2311 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2312 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2313 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2314
2315 // press BTN_BACK, release BTN_BACK
Jeff Brown49ccac52012-04-11 18:27:33 -07002316 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 1);
2317 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002318 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2319 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2320 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2321 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2322 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2323 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
2324 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2325 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2326 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2327
Jeff Brown49ccac52012-04-11 18:27:33 -07002328 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 0);
2329 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002330 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2331 ASSERT_EQ(0, motionArgs.buttonState);
2332 ASSERT_EQ(0, mFakePointerController->getButtonState());
2333 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2334 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2335 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2336 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2337 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2338 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2339
2340 // press BTN_SIDE, release BTN_SIDE
Jeff Brown49ccac52012-04-11 18:27:33 -07002341 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 1);
2342 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002343 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2344 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2345 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2346 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2347 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2348 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
2349 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2350 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2351 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2352
Jeff Brown49ccac52012-04-11 18:27:33 -07002353 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 0);
2354 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002355 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2356 ASSERT_EQ(0, motionArgs.buttonState);
2357 ASSERT_EQ(0, mFakePointerController->getButtonState());
2358 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2359 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2360 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2361 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2362 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2363 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2364
2365 // press BTN_FORWARD, release BTN_FORWARD
Jeff Brown49ccac52012-04-11 18:27:33 -07002366 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 1);
2367 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002368 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2369 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2370 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2371 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2372 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2373 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
2374 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2375 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2376 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2377
Jeff Brown49ccac52012-04-11 18:27:33 -07002378 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 0);
2379 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002380 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2381 ASSERT_EQ(0, motionArgs.buttonState);
2382 ASSERT_EQ(0, mFakePointerController->getButtonState());
2383 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2384 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2385 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2386 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2387 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2388 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2389
2390 // press BTN_EXTRA, release BTN_EXTRA
Jeff Brown49ccac52012-04-11 18:27:33 -07002391 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 1);
2392 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002393 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2394 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2395 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2396 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2397 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2398 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
2399 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2400 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2401 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2402
Jeff Brown49ccac52012-04-11 18:27:33 -07002403 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 0);
2404 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002405 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2406 ASSERT_EQ(0, motionArgs.buttonState);
2407 ASSERT_EQ(0, mFakePointerController->getButtonState());
2408 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2409 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2410 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2411 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2412 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2413 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2414}
2415
2416TEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) {
2417 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2418 addConfigurationProperty("cursor.mode", "pointer");
2419 addMapperAndConfigure(mapper);
2420
2421 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2422 mFakePointerController->setPosition(100, 200);
2423 mFakePointerController->setButtonState(0);
2424
2425 NotifyMotionArgs args;
2426
Jeff Brown49ccac52012-04-11 18:27:33 -07002427 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10);
2428 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20);
2429 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002430 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2431 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
2432 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2433 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2434 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
2435}
2436
Jeff Brownc3db8582010-10-20 15:33:38 -07002437
2438// --- TouchInputMapperTest ---
2439
2440class TouchInputMapperTest : public InputMapperTest {
2441protected:
2442 static const int32_t RAW_X_MIN;
2443 static const int32_t RAW_X_MAX;
2444 static const int32_t RAW_Y_MIN;
2445 static const int32_t RAW_Y_MAX;
2446 static const int32_t RAW_TOUCH_MIN;
2447 static const int32_t RAW_TOUCH_MAX;
2448 static const int32_t RAW_TOOL_MIN;
2449 static const int32_t RAW_TOOL_MAX;
2450 static const int32_t RAW_PRESSURE_MIN;
2451 static const int32_t RAW_PRESSURE_MAX;
2452 static const int32_t RAW_ORIENTATION_MIN;
2453 static const int32_t RAW_ORIENTATION_MAX;
Jeff Brownbe1aa822011-07-27 16:04:54 -07002454 static const int32_t RAW_DISTANCE_MIN;
2455 static const int32_t RAW_DISTANCE_MAX;
Jeff Brown65fd2512011-08-18 11:20:58 -07002456 static const int32_t RAW_TILT_MIN;
2457 static const int32_t RAW_TILT_MAX;
Jeff Brownc3db8582010-10-20 15:33:38 -07002458 static const int32_t RAW_ID_MIN;
2459 static const int32_t RAW_ID_MAX;
Jeff Brownbe1aa822011-07-27 16:04:54 -07002460 static const int32_t RAW_SLOT_MIN;
2461 static const int32_t RAW_SLOT_MAX;
Jeff Brownc3db8582010-10-20 15:33:38 -07002462 static const float X_PRECISION;
2463 static const float Y_PRECISION;
2464
Jeff Browna1f89ce2011-08-11 00:05:01 -07002465 static const float GEOMETRIC_SCALE;
2466
Jeff Brownc3db8582010-10-20 15:33:38 -07002467 static const VirtualKeyDefinition VIRTUAL_KEYS[2];
2468
2469 enum Axes {
2470 POSITION = 1 << 0,
2471 TOUCH = 1 << 1,
2472 TOOL = 1 << 2,
2473 PRESSURE = 1 << 3,
2474 ORIENTATION = 1 << 4,
2475 MINOR = 1 << 5,
2476 ID = 1 << 6,
Jeff Brownbe1aa822011-07-27 16:04:54 -07002477 DISTANCE = 1 << 7,
Jeff Brown65fd2512011-08-18 11:20:58 -07002478 TILT = 1 << 8,
2479 SLOT = 1 << 9,
2480 TOOL_TYPE = 1 << 10,
Jeff Brownc3db8582010-10-20 15:33:38 -07002481 };
2482
2483 void prepareDisplay(int32_t orientation);
2484 void prepareVirtualKeys();
2485 int32_t toRawX(float displayX);
2486 int32_t toRawY(float displayY);
2487 float toDisplayX(int32_t rawX);
2488 float toDisplayY(int32_t rawY);
2489};
2490
2491const int32_t TouchInputMapperTest::RAW_X_MIN = 25;
Jeff Brown9626b142011-03-03 02:09:54 -08002492const int32_t TouchInputMapperTest::RAW_X_MAX = 1019;
Jeff Brownc3db8582010-10-20 15:33:38 -07002493const int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
Jeff Brown9626b142011-03-03 02:09:54 -08002494const int32_t TouchInputMapperTest::RAW_Y_MAX = 1009;
Jeff Brownc3db8582010-10-20 15:33:38 -07002495const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
2496const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
2497const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
2498const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
2499const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = RAW_TOUCH_MIN;
2500const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = RAW_TOUCH_MAX;
2501const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
2502const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
Jeff Brownbe1aa822011-07-27 16:04:54 -07002503const int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0;
2504const int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7;
Jeff Brown65fd2512011-08-18 11:20:58 -07002505const int32_t TouchInputMapperTest::RAW_TILT_MIN = 0;
2506const int32_t TouchInputMapperTest::RAW_TILT_MAX = 150;
Jeff Brownc3db8582010-10-20 15:33:38 -07002507const int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
2508const int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
Jeff Brownbe1aa822011-07-27 16:04:54 -07002509const int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0;
2510const int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9;
Jeff Brown9626b142011-03-03 02:09:54 -08002511const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH;
2512const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT;
Jeff Brownc3db8582010-10-20 15:33:38 -07002513
Jeff Browna1f89ce2011-08-11 00:05:01 -07002514const float TouchInputMapperTest::GEOMETRIC_SCALE =
2515 avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1),
2516 float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1));
2517
Jeff Brownc3db8582010-10-20 15:33:38 -07002518const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
2519 { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
2520 { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
2521};
2522
2523void TouchInputMapperTest::prepareDisplay(int32_t orientation) {
Jeff Brown65fd2512011-08-18 11:20:58 -07002524 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation);
Jeff Brownc3db8582010-10-20 15:33:38 -07002525}
2526
2527void TouchInputMapperTest::prepareVirtualKeys() {
Jeff Brown90655042010-12-02 13:50:46 -08002528 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]);
2529 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]);
Jeff Brown49ccac52012-04-11 18:27:33 -07002530 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
2531 mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE);
Jeff Brownc3db8582010-10-20 15:33:38 -07002532}
2533
2534int32_t TouchInputMapperTest::toRawX(float displayX) {
Jeff Brown9626b142011-03-03 02:09:54 -08002535 return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN);
Jeff Brownc3db8582010-10-20 15:33:38 -07002536}
2537
2538int32_t TouchInputMapperTest::toRawY(float displayY) {
Jeff Brown9626b142011-03-03 02:09:54 -08002539 return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN);
Jeff Brownc3db8582010-10-20 15:33:38 -07002540}
2541
2542float TouchInputMapperTest::toDisplayX(int32_t rawX) {
Jeff Brown9626b142011-03-03 02:09:54 -08002543 return float(rawX - RAW_X_MIN) * DISPLAY_WIDTH / (RAW_X_MAX - RAW_X_MIN + 1);
Jeff Brownc3db8582010-10-20 15:33:38 -07002544}
2545
2546float TouchInputMapperTest::toDisplayY(int32_t rawY) {
Jeff Brown9626b142011-03-03 02:09:54 -08002547 return float(rawY - RAW_Y_MIN) * DISPLAY_HEIGHT / (RAW_Y_MAX - RAW_Y_MIN + 1);
Jeff Brownc3db8582010-10-20 15:33:38 -07002548}
2549
2550
2551// --- SingleTouchInputMapperTest ---
2552
2553class SingleTouchInputMapperTest : public TouchInputMapperTest {
2554protected:
Jeff Brown49754db2011-07-01 17:37:58 -07002555 void prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07002556 void prepareAxes(int axes);
2557
2558 void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
2559 void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
2560 void processUp(SingleTouchInputMapper* mappery);
2561 void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
2562 void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002563 void processDistance(SingleTouchInputMapper* mapper, int32_t distance);
Jeff Brown65fd2512011-08-18 11:20:58 -07002564 void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002565 void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value);
Jeff Brownc3db8582010-10-20 15:33:38 -07002566 void processSync(SingleTouchInputMapper* mapper);
2567};
2568
Jeff Brown49754db2011-07-01 17:37:58 -07002569void SingleTouchInputMapperTest::prepareButtons() {
Jeff Brown49ccac52012-04-11 18:27:33 -07002570 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
Jeff Brown49754db2011-07-01 17:37:58 -07002571}
2572
Jeff Brownc3db8582010-10-20 15:33:38 -07002573void SingleTouchInputMapperTest::prepareAxes(int axes) {
2574 if (axes & POSITION) {
Jeff Brownefd32662011-03-08 15:13:06 -08002575 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X,
2576 RAW_X_MIN, RAW_X_MAX, 0, 0);
2577 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y,
2578 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07002579 }
2580 if (axes & PRESSURE) {
Jeff Brownefd32662011-03-08 15:13:06 -08002581 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE,
2582 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07002583 }
2584 if (axes & TOOL) {
Jeff Brownefd32662011-03-08 15:13:06 -08002585 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH,
2586 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07002587 }
Jeff Brownbe1aa822011-07-27 16:04:54 -07002588 if (axes & DISTANCE) {
2589 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE,
2590 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
2591 }
Jeff Brown65fd2512011-08-18 11:20:58 -07002592 if (axes & TILT) {
2593 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X,
2594 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
2595 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y,
2596 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
2597 }
Jeff Brownc3db8582010-10-20 15:33:38 -07002598}
2599
2600void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
Jeff Brown49ccac52012-04-11 18:27:33 -07002601 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 1);
2602 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x);
2603 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y);
Jeff Brownc3db8582010-10-20 15:33:38 -07002604}
2605
2606void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
Jeff Brown49ccac52012-04-11 18:27:33 -07002607 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x);
2608 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y);
Jeff Brownc3db8582010-10-20 15:33:38 -07002609}
2610
2611void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
Jeff Brown49ccac52012-04-11 18:27:33 -07002612 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07002613}
2614
2615void SingleTouchInputMapperTest::processPressure(
2616 SingleTouchInputMapper* mapper, int32_t pressure) {
Jeff Brown49ccac52012-04-11 18:27:33 -07002617 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_PRESSURE, pressure);
Jeff Brownc3db8582010-10-20 15:33:38 -07002618}
2619
2620void SingleTouchInputMapperTest::processToolMajor(
2621 SingleTouchInputMapper* mapper, int32_t toolMajor) {
Jeff Brown49ccac52012-04-11 18:27:33 -07002622 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TOOL_WIDTH, toolMajor);
Jeff Brownc3db8582010-10-20 15:33:38 -07002623}
2624
Jeff Brownbe1aa822011-07-27 16:04:54 -07002625void SingleTouchInputMapperTest::processDistance(
2626 SingleTouchInputMapper* mapper, int32_t distance) {
Jeff Brown49ccac52012-04-11 18:27:33 -07002627 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_DISTANCE, distance);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002628}
2629
Jeff Brown65fd2512011-08-18 11:20:58 -07002630void SingleTouchInputMapperTest::processTilt(
2631 SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) {
Jeff Brown49ccac52012-04-11 18:27:33 -07002632 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_X, tiltX);
2633 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_Y, tiltY);
Jeff Brown65fd2512011-08-18 11:20:58 -07002634}
2635
Jeff Brownbe1aa822011-07-27 16:04:54 -07002636void SingleTouchInputMapperTest::processKey(
2637 SingleTouchInputMapper* mapper, int32_t code, int32_t value) {
Jeff Brown49ccac52012-04-11 18:27:33 -07002638 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002639}
2640
Jeff Brownc3db8582010-10-20 15:33:38 -07002641void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
Jeff Brown49ccac52012-04-11 18:27:33 -07002642 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07002643}
2644
2645
Jeff Brownace13b12011-03-09 17:39:48 -08002646TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) {
Jeff Brown58a2da82011-01-25 16:02:22 -08002647 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown49754db2011-07-01 17:37:58 -07002648 prepareButtons();
Jeff Brown58a2da82011-01-25 16:02:22 -08002649 prepareAxes(POSITION);
2650 addMapperAndConfigure(mapper);
2651
Jeff Brown65fd2512011-08-18 11:20:58 -07002652 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
Jeff Brownace13b12011-03-09 17:39:48 -08002653}
2654
2655TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) {
2656 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2657 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X);
2658 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y);
Jeff Brown49754db2011-07-01 17:37:58 -07002659 prepareButtons();
Jeff Brownace13b12011-03-09 17:39:48 -08002660 prepareAxes(POSITION);
2661 addMapperAndConfigure(mapper);
2662
Jeff Brown58a2da82011-01-25 16:02:22 -08002663 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
2664}
2665
Jeff Brown49ed71d2010-12-06 17:13:33 -08002666TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08002667 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown49754db2011-07-01 17:37:58 -07002668 prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07002669 prepareAxes(POSITION);
Jeff Brown49ed71d2010-12-06 17:13:33 -08002670 addConfigurationProperty("touch.deviceType", "touchPad");
Jeff Brownc3db8582010-10-20 15:33:38 -07002671 addMapperAndConfigure(mapper);
2672
2673 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
2674}
2675
Jeff Brown49ed71d2010-12-06 17:13:33 -08002676TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08002677 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown49754db2011-07-01 17:37:58 -07002678 prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07002679 prepareAxes(POSITION);
Jeff Brown49ed71d2010-12-06 17:13:33 -08002680 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownc3db8582010-10-20 15:33:38 -07002681 addMapperAndConfigure(mapper);
2682
2683 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
2684}
2685
2686TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08002687 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08002688 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002689 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brown49754db2011-07-01 17:37:58 -07002690 prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07002691 prepareAxes(POSITION);
2692 prepareVirtualKeys();
2693 addMapperAndConfigure(mapper);
2694
2695 // Unknown key.
2696 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2697
2698 // Virtual key is down.
2699 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2700 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2701 processDown(mapper, x, y);
2702 processSync(mapper);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002703 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07002704
2705 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
2706
2707 // Virtual key is up.
2708 processUp(mapper);
2709 processSync(mapper);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002710 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07002711
2712 ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
2713}
2714
2715TEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08002716 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08002717 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002718 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brown49754db2011-07-01 17:37:58 -07002719 prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07002720 prepareAxes(POSITION);
2721 prepareVirtualKeys();
2722 addMapperAndConfigure(mapper);
2723
2724 // Unknown key.
2725 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2726
2727 // Virtual key is down.
2728 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2729 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2730 processDown(mapper, x, y);
2731 processSync(mapper);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002732 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07002733
2734 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
2735
2736 // Virtual key is up.
2737 processUp(mapper);
2738 processSync(mapper);
Jeff Brownbe1aa822011-07-27 16:04:54 -07002739 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07002740
2741 ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
2742}
2743
2744TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08002745 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08002746 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002747 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brown49754db2011-07-01 17:37:58 -07002748 prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07002749 prepareAxes(POSITION);
2750 prepareVirtualKeys();
2751 addMapperAndConfigure(mapper);
2752
2753 const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
2754 uint8_t flags[2] = { 0, 0 };
2755 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
2756 ASSERT_TRUE(flags[0]);
2757 ASSERT_FALSE(flags[1]);
2758}
2759
Jeff Brownc3db8582010-10-20 15:33:38 -07002760TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08002761 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08002762 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002763 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brown49754db2011-07-01 17:37:58 -07002764 prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07002765 prepareAxes(POSITION);
2766 prepareVirtualKeys();
2767 addMapperAndConfigure(mapper);
2768
2769 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2770
Jeff Brownbe1aa822011-07-27 16:04:54 -07002771 NotifyKeyArgs args;
Jeff Brownc3db8582010-10-20 15:33:38 -07002772
2773 // Press virtual key.
2774 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2775 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2776 processDown(mapper, x, y);
2777 processSync(mapper);
2778
Jeff Brownbe1aa822011-07-27 16:04:54 -07002779 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002780 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2781 ASSERT_EQ(DEVICE_ID, args.deviceId);
2782 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2783 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
2784 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2785 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
2786 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2787 ASSERT_EQ(KEY_HOME, args.scanCode);
2788 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2789 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2790
2791 // Release virtual key.
2792 processUp(mapper);
2793 processSync(mapper);
2794
Jeff Brownbe1aa822011-07-27 16:04:54 -07002795 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07002796 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2797 ASSERT_EQ(DEVICE_ID, args.deviceId);
2798 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2799 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
2800 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2801 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
2802 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2803 ASSERT_EQ(KEY_HOME, args.scanCode);
2804 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2805 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2806
2807 // Should not have sent any motions.
Jeff Brownbe1aa822011-07-27 16:04:54 -07002808 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07002809}
2810
2811TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08002812 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08002813 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002814 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brown49754db2011-07-01 17:37:58 -07002815 prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07002816 prepareAxes(POSITION);
2817 prepareVirtualKeys();
2818 addMapperAndConfigure(mapper);
2819
2820 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2821
Jeff Brownbe1aa822011-07-27 16:04:54 -07002822 NotifyKeyArgs keyArgs;
Jeff Brownc3db8582010-10-20 15:33:38 -07002823
2824 // Press virtual key.
2825 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2826 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2827 processDown(mapper, x, y);
2828 processSync(mapper);
2829
Jeff Brownbe1aa822011-07-27 16:04:54 -07002830 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07002831 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
2832 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
2833 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
2834 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
2835 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2836 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
2837 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
2838 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
2839 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
2840 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
2841
2842 // Move out of bounds. This should generate a cancel and a pointer down since we moved
2843 // into the display area.
2844 y -= 100;
2845 processMove(mapper, x, y);
2846 processSync(mapper);
2847
Jeff Brownbe1aa822011-07-27 16:04:54 -07002848 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07002849 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
2850 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
2851 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
2852 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
2853 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2854 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
2855 | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
2856 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
2857 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
2858 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
2859 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
2860
Jeff Brownbe1aa822011-07-27 16:04:54 -07002861 NotifyMotionArgs motionArgs;
2862 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07002863 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2864 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2865 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2866 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2867 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2868 ASSERT_EQ(0, motionArgs.flags);
2869 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002870 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07002871 ASSERT_EQ(0, motionArgs.edgeFlags);
2872 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002873 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2874 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07002875 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002876 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07002877 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2878 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2879 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2880
2881 // Keep moving out of bounds. Should generate a pointer move.
2882 y -= 50;
2883 processMove(mapper, x, y);
2884 processSync(mapper);
2885
Jeff Brownbe1aa822011-07-27 16:04:54 -07002886 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07002887 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2888 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2889 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2890 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2891 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
2892 ASSERT_EQ(0, motionArgs.flags);
2893 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002894 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07002895 ASSERT_EQ(0, motionArgs.edgeFlags);
2896 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002897 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2898 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07002899 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002900 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07002901 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2902 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2903 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2904
2905 // Release out of bounds. Should generate a pointer up.
2906 processUp(mapper);
2907 processSync(mapper);
2908
Jeff Brownbe1aa822011-07-27 16:04:54 -07002909 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07002910 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2911 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2912 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2913 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2914 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2915 ASSERT_EQ(0, motionArgs.flags);
2916 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002917 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07002918 ASSERT_EQ(0, motionArgs.edgeFlags);
2919 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002920 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2921 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07002922 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002923 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07002924 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2925 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2926 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2927
2928 // Should not have sent any more keys or motions.
Jeff Brownbe1aa822011-07-27 16:04:54 -07002929 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
2930 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07002931}
2932
2933TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08002934 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08002935 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08002936 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brown49754db2011-07-01 17:37:58 -07002937 prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07002938 prepareAxes(POSITION);
2939 prepareVirtualKeys();
2940 addMapperAndConfigure(mapper);
2941
2942 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2943
Jeff Brownbe1aa822011-07-27 16:04:54 -07002944 NotifyMotionArgs motionArgs;
Jeff Brownc3db8582010-10-20 15:33:38 -07002945
2946 // Initially go down out of bounds.
2947 int32_t x = -10;
2948 int32_t y = -10;
2949 processDown(mapper, x, y);
2950 processSync(mapper);
2951
Jeff Brownbe1aa822011-07-27 16:04:54 -07002952 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07002953
2954 // Move into the display area. Should generate a pointer down.
2955 x = 50;
2956 y = 75;
2957 processMove(mapper, x, y);
2958 processSync(mapper);
2959
Jeff Brownbe1aa822011-07-27 16:04:54 -07002960 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07002961 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2962 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2963 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2964 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2965 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2966 ASSERT_EQ(0, motionArgs.flags);
2967 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002968 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07002969 ASSERT_EQ(0, motionArgs.edgeFlags);
2970 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002971 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2972 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07002973 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002974 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07002975 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2976 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2977 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2978
2979 // Release. Should generate a pointer up.
2980 processUp(mapper);
2981 processSync(mapper);
2982
Jeff Brownbe1aa822011-07-27 16:04:54 -07002983 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07002984 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2985 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2986 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2987 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2988 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2989 ASSERT_EQ(0, motionArgs.flags);
2990 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002991 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07002992 ASSERT_EQ(0, motionArgs.edgeFlags);
2993 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07002994 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2995 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07002996 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07002997 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07002998 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2999 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3000 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3001
3002 // Should not have sent any more keys or motions.
Jeff Brownbe1aa822011-07-27 16:04:54 -07003003 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3004 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07003005}
3006
3007TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08003008 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08003009 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08003010 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brown49754db2011-07-01 17:37:58 -07003011 prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07003012 prepareAxes(POSITION);
3013 prepareVirtualKeys();
3014 addMapperAndConfigure(mapper);
3015
3016 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3017
Jeff Brownbe1aa822011-07-27 16:04:54 -07003018 NotifyMotionArgs motionArgs;
Jeff Brownc3db8582010-10-20 15:33:38 -07003019
3020 // Down.
3021 int32_t x = 100;
3022 int32_t y = 125;
3023 processDown(mapper, x, y);
3024 processSync(mapper);
3025
Jeff Brownbe1aa822011-07-27 16:04:54 -07003026 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07003027 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3028 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3029 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3030 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3031 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3032 ASSERT_EQ(0, motionArgs.flags);
3033 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003034 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07003035 ASSERT_EQ(0, motionArgs.edgeFlags);
3036 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003037 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3038 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07003039 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003040 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003041 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3042 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3043 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3044
3045 // Move.
3046 x += 50;
3047 y += 75;
3048 processMove(mapper, x, y);
3049 processSync(mapper);
3050
Jeff Brownbe1aa822011-07-27 16:04:54 -07003051 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07003052 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3053 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3054 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3055 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3056 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3057 ASSERT_EQ(0, motionArgs.flags);
3058 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003059 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07003060 ASSERT_EQ(0, motionArgs.edgeFlags);
3061 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003062 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3063 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07003064 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003065 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003066 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3067 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3068 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3069
3070 // Up.
3071 processUp(mapper);
3072 processSync(mapper);
3073
Jeff Brownbe1aa822011-07-27 16:04:54 -07003074 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07003075 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3076 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3077 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3078 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3079 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3080 ASSERT_EQ(0, motionArgs.flags);
3081 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003082 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07003083 ASSERT_EQ(0, motionArgs.edgeFlags);
3084 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003085 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3086 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07003087 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003088 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003089 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3090 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3091 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3092
3093 // Should not have sent any more keys or motions.
Jeff Brownbe1aa822011-07-27 16:04:54 -07003094 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3095 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07003096}
3097
Jeff Brown47e6b1b2010-11-29 17:37:49 -08003098TEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) {
3099 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08003100 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brown49754db2011-07-01 17:37:58 -07003101 prepareButtons();
Jeff Brown47e6b1b2010-11-29 17:37:49 -08003102 prepareAxes(POSITION);
3103 addConfigurationProperty("touch.orientationAware", "0");
3104 addMapperAndConfigure(mapper);
3105
Jeff Brownbe1aa822011-07-27 16:04:54 -07003106 NotifyMotionArgs args;
Jeff Brown47e6b1b2010-11-29 17:37:49 -08003107
3108 // Rotation 90.
Jeff Brownb4ff35d2011-01-02 16:37:43 -08003109 prepareDisplay(DISPLAY_ORIENTATION_90);
Jeff Brown47e6b1b2010-11-29 17:37:49 -08003110 processDown(mapper, toRawX(50), toRawY(75));
3111 processSync(mapper);
3112
Jeff Brownbe1aa822011-07-27 16:04:54 -07003113 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownebbd5d12011-02-17 13:01:34 -08003114 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3115 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
Jeff Brown47e6b1b2010-11-29 17:37:49 -08003116
3117 processUp(mapper);
3118 processSync(mapper);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003119 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
Jeff Brown47e6b1b2010-11-29 17:37:49 -08003120}
3121
3122TEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) {
3123 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08003124 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brown49754db2011-07-01 17:37:58 -07003125 prepareButtons();
Jeff Brownc3db8582010-10-20 15:33:38 -07003126 prepareAxes(POSITION);
3127 addMapperAndConfigure(mapper);
3128
Jeff Brownbe1aa822011-07-27 16:04:54 -07003129 NotifyMotionArgs args;
Jeff Brownc3db8582010-10-20 15:33:38 -07003130
3131 // Rotation 0.
Jeff Brownb4ff35d2011-01-02 16:37:43 -08003132 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brownc3db8582010-10-20 15:33:38 -07003133 processDown(mapper, toRawX(50), toRawY(75));
3134 processSync(mapper);
3135
Jeff Brownbe1aa822011-07-27 16:04:54 -07003136 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownebbd5d12011-02-17 13:01:34 -08003137 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3138 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
Jeff Brownc3db8582010-10-20 15:33:38 -07003139
3140 processUp(mapper);
3141 processSync(mapper);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003142 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07003143
3144 // Rotation 90.
Jeff Brownb4ff35d2011-01-02 16:37:43 -08003145 prepareDisplay(DISPLAY_ORIENTATION_90);
Jeff Brown9626b142011-03-03 02:09:54 -08003146 processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50));
Jeff Brownc3db8582010-10-20 15:33:38 -07003147 processSync(mapper);
3148
Jeff Brownbe1aa822011-07-27 16:04:54 -07003149 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brown9626b142011-03-03 02:09:54 -08003150 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3151 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
Jeff Brownc3db8582010-10-20 15:33:38 -07003152
3153 processUp(mapper);
3154 processSync(mapper);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003155 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07003156
3157 // Rotation 180.
Jeff Brownb4ff35d2011-01-02 16:37:43 -08003158 prepareDisplay(DISPLAY_ORIENTATION_180);
Jeff Brown9626b142011-03-03 02:09:54 -08003159 processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN);
Jeff Brownc3db8582010-10-20 15:33:38 -07003160 processSync(mapper);
3161
Jeff Brownbe1aa822011-07-27 16:04:54 -07003162 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brown9626b142011-03-03 02:09:54 -08003163 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3164 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
Jeff Brownc3db8582010-10-20 15:33:38 -07003165
3166 processUp(mapper);
3167 processSync(mapper);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003168 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07003169
3170 // Rotation 270.
Jeff Brownb4ff35d2011-01-02 16:37:43 -08003171 prepareDisplay(DISPLAY_ORIENTATION_270);
Jeff Brown9626b142011-03-03 02:09:54 -08003172 processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN);
Jeff Brownc3db8582010-10-20 15:33:38 -07003173 processSync(mapper);
3174
Jeff Brownbe1aa822011-07-27 16:04:54 -07003175 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brown9626b142011-03-03 02:09:54 -08003176 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3177 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
Jeff Brownc3db8582010-10-20 15:33:38 -07003178
3179 processUp(mapper);
3180 processSync(mapper);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003181 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07003182}
3183
3184TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08003185 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08003186 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08003187 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brown49754db2011-07-01 17:37:58 -07003188 prepareButtons();
Jeff Brown65fd2512011-08-18 11:20:58 -07003189 prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT);
Jeff Brownc3db8582010-10-20 15:33:38 -07003190 addMapperAndConfigure(mapper);
3191
3192 // These calculations are based on the input device calibration documentation.
3193 int32_t rawX = 100;
3194 int32_t rawY = 200;
3195 int32_t rawPressure = 10;
3196 int32_t rawToolMajor = 12;
Jeff Brown65fd2512011-08-18 11:20:58 -07003197 int32_t rawDistance = 2;
3198 int32_t rawTiltX = 30;
3199 int32_t rawTiltY = 110;
Jeff Brownc3db8582010-10-20 15:33:38 -07003200
3201 float x = toDisplayX(rawX);
3202 float y = toDisplayY(rawY);
3203 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
3204 float size = float(rawToolMajor) / RAW_TOOL_MAX;
Jeff Browna1f89ce2011-08-11 00:05:01 -07003205 float tool = float(rawToolMajor) * GEOMETRIC_SCALE;
Jeff Brownbe1aa822011-07-27 16:04:54 -07003206 float distance = float(rawDistance);
Jeff Brownc3db8582010-10-20 15:33:38 -07003207
Jeff Brown65fd2512011-08-18 11:20:58 -07003208 float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f;
3209 float tiltScale = M_PI / 180;
3210 float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale;
3211 float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale;
3212 float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle));
3213 float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle));
3214
Jeff Brownc3db8582010-10-20 15:33:38 -07003215 processDown(mapper, rawX, rawY);
3216 processPressure(mapper, rawPressure);
3217 processToolMajor(mapper, rawToolMajor);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003218 processDistance(mapper, rawDistance);
Jeff Brown65fd2512011-08-18 11:20:58 -07003219 processTilt(mapper, rawTiltX, rawTiltY);
Jeff Brownc3db8582010-10-20 15:33:38 -07003220 processSync(mapper);
3221
Jeff Brownbe1aa822011-07-27 16:04:54 -07003222 NotifyMotionArgs args;
3223 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07003224 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07003225 x, y, pressure, size, tool, tool, tool, tool, orientation, distance));
3226 ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT));
Jeff Brownbe1aa822011-07-27 16:04:54 -07003227}
3228
3229TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) {
3230 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3231 addConfigurationProperty("touch.deviceType", "touchScreen");
3232 prepareDisplay(DISPLAY_ORIENTATION_0);
3233 prepareButtons();
3234 prepareAxes(POSITION);
3235 addMapperAndConfigure(mapper);
3236
3237 NotifyMotionArgs motionArgs;
3238 NotifyKeyArgs keyArgs;
3239
3240 processDown(mapper, 100, 200);
3241 processSync(mapper);
3242 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3243 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3244 ASSERT_EQ(0, motionArgs.buttonState);
3245
3246 // press BTN_LEFT, release BTN_LEFT
3247 processKey(mapper, BTN_LEFT, 1);
3248 processSync(mapper);
3249 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3250 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3251 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
3252
3253 processKey(mapper, BTN_LEFT, 0);
3254 processSync(mapper);
3255 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3256 ASSERT_EQ(0, motionArgs.buttonState);
3257 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3258
3259 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
3260 processKey(mapper, BTN_RIGHT, 1);
3261 processKey(mapper, BTN_MIDDLE, 1);
3262 processSync(mapper);
3263 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3264 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3265 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
3266 motionArgs.buttonState);
3267
3268 processKey(mapper, BTN_RIGHT, 0);
3269 processSync(mapper);
3270 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3271 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
3272 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3273
3274 processKey(mapper, BTN_MIDDLE, 0);
3275 processSync(mapper);
3276 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3277 ASSERT_EQ(0, motionArgs.buttonState);
3278 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3279
3280 // press BTN_BACK, release BTN_BACK
3281 processKey(mapper, BTN_BACK, 1);
3282 processSync(mapper);
3283 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3284 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3285 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3286 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3287 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
3288 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3289
3290 processKey(mapper, BTN_BACK, 0);
3291 processSync(mapper);
3292 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3293 ASSERT_EQ(0, motionArgs.buttonState);
3294 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3295 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3296 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3297 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3298
3299 // press BTN_SIDE, release BTN_SIDE
3300 processKey(mapper, BTN_SIDE, 1);
3301 processSync(mapper);
3302 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3303 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3304 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3305 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3306 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
3307 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3308
3309 processKey(mapper, BTN_SIDE, 0);
3310 processSync(mapper);
3311 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3312 ASSERT_EQ(0, motionArgs.buttonState);
3313 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3314 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3315 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3316 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3317
3318 // press BTN_FORWARD, release BTN_FORWARD
3319 processKey(mapper, BTN_FORWARD, 1);
3320 processSync(mapper);
3321 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3322 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3323 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3324 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3325 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3326 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3327
3328 processKey(mapper, BTN_FORWARD, 0);
3329 processSync(mapper);
3330 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3331 ASSERT_EQ(0, motionArgs.buttonState);
3332 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3333 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3334 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3335 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3336
3337 // press BTN_EXTRA, release BTN_EXTRA
3338 processKey(mapper, BTN_EXTRA, 1);
3339 processSync(mapper);
3340 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3341 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3342 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3343 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3344 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3345 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3346
3347 processKey(mapper, BTN_EXTRA, 0);
3348 processSync(mapper);
3349 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3350 ASSERT_EQ(0, motionArgs.buttonState);
3351 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3352 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3353 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3354 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3355
3356 // press BTN_STYLUS, release BTN_STYLUS
3357 processKey(mapper, BTN_STYLUS, 1);
3358 processSync(mapper);
3359 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3360 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3361 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState);
3362
3363 processKey(mapper, BTN_STYLUS, 0);
3364 processSync(mapper);
3365 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3366 ASSERT_EQ(0, motionArgs.buttonState);
3367 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3368
3369 // press BTN_STYLUS2, release BTN_STYLUS2
3370 processKey(mapper, BTN_STYLUS2, 1);
3371 processSync(mapper);
3372 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3373 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3374 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
3375
3376 processKey(mapper, BTN_STYLUS2, 0);
3377 processSync(mapper);
3378 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3379 ASSERT_EQ(0, motionArgs.buttonState);
3380 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3381
3382 // release touch
3383 processUp(mapper);
3384 processSync(mapper);
3385 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3386 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3387 ASSERT_EQ(0, motionArgs.buttonState);
3388}
3389
3390TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
3391 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3392 addConfigurationProperty("touch.deviceType", "touchScreen");
3393 prepareDisplay(DISPLAY_ORIENTATION_0);
3394 prepareButtons();
3395 prepareAxes(POSITION);
3396 addMapperAndConfigure(mapper);
3397
3398 NotifyMotionArgs motionArgs;
3399
3400 // default tool type is finger
3401 processDown(mapper, 100, 200);
3402 processSync(mapper);
3403 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3404 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3405 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3406
3407 // eraser
3408 processKey(mapper, BTN_TOOL_RUBBER, 1);
3409 processSync(mapper);
3410 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3411 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3412 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
3413
3414 // stylus
3415 processKey(mapper, BTN_TOOL_RUBBER, 0);
3416 processKey(mapper, BTN_TOOL_PEN, 1);
3417 processSync(mapper);
3418 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3419 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3420 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3421
Jeff Brown65fd2512011-08-18 11:20:58 -07003422 // brush
Jeff Brownbe1aa822011-07-27 16:04:54 -07003423 processKey(mapper, BTN_TOOL_PEN, 0);
Jeff Brown65fd2512011-08-18 11:20:58 -07003424 processKey(mapper, BTN_TOOL_BRUSH, 1);
3425 processSync(mapper);
3426 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3427 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3428 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3429
3430 // pencil
3431 processKey(mapper, BTN_TOOL_BRUSH, 0);
3432 processKey(mapper, BTN_TOOL_PENCIL, 1);
3433 processSync(mapper);
3434 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3435 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3436 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3437
3438 // airbrush
3439 processKey(mapper, BTN_TOOL_PENCIL, 0);
3440 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
3441 processSync(mapper);
3442 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3443 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3444 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3445
3446 // mouse
3447 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
3448 processKey(mapper, BTN_TOOL_MOUSE, 1);
3449 processSync(mapper);
3450 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3451 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3452 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
3453
3454 // lens
3455 processKey(mapper, BTN_TOOL_MOUSE, 0);
3456 processKey(mapper, BTN_TOOL_LENS, 1);
3457 processSync(mapper);
3458 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3459 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3460 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
3461
Jeff Brownea6892e2011-08-23 17:31:25 -07003462 // double-tap
Jeff Brown65fd2512011-08-18 11:20:58 -07003463 processKey(mapper, BTN_TOOL_LENS, 0);
Jeff Brownea6892e2011-08-23 17:31:25 -07003464 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
3465 processSync(mapper);
3466 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3467 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3468 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3469
3470 // triple-tap
3471 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
3472 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
3473 processSync(mapper);
3474 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3475 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3476 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3477
3478 // quad-tap
3479 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
3480 processKey(mapper, BTN_TOOL_QUADTAP, 1);
3481 processSync(mapper);
3482 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3483 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3484 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3485
3486 // finger
3487 processKey(mapper, BTN_TOOL_QUADTAP, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003488 processKey(mapper, BTN_TOOL_FINGER, 1);
3489 processSync(mapper);
3490 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3491 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3492 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3493
3494 // stylus trumps finger
3495 processKey(mapper, BTN_TOOL_PEN, 1);
3496 processSync(mapper);
3497 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3498 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3499 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3500
3501 // eraser trumps stylus
3502 processKey(mapper, BTN_TOOL_RUBBER, 1);
3503 processSync(mapper);
3504 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3505 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3506 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
3507
Jeff Brown65fd2512011-08-18 11:20:58 -07003508 // mouse trumps eraser
3509 processKey(mapper, BTN_TOOL_MOUSE, 1);
3510 processSync(mapper);
3511 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3512 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3513 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
3514
Jeff Brownbe1aa822011-07-27 16:04:54 -07003515 // back to default tool type
Jeff Brown65fd2512011-08-18 11:20:58 -07003516 processKey(mapper, BTN_TOOL_MOUSE, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003517 processKey(mapper, BTN_TOOL_RUBBER, 0);
3518 processKey(mapper, BTN_TOOL_PEN, 0);
3519 processKey(mapper, BTN_TOOL_FINGER, 0);
3520 processSync(mapper);
3521 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3522 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3523 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3524}
3525
3526TEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
3527 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3528 addConfigurationProperty("touch.deviceType", "touchScreen");
3529 prepareDisplay(DISPLAY_ORIENTATION_0);
3530 prepareButtons();
3531 prepareAxes(POSITION);
Jeff Brown49ccac52012-04-11 18:27:33 -07003532 mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003533 addMapperAndConfigure(mapper);
3534
3535 NotifyMotionArgs motionArgs;
3536
3537 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
3538 processKey(mapper, BTN_TOOL_FINGER, 1);
3539 processMove(mapper, 100, 200);
3540 processSync(mapper);
3541 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3542 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3543 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3544 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
3545
3546 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3547 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3548 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3549 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
3550
3551 // move a little
3552 processMove(mapper, 150, 250);
3553 processSync(mapper);
3554 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3555 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3556 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3557 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3558
3559 // down when BTN_TOUCH is pressed, pressure defaults to 1
3560 processKey(mapper, BTN_TOUCH, 1);
3561 processSync(mapper);
3562 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3563 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3564 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3565 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3566
3567 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3568 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3569 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3570 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3571
3572 // up when BTN_TOUCH is released, hover restored
3573 processKey(mapper, BTN_TOUCH, 0);
3574 processSync(mapper);
3575 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3576 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3577 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3578 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3579
3580 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3581 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3582 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3583 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3584
3585 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3586 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3587 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3588 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3589
3590 // exit hover when pointer goes away
3591 processKey(mapper, BTN_TOOL_FINGER, 0);
3592 processSync(mapper);
3593 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3594 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3595 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3596 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3597}
3598
Jeff Brown65fd2512011-08-18 11:20:58 -07003599TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) {
Jeff Brownbe1aa822011-07-27 16:04:54 -07003600 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3601 addConfigurationProperty("touch.deviceType", "touchScreen");
3602 prepareDisplay(DISPLAY_ORIENTATION_0);
3603 prepareButtons();
Jeff Brown65fd2512011-08-18 11:20:58 -07003604 prepareAxes(POSITION | PRESSURE);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003605 addMapperAndConfigure(mapper);
3606
3607 NotifyMotionArgs motionArgs;
3608
Jeff Brown65fd2512011-08-18 11:20:58 -07003609 // initially hovering because pressure is 0
Jeff Brownbe1aa822011-07-27 16:04:54 -07003610 processDown(mapper, 100, 200);
Jeff Brown65fd2512011-08-18 11:20:58 -07003611 processPressure(mapper, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003612 processSync(mapper);
3613 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3614 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3615 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07003616 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07003617
3618 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3619 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3620 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07003621 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07003622
3623 // move a little
3624 processMove(mapper, 150, 250);
3625 processSync(mapper);
3626 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3627 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3628 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07003629 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07003630
Jeff Brown65fd2512011-08-18 11:20:58 -07003631 // down when pressure is non-zero
3632 processPressure(mapper, RAW_PRESSURE_MAX);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003633 processSync(mapper);
3634 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3635 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3636 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07003637 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07003638
3639 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3640 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3641 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3642 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3643
Jeff Brown65fd2512011-08-18 11:20:58 -07003644 // up when pressure becomes 0, hover restored
3645 processPressure(mapper, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003646 processSync(mapper);
3647 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3648 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3649 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3650 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3651
3652 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3653 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3654 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07003655 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07003656
3657 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3658 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3659 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07003660 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07003661
3662 // exit hover when pointer goes away
3663 processUp(mapper);
3664 processSync(mapper);
3665 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3666 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3667 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07003668 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003669}
3670
3671
3672// --- MultiTouchInputMapperTest ---
3673
3674class MultiTouchInputMapperTest : public TouchInputMapperTest {
3675protected:
3676 void prepareAxes(int axes);
3677
3678 void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
3679 void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
3680 void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
3681 void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
3682 void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
3683 void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
3684 void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003685 void processDistance(MultiTouchInputMapper* mapper, int32_t distance);
Jeff Brownc3db8582010-10-20 15:33:38 -07003686 void processId(MultiTouchInputMapper* mapper, int32_t id);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003687 void processSlot(MultiTouchInputMapper* mapper, int32_t slot);
3688 void processToolType(MultiTouchInputMapper* mapper, int32_t toolType);
3689 void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value);
Jeff Brownc3db8582010-10-20 15:33:38 -07003690 void processMTSync(MultiTouchInputMapper* mapper);
3691 void processSync(MultiTouchInputMapper* mapper);
3692};
3693
3694void MultiTouchInputMapperTest::prepareAxes(int axes) {
3695 if (axes & POSITION) {
Jeff Brownefd32662011-03-08 15:13:06 -08003696 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X,
3697 RAW_X_MIN, RAW_X_MAX, 0, 0);
3698 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y,
3699 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07003700 }
3701 if (axes & TOUCH) {
Jeff Brownefd32662011-03-08 15:13:06 -08003702 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR,
3703 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07003704 if (axes & MINOR) {
Jeff Brownefd32662011-03-08 15:13:06 -08003705 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
Jeff Brownc3db8582010-10-20 15:33:38 -07003706 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
3707 }
3708 }
3709 if (axes & TOOL) {
Jeff Brownefd32662011-03-08 15:13:06 -08003710 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR,
3711 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07003712 if (axes & MINOR) {
Jeff Brownefd32662011-03-08 15:13:06 -08003713 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
Jeff Brownc3db8582010-10-20 15:33:38 -07003714 RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
3715 }
3716 }
3717 if (axes & ORIENTATION) {
Jeff Brownefd32662011-03-08 15:13:06 -08003718 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION,
Jeff Brownc3db8582010-10-20 15:33:38 -07003719 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
3720 }
3721 if (axes & PRESSURE) {
Jeff Brownefd32662011-03-08 15:13:06 -08003722 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE,
Jeff Brownc3db8582010-10-20 15:33:38 -07003723 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
3724 }
Jeff Brownbe1aa822011-07-27 16:04:54 -07003725 if (axes & DISTANCE) {
3726 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE,
3727 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
3728 }
Jeff Brownc3db8582010-10-20 15:33:38 -07003729 if (axes & ID) {
Jeff Brownefd32662011-03-08 15:13:06 -08003730 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
Jeff Brownc3db8582010-10-20 15:33:38 -07003731 RAW_ID_MIN, RAW_ID_MAX, 0, 0);
3732 }
Jeff Brownbe1aa822011-07-27 16:04:54 -07003733 if (axes & SLOT) {
3734 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT,
3735 RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0);
3736 mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0);
3737 }
3738 if (axes & TOOL_TYPE) {
3739 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE,
3740 0, MT_TOOL_MAX, 0, 0);
3741 }
Jeff Brownc3db8582010-10-20 15:33:38 -07003742}
3743
3744void MultiTouchInputMapperTest::processPosition(
3745 MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003746 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_X, x);
3747 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_Y, y);
Jeff Brownc3db8582010-10-20 15:33:38 -07003748}
3749
3750void MultiTouchInputMapperTest::processTouchMajor(
3751 MultiTouchInputMapper* mapper, int32_t touchMajor) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003752 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor);
Jeff Brownc3db8582010-10-20 15:33:38 -07003753}
3754
3755void MultiTouchInputMapperTest::processTouchMinor(
3756 MultiTouchInputMapper* mapper, int32_t touchMinor) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003757 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor);
Jeff Brownc3db8582010-10-20 15:33:38 -07003758}
3759
3760void MultiTouchInputMapperTest::processToolMajor(
3761 MultiTouchInputMapper* mapper, int32_t toolMajor) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003762 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor);
Jeff Brownc3db8582010-10-20 15:33:38 -07003763}
3764
3765void MultiTouchInputMapperTest::processToolMinor(
3766 MultiTouchInputMapper* mapper, int32_t toolMinor) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003767 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor);
Jeff Brownc3db8582010-10-20 15:33:38 -07003768}
3769
3770void MultiTouchInputMapperTest::processOrientation(
3771 MultiTouchInputMapper* mapper, int32_t orientation) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003772 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_ORIENTATION, orientation);
Jeff Brownc3db8582010-10-20 15:33:38 -07003773}
3774
3775void MultiTouchInputMapperTest::processPressure(
3776 MultiTouchInputMapper* mapper, int32_t pressure) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003777 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_PRESSURE, pressure);
Jeff Brownc3db8582010-10-20 15:33:38 -07003778}
3779
Jeff Brownbe1aa822011-07-27 16:04:54 -07003780void MultiTouchInputMapperTest::processDistance(
3781 MultiTouchInputMapper* mapper, int32_t distance) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003782 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_DISTANCE, distance);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003783}
3784
Jeff Brownc3db8582010-10-20 15:33:38 -07003785void MultiTouchInputMapperTest::processId(
3786 MultiTouchInputMapper* mapper, int32_t id) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003787 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TRACKING_ID, id);
Jeff Brownc3db8582010-10-20 15:33:38 -07003788}
3789
Jeff Brownbe1aa822011-07-27 16:04:54 -07003790void MultiTouchInputMapperTest::processSlot(
3791 MultiTouchInputMapper* mapper, int32_t slot) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003792 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_SLOT, slot);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003793}
3794
3795void MultiTouchInputMapperTest::processToolType(
3796 MultiTouchInputMapper* mapper, int32_t toolType) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003797 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOOL_TYPE, toolType);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003798}
3799
3800void MultiTouchInputMapperTest::processKey(
3801 MultiTouchInputMapper* mapper, int32_t code, int32_t value) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003802 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value);
Jeff Brownbe1aa822011-07-27 16:04:54 -07003803}
3804
Jeff Brownc3db8582010-10-20 15:33:38 -07003805void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003806 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_MT_REPORT, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07003807}
3808
3809void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
Jeff Brown49ccac52012-04-11 18:27:33 -07003810 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
Jeff Brownc3db8582010-10-20 15:33:38 -07003811}
3812
3813
3814TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08003815 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08003816 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08003817 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brownc3db8582010-10-20 15:33:38 -07003818 prepareAxes(POSITION);
3819 prepareVirtualKeys();
3820 addMapperAndConfigure(mapper);
3821
3822 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3823
Jeff Brownbe1aa822011-07-27 16:04:54 -07003824 NotifyMotionArgs motionArgs;
Jeff Brownc3db8582010-10-20 15:33:38 -07003825
3826 // Two fingers down at once.
3827 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
3828 processPosition(mapper, x1, y1);
3829 processMTSync(mapper);
3830 processPosition(mapper, x2, y2);
3831 processMTSync(mapper);
3832 processSync(mapper);
3833
Jeff Brownbe1aa822011-07-27 16:04:54 -07003834 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07003835 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3836 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3837 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3838 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3839 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3840 ASSERT_EQ(0, motionArgs.flags);
3841 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003842 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07003843 ASSERT_EQ(0, motionArgs.edgeFlags);
3844 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003845 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3846 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07003847 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003848 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003849 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3850 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3851 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3852
Jeff Brownbe1aa822011-07-27 16:04:54 -07003853 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07003854 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3855 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3856 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3857 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3858 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
3859 motionArgs.action);
3860 ASSERT_EQ(0, motionArgs.flags);
3861 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003862 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07003863 ASSERT_EQ(0, motionArgs.edgeFlags);
3864 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003865 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3866 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3867 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
3868 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07003869 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003870 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003871 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003872 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003873 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3874 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3875 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3876
3877 // Move.
3878 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
3879 processPosition(mapper, x1, y1);
3880 processMTSync(mapper);
3881 processPosition(mapper, x2, y2);
3882 processMTSync(mapper);
3883 processSync(mapper);
3884
Jeff Brownbe1aa822011-07-27 16:04:54 -07003885 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07003886 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3887 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3888 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3889 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3890 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3891 ASSERT_EQ(0, motionArgs.flags);
3892 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003893 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07003894 ASSERT_EQ(0, motionArgs.edgeFlags);
3895 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003896 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3897 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3898 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
3899 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07003900 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003901 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003902 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003903 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003904 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3905 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3906 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3907
3908 // First finger up.
3909 x2 += 15; y2 -= 20;
3910 processPosition(mapper, x2, y2);
3911 processMTSync(mapper);
3912 processSync(mapper);
3913
Jeff Brownbe1aa822011-07-27 16:04:54 -07003914 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07003915 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3916 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3917 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3918 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3919 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
3920 motionArgs.action);
3921 ASSERT_EQ(0, motionArgs.flags);
3922 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003923 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07003924 ASSERT_EQ(0, motionArgs.edgeFlags);
3925 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003926 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3927 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3928 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
3929 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07003930 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003931 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003932 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003933 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003934 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3935 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3936 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3937
Jeff Brownbe1aa822011-07-27 16:04:54 -07003938 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07003939 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3940 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3941 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3942 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3943 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3944 ASSERT_EQ(0, motionArgs.flags);
3945 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003946 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07003947 ASSERT_EQ(0, motionArgs.edgeFlags);
3948 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003949 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
3950 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07003951 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003952 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003953 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3954 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3955 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3956
3957 // Move.
3958 x2 += 20; y2 -= 25;
3959 processPosition(mapper, x2, y2);
3960 processMTSync(mapper);
3961 processSync(mapper);
3962
Jeff Brownbe1aa822011-07-27 16:04:54 -07003963 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07003964 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3965 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3966 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3967 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3968 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3969 ASSERT_EQ(0, motionArgs.flags);
3970 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003971 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07003972 ASSERT_EQ(0, motionArgs.edgeFlags);
3973 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003974 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
3975 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07003976 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07003977 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07003978 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3979 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3980 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3981
3982 // New finger down.
3983 int32_t x3 = 700, y3 = 300;
3984 processPosition(mapper, x2, y2);
3985 processMTSync(mapper);
3986 processPosition(mapper, x3, y3);
3987 processMTSync(mapper);
3988 processSync(mapper);
3989
Jeff Brownbe1aa822011-07-27 16:04:54 -07003990 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07003991 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3992 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3993 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3994 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3995 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
3996 motionArgs.action);
3997 ASSERT_EQ(0, motionArgs.flags);
3998 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07003999 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07004000 ASSERT_EQ(0, motionArgs.edgeFlags);
4001 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004002 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4003 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4004 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4005 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004006 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004007 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004008 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004009 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004010 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4011 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4012 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4013
4014 // Second finger up.
4015 x3 += 30; y3 -= 20;
4016 processPosition(mapper, x3, y3);
4017 processMTSync(mapper);
4018 processSync(mapper);
4019
Jeff Brownbe1aa822011-07-27 16:04:54 -07004020 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004021 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4022 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4023 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4024 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4025 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4026 motionArgs.action);
4027 ASSERT_EQ(0, motionArgs.flags);
4028 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004029 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07004030 ASSERT_EQ(0, motionArgs.edgeFlags);
4031 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004032 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4033 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4034 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4035 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004036 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004037 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004038 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004039 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004040 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4041 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4042 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4043
Jeff Brownbe1aa822011-07-27 16:04:54 -07004044 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004045 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4046 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4047 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4048 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4049 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4050 ASSERT_EQ(0, motionArgs.flags);
4051 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004052 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07004053 ASSERT_EQ(0, motionArgs.edgeFlags);
4054 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004055 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4056 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004057 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004058 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004059 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4060 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4061 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4062
4063 // Last finger up.
4064 processMTSync(mapper);
4065 processSync(mapper);
4066
Jeff Brownbe1aa822011-07-27 16:04:54 -07004067 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004068 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4069 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4070 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4071 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4072 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4073 ASSERT_EQ(0, motionArgs.flags);
4074 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004075 ASSERT_EQ(0, motionArgs.buttonState);
Jeff Brownc3db8582010-10-20 15:33:38 -07004076 ASSERT_EQ(0, motionArgs.edgeFlags);
4077 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004078 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4079 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004080 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004081 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004082 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4083 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4084 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4085
4086 // Should not have sent any more keys or motions.
Jeff Brownbe1aa822011-07-27 16:04:54 -07004087 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4088 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07004089}
4090
4091TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08004092 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08004093 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08004094 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brownc3db8582010-10-20 15:33:38 -07004095 prepareAxes(POSITION | ID);
4096 prepareVirtualKeys();
4097 addMapperAndConfigure(mapper);
4098
4099 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4100
Jeff Brownbe1aa822011-07-27 16:04:54 -07004101 NotifyMotionArgs motionArgs;
Jeff Brownc3db8582010-10-20 15:33:38 -07004102
4103 // Two fingers down at once.
4104 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4105 processPosition(mapper, x1, y1);
4106 processId(mapper, 1);
4107 processMTSync(mapper);
4108 processPosition(mapper, x2, y2);
4109 processId(mapper, 2);
4110 processMTSync(mapper);
4111 processSync(mapper);
4112
Jeff Brownbe1aa822011-07-27 16:04:54 -07004113 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004114 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4115 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brown6894a292011-07-01 17:59:27 -07004116 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004117 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004118 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004119 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004120
Jeff Brownbe1aa822011-07-27 16:04:54 -07004121 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004122 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4123 motionArgs.action);
4124 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
Jeff Brown6894a292011-07-01 17:59:27 -07004125 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004126 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brown6894a292011-07-01 17:59:27 -07004127 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004128 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004129 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004130 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004131 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004132 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004133
4134 // Move.
4135 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4136 processPosition(mapper, x1, y1);
4137 processId(mapper, 1);
4138 processMTSync(mapper);
4139 processPosition(mapper, x2, y2);
4140 processId(mapper, 2);
4141 processMTSync(mapper);
4142 processSync(mapper);
4143
Jeff Brownbe1aa822011-07-27 16:04:54 -07004144 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004145 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4146 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
Jeff Brown6894a292011-07-01 17:59:27 -07004147 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004148 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brown6894a292011-07-01 17:59:27 -07004149 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004150 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004151 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004152 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004153 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004154 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004155
4156 // First finger up.
4157 x2 += 15; y2 -= 20;
4158 processPosition(mapper, x2, y2);
4159 processId(mapper, 2);
4160 processMTSync(mapper);
4161 processSync(mapper);
4162
Jeff Brownbe1aa822011-07-27 16:04:54 -07004163 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004164 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4165 motionArgs.action);
4166 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
Jeff Brown6894a292011-07-01 17:59:27 -07004167 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004168 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brown6894a292011-07-01 17:59:27 -07004169 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004170 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004171 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004172 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004173 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004174 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004175
Jeff Brownbe1aa822011-07-27 16:04:54 -07004176 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004177 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4178 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brown6894a292011-07-01 17:59:27 -07004179 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004180 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004181 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004182 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004183
4184 // Move.
4185 x2 += 20; y2 -= 25;
4186 processPosition(mapper, x2, y2);
4187 processId(mapper, 2);
4188 processMTSync(mapper);
4189 processSync(mapper);
4190
Jeff Brownbe1aa822011-07-27 16:04:54 -07004191 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004192 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4193 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brown6894a292011-07-01 17:59:27 -07004194 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004195 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004196 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004197 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004198
4199 // New finger down.
4200 int32_t x3 = 700, y3 = 300;
4201 processPosition(mapper, x2, y2);
4202 processId(mapper, 2);
4203 processMTSync(mapper);
4204 processPosition(mapper, x3, y3);
4205 processId(mapper, 3);
4206 processMTSync(mapper);
4207 processSync(mapper);
4208
Jeff Brownbe1aa822011-07-27 16:04:54 -07004209 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brown6894a292011-07-01 17:59:27 -07004210 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
Jeff Brownc3db8582010-10-20 15:33:38 -07004211 motionArgs.action);
4212 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
Jeff Brown6894a292011-07-01 17:59:27 -07004213 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004214 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brown6894a292011-07-01 17:59:27 -07004215 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004216 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004217 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004218 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brown6894a292011-07-01 17:59:27 -07004219 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004220 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004221
4222 // Second finger up.
4223 x3 += 30; y3 -= 20;
4224 processPosition(mapper, x3, y3);
4225 processId(mapper, 3);
4226 processMTSync(mapper);
4227 processSync(mapper);
4228
Jeff Brownbe1aa822011-07-27 16:04:54 -07004229 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brown6894a292011-07-01 17:59:27 -07004230 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
Jeff Brownc3db8582010-10-20 15:33:38 -07004231 motionArgs.action);
4232 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
Jeff Brown6894a292011-07-01 17:59:27 -07004233 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004234 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brown6894a292011-07-01 17:59:27 -07004235 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004236 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004237 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004238 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brown6894a292011-07-01 17:59:27 -07004239 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004240 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004241
Jeff Brownbe1aa822011-07-27 16:04:54 -07004242 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004243 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4244 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brown6894a292011-07-01 17:59:27 -07004245 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004246 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004247 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004248 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004249
4250 // Last finger up.
4251 processMTSync(mapper);
4252 processSync(mapper);
4253
Jeff Brownbe1aa822011-07-27 16:04:54 -07004254 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Jeff Brownc3db8582010-10-20 15:33:38 -07004255 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4256 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
Jeff Brown6894a292011-07-01 17:59:27 -07004257 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07004258 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
Jeff Brownc3db8582010-10-20 15:33:38 -07004259 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brownbe1aa822011-07-27 16:04:54 -07004260 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004261
4262 // Should not have sent any more keys or motions.
Jeff Brownbe1aa822011-07-27 16:04:54 -07004263 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4264 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4265}
4266
4267TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) {
4268 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4269 addConfigurationProperty("touch.deviceType", "touchScreen");
4270 prepareDisplay(DISPLAY_ORIENTATION_0);
4271 prepareAxes(POSITION | ID | SLOT);
4272 prepareVirtualKeys();
4273 addMapperAndConfigure(mapper);
4274
4275 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4276
4277 NotifyMotionArgs motionArgs;
4278
4279 // Two fingers down at once.
4280 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4281 processPosition(mapper, x1, y1);
4282 processId(mapper, 1);
4283 processSlot(mapper, 1);
4284 processPosition(mapper, x2, y2);
4285 processId(mapper, 2);
4286 processSync(mapper);
4287
4288 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4289 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4290 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4291 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4292 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4293 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4294 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4295
4296 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4297 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4298 motionArgs.action);
4299 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4300 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4301 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4302 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4303 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4304 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4305 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4306 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4307 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4308
4309 // Move.
4310 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4311 processSlot(mapper, 0);
4312 processPosition(mapper, x1, y1);
4313 processSlot(mapper, 1);
4314 processPosition(mapper, x2, y2);
4315 processSync(mapper);
4316
4317 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4318 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4319 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4320 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4321 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4322 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4323 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4324 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4325 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4326 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4327 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4328
4329 // First finger up.
4330 x2 += 15; y2 -= 20;
4331 processSlot(mapper, 0);
4332 processId(mapper, -1);
4333 processSlot(mapper, 1);
4334 processPosition(mapper, x2, y2);
4335 processSync(mapper);
4336
4337 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4338 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4339 motionArgs.action);
4340 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4341 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4342 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4343 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4344 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4345 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4346 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4347 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4348 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4349
4350 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4351 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4352 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4353 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4354 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4355 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4356 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4357
4358 // Move.
4359 x2 += 20; y2 -= 25;
4360 processPosition(mapper, x2, y2);
4361 processSync(mapper);
4362
4363 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4364 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4365 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4366 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4367 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4368 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4369 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4370
4371 // New finger down.
4372 int32_t x3 = 700, y3 = 300;
4373 processPosition(mapper, x2, y2);
4374 processSlot(mapper, 0);
4375 processId(mapper, 3);
4376 processPosition(mapper, x3, y3);
4377 processSync(mapper);
4378
4379 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4380 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4381 motionArgs.action);
4382 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4383 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4384 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4385 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4386 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4387 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4388 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4389 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4390 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4391
4392 // Second finger up.
4393 x3 += 30; y3 -= 20;
4394 processSlot(mapper, 1);
4395 processId(mapper, -1);
4396 processSlot(mapper, 0);
4397 processPosition(mapper, x3, y3);
4398 processSync(mapper);
4399
4400 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4401 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4402 motionArgs.action);
4403 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4404 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4405 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4406 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4407 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4408 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4409 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4410 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4411 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4412
4413 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4414 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4415 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4416 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4417 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4418 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4419 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4420
4421 // Last finger up.
4422 processId(mapper, -1);
4423 processSync(mapper);
4424
4425 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4426 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4427 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4428 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4429 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4430 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4431 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4432
4433 // Should not have sent any more keys or motions.
4434 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4435 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
Jeff Brownc3db8582010-10-20 15:33:38 -07004436}
4437
4438TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08004439 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08004440 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08004441 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07004442 prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE);
Jeff Brownc3db8582010-10-20 15:33:38 -07004443 addMapperAndConfigure(mapper);
4444
4445 // These calculations are based on the input device calibration documentation.
4446 int32_t rawX = 100;
4447 int32_t rawY = 200;
4448 int32_t rawTouchMajor = 7;
4449 int32_t rawTouchMinor = 6;
4450 int32_t rawToolMajor = 9;
4451 int32_t rawToolMinor = 8;
4452 int32_t rawPressure = 11;
Jeff Brownbe1aa822011-07-27 16:04:54 -07004453 int32_t rawDistance = 0;
Jeff Brownc3db8582010-10-20 15:33:38 -07004454 int32_t rawOrientation = 3;
4455 int32_t id = 5;
4456
4457 float x = toDisplayX(rawX);
4458 float y = toDisplayY(rawY);
4459 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
Jeff Browna1f89ce2011-08-11 00:05:01 -07004460 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
4461 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
4462 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
4463 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
4464 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
Jeff Brownc3db8582010-10-20 15:33:38 -07004465 float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
Jeff Brownbe1aa822011-07-27 16:04:54 -07004466 float distance = float(rawDistance);
Jeff Brownc3db8582010-10-20 15:33:38 -07004467
4468 processPosition(mapper, rawX, rawY);
4469 processTouchMajor(mapper, rawTouchMajor);
4470 processTouchMinor(mapper, rawTouchMinor);
4471 processToolMajor(mapper, rawToolMajor);
4472 processToolMinor(mapper, rawToolMinor);
4473 processPressure(mapper, rawPressure);
4474 processOrientation(mapper, rawOrientation);
Jeff Brownbe1aa822011-07-27 16:04:54 -07004475 processDistance(mapper, rawDistance);
Jeff Brownc3db8582010-10-20 15:33:38 -07004476 processId(mapper, id);
4477 processMTSync(mapper);
4478 processSync(mapper);
4479
Jeff Brownbe1aa822011-07-27 16:04:54 -07004480 NotifyMotionArgs args;
4481 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brown6894a292011-07-01 17:59:27 -07004482 ASSERT_EQ(0, args.pointerProperties[0].id);
Jeff Brownc3db8582010-10-20 15:33:38 -07004483 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Browna1f89ce2011-08-11 00:05:01 -07004484 x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor,
4485 orientation, distance));
Jeff Brownc3db8582010-10-20 15:33:38 -07004486}
4487
4488TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08004489 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08004490 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08004491 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brownc3db8582010-10-20 15:33:38 -07004492 prepareAxes(POSITION | TOUCH | TOOL | MINOR);
Jeff Browna1f89ce2011-08-11 00:05:01 -07004493 addConfigurationProperty("touch.size.calibration", "geometric");
Jeff Brownc3db8582010-10-20 15:33:38 -07004494 addMapperAndConfigure(mapper);
4495
4496 // These calculations are based on the input device calibration documentation.
4497 int32_t rawX = 100;
4498 int32_t rawY = 200;
4499 int32_t rawTouchMajor = 140;
4500 int32_t rawTouchMinor = 120;
4501 int32_t rawToolMajor = 180;
4502 int32_t rawToolMinor = 160;
4503
4504 float x = toDisplayX(rawX);
4505 float y = toDisplayY(rawY);
Jeff Browna1f89ce2011-08-11 00:05:01 -07004506 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
4507 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
4508 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
4509 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
4510 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
Jeff Brownc3db8582010-10-20 15:33:38 -07004511
4512 processPosition(mapper, rawX, rawY);
4513 processTouchMajor(mapper, rawTouchMajor);
4514 processTouchMinor(mapper, rawTouchMinor);
4515 processToolMajor(mapper, rawToolMajor);
4516 processToolMinor(mapper, rawToolMinor);
4517 processMTSync(mapper);
4518 processSync(mapper);
4519
Jeff Brownbe1aa822011-07-27 16:04:54 -07004520 NotifyMotionArgs args;
4521 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07004522 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Browna1f89ce2011-08-11 00:05:01 -07004523 x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004524}
4525
Jeff Browna1f89ce2011-08-11 00:05:01 -07004526TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08004527 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08004528 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08004529 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brownc3db8582010-10-20 15:33:38 -07004530 prepareAxes(POSITION | TOUCH | TOOL);
Jeff Browna1f89ce2011-08-11 00:05:01 -07004531 addConfigurationProperty("touch.size.calibration", "diameter");
4532 addConfigurationProperty("touch.size.scale", "10");
4533 addConfigurationProperty("touch.size.bias", "160");
4534 addConfigurationProperty("touch.size.isSummed", "1");
Jeff Brownc3db8582010-10-20 15:33:38 -07004535 addMapperAndConfigure(mapper);
4536
4537 // These calculations are based on the input device calibration documentation.
4538 // Note: We only provide a single common touch/tool value because the device is assumed
4539 // not to emit separate values for each pointer (isSummed = 1).
4540 int32_t rawX = 100;
4541 int32_t rawY = 200;
4542 int32_t rawX2 = 150;
4543 int32_t rawY2 = 250;
Jeff Browna1f89ce2011-08-11 00:05:01 -07004544 int32_t rawTouchMajor = 5;
4545 int32_t rawToolMajor = 8;
Jeff Brownc3db8582010-10-20 15:33:38 -07004546
4547 float x = toDisplayX(rawX);
4548 float y = toDisplayY(rawY);
4549 float x2 = toDisplayX(rawX2);
4550 float y2 = toDisplayY(rawY2);
Jeff Browna1f89ce2011-08-11 00:05:01 -07004551 float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX;
4552 float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f;
4553 float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f;
Jeff Brownc3db8582010-10-20 15:33:38 -07004554
4555 processPosition(mapper, rawX, rawY);
4556 processTouchMajor(mapper, rawTouchMajor);
4557 processToolMajor(mapper, rawToolMajor);
4558 processMTSync(mapper);
4559 processPosition(mapper, rawX2, rawY2);
4560 processTouchMajor(mapper, rawTouchMajor);
4561 processToolMajor(mapper, rawToolMajor);
4562 processMTSync(mapper);
4563 processSync(mapper);
4564
Jeff Brownbe1aa822011-07-27 16:04:54 -07004565 NotifyMotionArgs args;
4566 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07004567 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
Jeff Brown49754db2011-07-01 17:37:58 -07004568
Jeff Brownbe1aa822011-07-27 16:04:54 -07004569 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07004570 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4571 args.action);
4572 ASSERT_EQ(size_t(2), args.pointerCount);
4573 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Browna1f89ce2011-08-11 00:05:01 -07004574 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004575 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
Jeff Browna1f89ce2011-08-11 00:05:01 -07004576 x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004577}
4578
Jeff Browna1f89ce2011-08-11 00:05:01 -07004579TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) {
Jeff Brown47e6b1b2010-11-29 17:37:49 -08004580 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
Jeff Brown58a2da82011-01-25 16:02:22 -08004581 addConfigurationProperty("touch.deviceType", "touchScreen");
Jeff Brownb4ff35d2011-01-02 16:37:43 -08004582 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brownc3db8582010-10-20 15:33:38 -07004583 prepareAxes(POSITION | TOUCH | TOOL);
Jeff Browna1f89ce2011-08-11 00:05:01 -07004584 addConfigurationProperty("touch.size.calibration", "area");
4585 addConfigurationProperty("touch.size.scale", "43");
4586 addConfigurationProperty("touch.size.bias", "3");
Jeff Brownc3db8582010-10-20 15:33:38 -07004587 addMapperAndConfigure(mapper);
4588
4589 // These calculations are based on the input device calibration documentation.
4590 int32_t rawX = 100;
4591 int32_t rawY = 200;
Jeff Browna1f89ce2011-08-11 00:05:01 -07004592 int32_t rawTouchMajor = 5;
4593 int32_t rawToolMajor = 8;
Jeff Brownc3db8582010-10-20 15:33:38 -07004594
4595 float x = toDisplayX(rawX);
4596 float y = toDisplayY(rawY);
Jeff Browna1f89ce2011-08-11 00:05:01 -07004597 float size = float(rawTouchMajor) / RAW_TOUCH_MAX;
4598 float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f;
4599 float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f;
Jeff Brownc3db8582010-10-20 15:33:38 -07004600
4601 processPosition(mapper, rawX, rawY);
4602 processTouchMajor(mapper, rawTouchMajor);
4603 processToolMajor(mapper, rawToolMajor);
4604 processMTSync(mapper);
4605 processSync(mapper);
4606
Jeff Brownbe1aa822011-07-27 16:04:54 -07004607 NotifyMotionArgs args;
4608 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Jeff Brownc3db8582010-10-20 15:33:38 -07004609 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
Jeff Browna1f89ce2011-08-11 00:05:01 -07004610 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
4611}
4612
4613TEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) {
4614 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4615 addConfigurationProperty("touch.deviceType", "touchScreen");
4616 prepareDisplay(DISPLAY_ORIENTATION_0);
4617 prepareAxes(POSITION | PRESSURE);
4618 addConfigurationProperty("touch.pressure.calibration", "amplitude");
4619 addConfigurationProperty("touch.pressure.scale", "0.01");
4620 addMapperAndConfigure(mapper);
4621
4622 // These calculations are based on the input device calibration documentation.
4623 int32_t rawX = 100;
4624 int32_t rawY = 200;
4625 int32_t rawPressure = 60;
4626
4627 float x = toDisplayX(rawX);
4628 float y = toDisplayY(rawY);
4629 float pressure = float(rawPressure) * 0.01f;
4630
4631 processPosition(mapper, rawX, rawY);
4632 processPressure(mapper, rawPressure);
4633 processMTSync(mapper);
4634 processSync(mapper);
4635
4636 NotifyMotionArgs args;
4637 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4638 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4639 x, y, pressure, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownc3db8582010-10-20 15:33:38 -07004640}
4641
Jeff Brownbe1aa822011-07-27 16:04:54 -07004642TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) {
4643 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4644 addConfigurationProperty("touch.deviceType", "touchScreen");
4645 prepareDisplay(DISPLAY_ORIENTATION_0);
4646 prepareAxes(POSITION | ID | SLOT);
4647 addMapperAndConfigure(mapper);
4648
4649 NotifyMotionArgs motionArgs;
4650 NotifyKeyArgs keyArgs;
4651
4652 processId(mapper, 1);
4653 processPosition(mapper, 100, 200);
4654 processSync(mapper);
4655 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4656 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4657 ASSERT_EQ(0, motionArgs.buttonState);
4658
4659 // press BTN_LEFT, release BTN_LEFT
4660 processKey(mapper, BTN_LEFT, 1);
4661 processSync(mapper);
4662 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4663 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4664 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4665
4666 processKey(mapper, BTN_LEFT, 0);
4667 processSync(mapper);
4668 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4669 ASSERT_EQ(0, motionArgs.buttonState);
4670 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4671
4672 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
4673 processKey(mapper, BTN_RIGHT, 1);
4674 processKey(mapper, BTN_MIDDLE, 1);
4675 processSync(mapper);
4676 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4677 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4678 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4679 motionArgs.buttonState);
4680
4681 processKey(mapper, BTN_RIGHT, 0);
4682 processSync(mapper);
4683 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4684 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4685 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4686
4687 processKey(mapper, BTN_MIDDLE, 0);
4688 processSync(mapper);
4689 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4690 ASSERT_EQ(0, motionArgs.buttonState);
4691 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4692
4693 // press BTN_BACK, release BTN_BACK
4694 processKey(mapper, BTN_BACK, 1);
4695 processSync(mapper);
4696 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4697 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4698 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4699 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4700 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4701 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4702
4703 processKey(mapper, BTN_BACK, 0);
4704 processSync(mapper);
4705 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4706 ASSERT_EQ(0, motionArgs.buttonState);
4707 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4708 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4709 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4710 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4711
4712 // press BTN_SIDE, release BTN_SIDE
4713 processKey(mapper, BTN_SIDE, 1);
4714 processSync(mapper);
4715 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4716 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4717 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4718 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4719 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4720 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4721
4722 processKey(mapper, BTN_SIDE, 0);
4723 processSync(mapper);
4724 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4725 ASSERT_EQ(0, motionArgs.buttonState);
4726 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4727 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4728 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4729 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4730
4731 // press BTN_FORWARD, release BTN_FORWARD
4732 processKey(mapper, BTN_FORWARD, 1);
4733 processSync(mapper);
4734 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4735 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4736 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4737 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4738 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4739 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4740
4741 processKey(mapper, BTN_FORWARD, 0);
4742 processSync(mapper);
4743 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4744 ASSERT_EQ(0, motionArgs.buttonState);
4745 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4746 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4747 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4748 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4749
4750 // press BTN_EXTRA, release BTN_EXTRA
4751 processKey(mapper, BTN_EXTRA, 1);
4752 processSync(mapper);
4753 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4754 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4755 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4756 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4757 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4758 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4759
4760 processKey(mapper, BTN_EXTRA, 0);
4761 processSync(mapper);
4762 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4763 ASSERT_EQ(0, motionArgs.buttonState);
4764 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4765 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4766 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4767 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4768
4769 // press BTN_STYLUS, release BTN_STYLUS
4770 processKey(mapper, BTN_STYLUS, 1);
4771 processSync(mapper);
4772 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4773 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4774 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState);
4775
4776 processKey(mapper, BTN_STYLUS, 0);
4777 processSync(mapper);
4778 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4779 ASSERT_EQ(0, motionArgs.buttonState);
4780 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4781
4782 // press BTN_STYLUS2, release BTN_STYLUS2
4783 processKey(mapper, BTN_STYLUS2, 1);
4784 processSync(mapper);
4785 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4786 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4787 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4788
4789 processKey(mapper, BTN_STYLUS2, 0);
4790 processSync(mapper);
4791 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4792 ASSERT_EQ(0, motionArgs.buttonState);
4793 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4794
4795 // release touch
4796 processId(mapper, -1);
4797 processSync(mapper);
4798 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4799 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4800 ASSERT_EQ(0, motionArgs.buttonState);
4801}
4802
4803TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
4804 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4805 addConfigurationProperty("touch.deviceType", "touchScreen");
4806 prepareDisplay(DISPLAY_ORIENTATION_0);
4807 prepareAxes(POSITION | ID | SLOT | TOOL_TYPE);
4808 addMapperAndConfigure(mapper);
4809
4810 NotifyMotionArgs motionArgs;
4811
4812 // default tool type is finger
4813 processId(mapper, 1);
4814 processPosition(mapper, 100, 200);
4815 processSync(mapper);
4816 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4817 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4818 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4819
4820 // eraser
4821 processKey(mapper, BTN_TOOL_RUBBER, 1);
4822 processSync(mapper);
4823 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4824 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4825 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4826
4827 // stylus
4828 processKey(mapper, BTN_TOOL_RUBBER, 0);
4829 processKey(mapper, BTN_TOOL_PEN, 1);
4830 processSync(mapper);
4831 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4832 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4833 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4834
Jeff Brown65fd2512011-08-18 11:20:58 -07004835 // brush
Jeff Brownbe1aa822011-07-27 16:04:54 -07004836 processKey(mapper, BTN_TOOL_PEN, 0);
Jeff Brown65fd2512011-08-18 11:20:58 -07004837 processKey(mapper, BTN_TOOL_BRUSH, 1);
4838 processSync(mapper);
4839 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4840 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4841 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4842
4843 // pencil
4844 processKey(mapper, BTN_TOOL_BRUSH, 0);
4845 processKey(mapper, BTN_TOOL_PENCIL, 1);
4846 processSync(mapper);
4847 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4848 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4849 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4850
4851 // airbrush
4852 processKey(mapper, BTN_TOOL_PENCIL, 0);
4853 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
4854 processSync(mapper);
4855 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4856 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4857 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4858
4859 // mouse
4860 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
4861 processKey(mapper, BTN_TOOL_MOUSE, 1);
4862 processSync(mapper);
4863 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4864 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4865 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4866
4867 // lens
4868 processKey(mapper, BTN_TOOL_MOUSE, 0);
4869 processKey(mapper, BTN_TOOL_LENS, 1);
4870 processSync(mapper);
4871 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4872 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4873 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4874
Jeff Brownea6892e2011-08-23 17:31:25 -07004875 // double-tap
Jeff Brown65fd2512011-08-18 11:20:58 -07004876 processKey(mapper, BTN_TOOL_LENS, 0);
Jeff Brownea6892e2011-08-23 17:31:25 -07004877 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
4878 processSync(mapper);
4879 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4880 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4881 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4882
4883 // triple-tap
4884 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
4885 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
4886 processSync(mapper);
4887 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4888 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4889 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4890
4891 // quad-tap
4892 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
4893 processKey(mapper, BTN_TOOL_QUADTAP, 1);
4894 processSync(mapper);
4895 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4896 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4897 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4898
4899 // finger
4900 processKey(mapper, BTN_TOOL_QUADTAP, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07004901 processKey(mapper, BTN_TOOL_FINGER, 1);
4902 processSync(mapper);
4903 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4904 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4905 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4906
4907 // stylus trumps finger
4908 processKey(mapper, BTN_TOOL_PEN, 1);
4909 processSync(mapper);
4910 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4911 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4912 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4913
4914 // eraser trumps stylus
4915 processKey(mapper, BTN_TOOL_RUBBER, 1);
4916 processSync(mapper);
4917 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4918 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4919 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4920
Jeff Brown65fd2512011-08-18 11:20:58 -07004921 // mouse trumps eraser
4922 processKey(mapper, BTN_TOOL_MOUSE, 1);
4923 processSync(mapper);
4924 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4925 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4926 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4927
Jeff Brownbe1aa822011-07-27 16:04:54 -07004928 // MT tool type trumps BTN tool types: MT_TOOL_FINGER
4929 processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE
4930 processSync(mapper);
4931 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4932 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4933 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4934
4935 // MT tool type trumps BTN tool types: MT_TOOL_PEN
4936 processToolType(mapper, MT_TOOL_PEN);
4937 processSync(mapper);
4938 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4939 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4940 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4941
4942 // back to default tool type
4943 processToolType(mapper, -1); // use a deliberately undefined tool type, for testing
Jeff Brown65fd2512011-08-18 11:20:58 -07004944 processKey(mapper, BTN_TOOL_MOUSE, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07004945 processKey(mapper, BTN_TOOL_RUBBER, 0);
4946 processKey(mapper, BTN_TOOL_PEN, 0);
4947 processKey(mapper, BTN_TOOL_FINGER, 0);
4948 processSync(mapper);
4949 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4950 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4951 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4952}
4953
4954TEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
4955 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4956 addConfigurationProperty("touch.deviceType", "touchScreen");
4957 prepareDisplay(DISPLAY_ORIENTATION_0);
4958 prepareAxes(POSITION | ID | SLOT);
Jeff Brown49ccac52012-04-11 18:27:33 -07004959 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07004960 addMapperAndConfigure(mapper);
4961
4962 NotifyMotionArgs motionArgs;
4963
4964 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
4965 processId(mapper, 1);
4966 processPosition(mapper, 100, 200);
4967 processSync(mapper);
4968 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4969 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4970 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4971 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4972
4973 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4974 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4975 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4976 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4977
4978 // move a little
4979 processPosition(mapper, 150, 250);
4980 processSync(mapper);
4981 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4982 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4983 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4984 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4985
4986 // down when BTN_TOUCH is pressed, pressure defaults to 1
4987 processKey(mapper, BTN_TOUCH, 1);
4988 processSync(mapper);
4989 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4990 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4991 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4992 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4993
4994 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4995 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4996 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4997 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4998
4999 // up when BTN_TOUCH is released, hover restored
5000 processKey(mapper, BTN_TOUCH, 0);
5001 processSync(mapper);
5002 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5003 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5004 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5005 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5006
5007 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5008 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5009 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5010 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5011
5012 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5013 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5014 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5015 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5016
5017 // exit hover when pointer goes away
5018 processId(mapper, -1);
5019 processSync(mapper);
5020 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5021 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5022 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5023 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5024}
5025
Jeff Brown65fd2512011-08-18 11:20:58 -07005026TEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) {
Jeff Brownbe1aa822011-07-27 16:04:54 -07005027 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5028 addConfigurationProperty("touch.deviceType", "touchScreen");
5029 prepareDisplay(DISPLAY_ORIENTATION_0);
Jeff Brown65fd2512011-08-18 11:20:58 -07005030 prepareAxes(POSITION | ID | SLOT | PRESSURE);
Jeff Brownbe1aa822011-07-27 16:04:54 -07005031 addMapperAndConfigure(mapper);
5032
5033 NotifyMotionArgs motionArgs;
5034
Jeff Brown65fd2512011-08-18 11:20:58 -07005035 // initially hovering because pressure is 0
Jeff Brownbe1aa822011-07-27 16:04:54 -07005036 processId(mapper, 1);
5037 processPosition(mapper, 100, 200);
Jeff Brown65fd2512011-08-18 11:20:58 -07005038 processPressure(mapper, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07005039 processSync(mapper);
5040 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5041 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5042 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07005043 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07005044
5045 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5046 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5047 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07005048 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07005049
5050 // move a little
5051 processPosition(mapper, 150, 250);
5052 processSync(mapper);
5053 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5054 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5055 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07005056 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07005057
Jeff Brown65fd2512011-08-18 11:20:58 -07005058 // down when pressure becomes non-zero
5059 processPressure(mapper, RAW_PRESSURE_MAX);
Jeff Brownbe1aa822011-07-27 16:04:54 -07005060 processSync(mapper);
5061 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5062 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5063 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07005064 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07005065
5066 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5067 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5068 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5069 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5070
Jeff Brown65fd2512011-08-18 11:20:58 -07005071 // up when pressure becomes 0, hover restored
5072 processPressure(mapper, 0);
Jeff Brownbe1aa822011-07-27 16:04:54 -07005073 processSync(mapper);
5074 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5075 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5076 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5077 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5078
5079 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5080 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5081 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07005082 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07005083
5084 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5085 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5086 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07005087 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07005088
5089 // exit hover when pointer goes away
5090 processId(mapper, -1);
5091 processSync(mapper);
5092 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5093 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5094 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
Jeff Brown65fd2512011-08-18 11:20:58 -07005095 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
Jeff Brownbe1aa822011-07-27 16:04:54 -07005096}
5097
5098
Jeff Brownc3db8582010-10-20 15:33:38 -07005099} // namespace android