1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "../InputReader.h" 18 19 #include <utils/List.h> 20 #include <gtest/gtest.h> 21 #include <math.h> 22 23 namespace android { 24 25 // An arbitrary time value. 26 static const nsecs_t ARBITRARY_TIME = 1234; 27 28 // Arbitrary display properties. 29 static const int32_t DISPLAY_ID = 0; 30 static const int32_t DISPLAY_WIDTH = 480; 31 static const int32_t DISPLAY_HEIGHT = 800; 32 33 // Error tolerance for floating point assertions. 34 static const float EPSILON = 0.001f; 35 36 template<typename T> 37 static inline T min(T a, T b) { 38 return a < b ? a : b; 39 } 40 41 static inline float avg(float x, float y) { 42 return (x + y) / 2; 43 } 44 45 46 // --- FakePointerController --- 47 48 class FakePointerController : public PointerControllerInterface { 49 bool mHaveBounds; 50 float mMinX, mMinY, mMaxX, mMaxY; 51 float mX, mY; 52 int32_t mButtonState; 53 54 protected: 55 virtual ~FakePointerController() { } 56 57 public: 58 FakePointerController() : 59 mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0), 60 mButtonState(0) { 61 } 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 71 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 89 private: 90 virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const { 91 *outMinX = mMinX; 92 *outMinY = mMinY; 93 *outMaxX = mMaxX; 94 *outMaxY = mMaxY; 95 return mHaveBounds; 96 } 97 98 virtual void move(float deltaX, float deltaY) { 99 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; 105 } 106 107 virtual void fade(Transition transition) { 108 } 109 110 virtual void unfade(Transition transition) { 111 } 112 113 virtual void setPresentation(Presentation presentation) { 114 } 115 116 virtual void setSpots(const PointerCoords* spotCoords, 117 const uint32_t* spotIdToIndex, BitSet32 spotIdBits) { 118 } 119 120 virtual void clearSpots() { 121 } 122 }; 123 124 125 // --- FakeInputReaderPolicy --- 126 127 class FakeInputReaderPolicy : public InputReaderPolicyInterface { 128 InputReaderConfiguration mConfig; 129 KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers; 130 Vector<InputDeviceInfo> mInputDevices; 131 132 protected: 133 virtual ~FakeInputReaderPolicy() { } 134 135 public: 136 FakeInputReaderPolicy() { 137 } 138 139 void setDisplayInfo(int32_t displayId, int32_t width, int32_t height, int32_t orientation) { 140 // Set the size of both the internal and external display at the same time. 141 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; 154 v.deviceWidth = isRotated ? height : width; 155 v.deviceHeight = isRotated ? width : height; 156 mConfig.setDisplayInfo(false /*external*/, v); 157 mConfig.setDisplayInfo(true /*external*/, v); 158 } 159 160 void addExcludedDeviceName(const String8& deviceName) { 161 mConfig.excludedDeviceNames.push(deviceName); 162 } 163 164 void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) { 165 mPointerControllers.add(deviceId, controller); 166 } 167 168 const InputReaderConfiguration* getReaderConfiguration() const { 169 return &mConfig; 170 } 171 172 const Vector<InputDeviceInfo>& getInputDevices() const { 173 return mInputDevices; 174 } 175 176 private: 177 virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) { 178 *outConfig = mConfig; 179 } 180 181 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) { 182 return mPointerControllers.valueFor(deviceId); 183 } 184 185 virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) { 186 mInputDevices = inputDevices; 187 } 188 189 virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const String8& inputDeviceDescriptor) { 190 return NULL; 191 } 192 193 virtual String8 getDeviceAlias(const InputDeviceIdentifier& identifier) { 194 return String8::empty(); 195 } 196 }; 197 198 199 // --- FakeInputListener --- 200 201 class FakeInputListener : public InputListenerInterface { 202 private: 203 List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue; 204 List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue; 205 List<NotifyKeyArgs> mNotifyKeyArgsQueue; 206 List<NotifyMotionArgs> mNotifyMotionArgsQueue; 207 List<NotifySwitchArgs> mNotifySwitchArgsQueue; 208 209 protected: 210 virtual ~FakeInputListener() { } 211 212 public: 213 FakeInputListener() { 214 } 215 216 void assertNotifyConfigurationChangedWasCalled( 217 NotifyConfigurationChangedArgs* outEventArgs = NULL) { 218 ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty()) 219 << "Expected notifyConfigurationChanged() to have been called."; 220 if (outEventArgs) { 221 *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin(); 222 } 223 mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin()); 224 } 225 226 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 236 void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = NULL) { 237 ASSERT_FALSE(mNotifyKeyArgsQueue.empty()) 238 << "Expected notifyKey() to have been called."; 239 if (outEventArgs) { 240 *outEventArgs = *mNotifyKeyArgsQueue.begin(); 241 } 242 mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin()); 243 } 244 245 void assertNotifyKeyWasNotCalled() { 246 ASSERT_TRUE(mNotifyKeyArgsQueue.empty()) 247 << "Expected notifyKey() to not have been called."; 248 } 249 250 void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = NULL) { 251 ASSERT_FALSE(mNotifyMotionArgsQueue.empty()) 252 << "Expected notifyMotion() to have been called."; 253 if (outEventArgs) { 254 *outEventArgs = *mNotifyMotionArgsQueue.begin(); 255 } 256 mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin()); 257 } 258 259 void assertNotifyMotionWasNotCalled() { 260 ASSERT_TRUE(mNotifyMotionArgsQueue.empty()) 261 << "Expected notifyMotion() to not have been called."; 262 } 263 264 void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = NULL) { 265 ASSERT_FALSE(mNotifySwitchArgsQueue.empty()) 266 << "Expected notifySwitch() to have been called."; 267 if (outEventArgs) { 268 *outEventArgs = *mNotifySwitchArgsQueue.begin(); 269 } 270 mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin()); 271 } 272 273 private: 274 virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) { 275 mNotifyConfigurationChangedArgsQueue.push_back(*args); 276 } 277 278 virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) { 279 mNotifyDeviceResetArgsQueue.push_back(*args); 280 } 281 282 virtual void notifyKey(const NotifyKeyArgs* args) { 283 mNotifyKeyArgsQueue.push_back(*args); 284 } 285 286 virtual void notifyMotion(const NotifyMotionArgs* args) { 287 mNotifyMotionArgsQueue.push_back(*args); 288 } 289 290 virtual void notifySwitch(const NotifySwitchArgs* args) { 291 mNotifySwitchArgsQueue.push_back(*args); 292 } 293 }; 294 295 296 // --- FakeEventHub --- 297 298 class FakeEventHub : public EventHubInterface { 299 struct KeyInfo { 300 int32_t keyCode; 301 uint32_t flags; 302 }; 303 304 struct Device { 305 InputDeviceIdentifier identifier; 306 uint32_t classes; 307 PropertyMap configuration; 308 KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes; 309 KeyedVector<int, bool> relativeAxes; 310 KeyedVector<int32_t, int32_t> keyCodeStates; 311 KeyedVector<int32_t, int32_t> scanCodeStates; 312 KeyedVector<int32_t, int32_t> switchStates; 313 KeyedVector<int32_t, int32_t> absoluteAxisValue; 314 KeyedVector<int32_t, KeyInfo> keysByScanCode; 315 KeyedVector<int32_t, KeyInfo> keysByUsageCode; 316 KeyedVector<int32_t, bool> leds; 317 Vector<VirtualKeyDefinition> virtualKeys; 318 319 Device(uint32_t classes) : 320 classes(classes) { 321 } 322 }; 323 324 KeyedVector<int32_t, Device*> mDevices; 325 Vector<String8> mExcludedDevices; 326 List<RawEvent> mEvents; 327 328 protected: 329 virtual ~FakeEventHub() { 330 for (size_t i = 0; i < mDevices.size(); i++) { 331 delete mDevices.valueAt(i); 332 } 333 } 334 335 public: 336 FakeEventHub() { } 337 338 void addDevice(int32_t deviceId, const String8& name, uint32_t classes) { 339 Device* device = new Device(classes); 340 device->identifier.name = name; 341 mDevices.add(deviceId, device); 342 343 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0); 344 } 345 346 void removeDevice(int32_t deviceId) { 347 delete mDevices.valueFor(deviceId); 348 mDevices.removeItem(deviceId); 349 350 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0); 351 } 352 353 void finishDeviceScan() { 354 enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0); 355 } 356 357 void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) { 358 Device* device = getDevice(deviceId); 359 device->configuration.addProperty(key, value); 360 } 361 362 void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) { 363 Device* device = getDevice(deviceId); 364 device->configuration.addAll(configuration); 365 } 366 367 void addAbsoluteAxis(int32_t deviceId, int axis, 368 int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) { 369 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; 377 info.resolution = resolution; 378 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); 384 } 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 401 void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) { 402 Device* device = getDevice(deviceId); 403 device->absoluteAxisValue.replaceValueFor(axis, value); 404 } 405 406 void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, 407 int32_t keyCode, uint32_t flags) { 408 Device* device = getDevice(deviceId); 409 KeyInfo info; 410 info.keyCode = keyCode; 411 info.flags = flags; 412 if (scanCode) { 413 device->keysByScanCode.add(scanCode, info); 414 } 415 if (usageCode) { 416 device->keysByUsageCode.add(usageCode, info); 417 } 418 } 419 420 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 430 Vector<String8>& getExcludedDevices() { 431 return mExcludedDevices; 432 } 433 434 void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) { 435 Device* device = getDevice(deviceId); 436 device->virtualKeys.push(definition); 437 } 438 439 void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type, 440 int32_t code, int32_t value) { 441 RawEvent event; 442 event.when = when; 443 event.deviceId = deviceId; 444 event.type = type; 445 event.code = code; 446 event.value = value; 447 mEvents.push_back(event); 448 449 if (type == EV_ABS) { 450 setAbsoluteAxisValue(deviceId, code, value); 451 } 452 } 453 454 void assertQueueIsEmpty() { 455 ASSERT_EQ(size_t(0), mEvents.size()) 456 << "Expected the event queue to be empty (fully consumed)."; 457 } 458 459 private: 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 470 virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const { 471 Device* device = getDevice(deviceId); 472 return device ? device->identifier : InputDeviceIdentifier(); 473 } 474 475 virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const { 476 Device* device = getDevice(deviceId); 477 if (device) { 478 *outConfiguration = device->configuration; 479 } 480 } 481 482 virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, 483 RawAbsoluteAxisInfo* outAxisInfo) const { 484 Device* device = getDevice(deviceId); 485 if (device) { 486 ssize_t index = device->absoluteAxes.indexOfKey(axis); 487 if (index >= 0) { 488 *outAxisInfo = device->absoluteAxes.valueAt(index); 489 return OK; 490 } 491 } 492 outAxisInfo->clear(); 493 return -1; 494 } 495 496 virtual bool hasRelativeAxis(int32_t deviceId, int axis) const { 497 Device* device = getDevice(deviceId); 498 if (device) { 499 return device->relativeAxes.indexOfKey(axis) >= 0; 500 } 501 return false; 502 } 503 504 virtual bool hasInputProperty(int32_t deviceId, int property) const { 505 return false; 506 } 507 508 virtual status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, 509 int32_t* outKeycode, uint32_t* outFlags) const { 510 Device* device = getDevice(deviceId); 511 if (device) { 512 const KeyInfo* key = getKey(device, scanCode, usageCode); 513 if (key) { 514 if (outKeycode) { 515 *outKeycode = key->keyCode; 516 } 517 if (outFlags) { 518 *outFlags = key->flags; 519 } 520 return OK; 521 } 522 } 523 return NAME_NOT_FOUND; 524 } 525 526 const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const { 527 if (usageCode) { 528 ssize_t index = device->keysByUsageCode.indexOfKey(usageCode); 529 if (index >= 0) { 530 return &device->keysByUsageCode.valueAt(index); 531 } 532 } 533 if (scanCode) { 534 ssize_t index = device->keysByScanCode.indexOfKey(scanCode); 535 if (index >= 0) { 536 return &device->keysByScanCode.valueAt(index); 537 } 538 } 539 return NULL; 540 } 541 542 virtual status_t mapAxis(int32_t deviceId, int32_t scanCode, 543 AxisInfo* outAxisInfo) const { 544 return NAME_NOT_FOUND; 545 } 546 547 virtual void setExcludedDevices(const Vector<String8>& devices) { 548 mExcludedDevices = devices; 549 } 550 551 virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) { 552 if (mEvents.empty()) { 553 return 0; 554 } 555 556 *buffer = *mEvents.begin(); 557 mEvents.erase(mEvents.begin()); 558 return 1; 559 } 560 561 virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const { 562 Device* device = getDevice(deviceId); 563 if (device) { 564 ssize_t index = device->scanCodeStates.indexOfKey(scanCode); 565 if (index >= 0) { 566 return device->scanCodeStates.valueAt(index); 567 } 568 } 569 return AKEY_STATE_UNKNOWN; 570 } 571 572 virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const { 573 Device* device = getDevice(deviceId); 574 if (device) { 575 ssize_t index = device->keyCodeStates.indexOfKey(keyCode); 576 if (index >= 0) { 577 return device->keyCodeStates.valueAt(index); 578 } 579 } 580 return AKEY_STATE_UNKNOWN; 581 } 582 583 virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const { 584 Device* device = getDevice(deviceId); 585 if (device) { 586 ssize_t index = device->switchStates.indexOfKey(sw); 587 if (index >= 0) { 588 return device->switchStates.valueAt(index); 589 } 590 } 591 return AKEY_STATE_UNKNOWN; 592 } 593 594 virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, 595 int32_t* outValue) const { 596 Device* device = getDevice(deviceId); 597 if (device) { 598 ssize_t index = device->absoluteAxisValue.indexOfKey(axis); 599 if (index >= 0) { 600 *outValue = device->absoluteAxisValue.valueAt(index); 601 return OK; 602 } 603 } 604 *outValue = 0; 605 return -1; 606 } 607 608 virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes, 609 uint8_t* outFlags) const { 610 bool result = false; 611 Device* device = getDevice(deviceId); 612 if (device) { 613 for (size_t i = 0; i < numCodes; i++) { 614 for (size_t j = 0; j < device->keysByScanCode.size(); j++) { 615 if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) { 616 outFlags[i] = 1; 617 result = true; 618 } 619 } 620 for (size_t j = 0; j < device->keysByUsageCode.size(); j++) { 621 if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) { 622 outFlags[i] = 1; 623 result = true; 624 } 625 } 626 } 627 } 628 return result; 629 } 630 631 virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const { 632 Device* device = getDevice(deviceId); 633 if (device) { 634 ssize_t index = device->keysByScanCode.indexOfKey(scanCode); 635 return index >= 0; 636 } 637 return false; 638 } 639 640 virtual bool hasLed(int32_t deviceId, int32_t led) const { 641 Device* device = getDevice(deviceId); 642 return device && device->leds.indexOfKey(led) >= 0; 643 } 644 645 virtual void setLedState(int32_t deviceId, int32_t led, bool on) { 646 Device* device = getDevice(deviceId); 647 if (device) { 648 ssize_t index = device->leds.indexOfKey(led); 649 if (index >= 0) { 650 device->leds.replaceValueAt(led, on); 651 } else { 652 ADD_FAILURE() 653 << "Attempted to set the state of an LED that the EventHub declared " 654 "was not present. led=" << led; 655 } 656 } 657 } 658 659 virtual void getVirtualKeyDefinitions(int32_t deviceId, 660 Vector<VirtualKeyDefinition>& outVirtualKeys) const { 661 outVirtualKeys.clear(); 662 663 Device* device = getDevice(deviceId); 664 if (device) { 665 outVirtualKeys.appendVector(device->virtualKeys); 666 } 667 } 668 669 virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t deviceId) const { 670 return NULL; 671 } 672 673 virtual bool setKeyboardLayoutOverlay(int32_t deviceId, const sp<KeyCharacterMap>& map) { 674 return false; 675 } 676 677 virtual void vibrate(int32_t deviceId, nsecs_t duration) { 678 } 679 680 virtual void cancelVibrate(int32_t deviceId) { 681 } 682 683 virtual bool isExternal(int32_t deviceId) const { 684 return false; 685 } 686 687 virtual void dump(String8& dump) { 688 } 689 690 virtual void monitor() { 691 } 692 693 virtual void requestReopenDevices() { 694 } 695 696 virtual void wake() { 697 } 698 }; 699 700 701 // --- FakeInputReaderContext --- 702 703 class FakeInputReaderContext : public InputReaderContext { 704 sp<EventHubInterface> mEventHub; 705 sp<InputReaderPolicyInterface> mPolicy; 706 sp<InputListenerInterface> mListener; 707 int32_t mGlobalMetaState; 708 bool mUpdateGlobalMetaStateWasCalled; 709 int32_t mGeneration; 710 711 public: 712 FakeInputReaderContext(const sp<EventHubInterface>& eventHub, 713 const sp<InputReaderPolicyInterface>& policy, 714 const sp<InputListenerInterface>& listener) : 715 mEventHub(eventHub), mPolicy(policy), mListener(listener), 716 mGlobalMetaState(0) { 717 } 718 719 virtual ~FakeInputReaderContext() { } 720 721 void assertUpdateGlobalMetaStateWasCalled() { 722 ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled) 723 << "Expected updateGlobalMetaState() to have been called."; 724 mUpdateGlobalMetaStateWasCalled = false; 725 } 726 727 void setGlobalMetaState(int32_t state) { 728 mGlobalMetaState = state; 729 } 730 731 private: 732 virtual void updateGlobalMetaState() { 733 mUpdateGlobalMetaStateWasCalled = true; 734 } 735 736 virtual int32_t getGlobalMetaState() { 737 return mGlobalMetaState; 738 } 739 740 virtual EventHubInterface* getEventHub() { 741 return mEventHub.get(); 742 } 743 744 virtual InputReaderPolicyInterface* getPolicy() { 745 return mPolicy.get(); 746 } 747 748 virtual InputListenerInterface* getListener() { 749 return mListener.get(); 750 } 751 752 virtual void disableVirtualKeysUntil(nsecs_t time) { 753 } 754 755 virtual bool shouldDropVirtualKey(nsecs_t now, 756 InputDevice* device, int32_t keyCode, int32_t scanCode) { 757 return false; 758 } 759 760 virtual void fadePointer() { 761 } 762 763 virtual void requestTimeoutAtTime(nsecs_t when) { 764 } 765 766 virtual int32_t bumpGeneration() { 767 return ++mGeneration; 768 } 769 }; 770 771 772 // --- FakeInputMapper --- 773 774 class FakeInputMapper : public InputMapper { 775 uint32_t mSources; 776 int32_t mKeyboardType; 777 int32_t mMetaState; 778 KeyedVector<int32_t, int32_t> mKeyCodeStates; 779 KeyedVector<int32_t, int32_t> mScanCodeStates; 780 KeyedVector<int32_t, int32_t> mSwitchStates; 781 Vector<int32_t> mSupportedKeyCodes; 782 RawEvent mLastEvent; 783 784 bool mConfigureWasCalled; 785 bool mResetWasCalled; 786 bool mProcessWasCalled; 787 788 public: 789 FakeInputMapper(InputDevice* device, uint32_t sources) : 790 InputMapper(device), 791 mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE), 792 mMetaState(0), 793 mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) { 794 } 795 796 virtual ~FakeInputMapper() { } 797 798 void setKeyboardType(int32_t keyboardType) { 799 mKeyboardType = keyboardType; 800 } 801 802 void setMetaState(int32_t metaState) { 803 mMetaState = metaState; 804 } 805 806 void assertConfigureWasCalled() { 807 ASSERT_TRUE(mConfigureWasCalled) 808 << "Expected configure() to have been called."; 809 mConfigureWasCalled = false; 810 } 811 812 void assertResetWasCalled() { 813 ASSERT_TRUE(mResetWasCalled) 814 << "Expected reset() to have been called."; 815 mResetWasCalled = false; 816 } 817 818 void assertProcessWasCalled(RawEvent* outLastEvent = NULL) { 819 ASSERT_TRUE(mProcessWasCalled) 820 << "Expected process() to have been called."; 821 if (outLastEvent) { 822 *outLastEvent = mLastEvent; 823 } 824 mProcessWasCalled = false; 825 } 826 827 void setKeyCodeState(int32_t keyCode, int32_t state) { 828 mKeyCodeStates.replaceValueFor(keyCode, state); 829 } 830 831 void setScanCodeState(int32_t scanCode, int32_t state) { 832 mScanCodeStates.replaceValueFor(scanCode, state); 833 } 834 835 void setSwitchState(int32_t switchCode, int32_t state) { 836 mSwitchStates.replaceValueFor(switchCode, state); 837 } 838 839 void addSupportedKeyCode(int32_t keyCode) { 840 mSupportedKeyCodes.add(keyCode); 841 } 842 843 private: 844 virtual uint32_t getSources() { 845 return mSources; 846 } 847 848 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) { 849 InputMapper::populateDeviceInfo(deviceInfo); 850 851 if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) { 852 deviceInfo->setKeyboardType(mKeyboardType); 853 } 854 } 855 856 virtual void configure(nsecs_t when, 857 const InputReaderConfiguration* config, uint32_t changes) { 858 mConfigureWasCalled = true; 859 } 860 861 virtual void reset(nsecs_t when) { 862 mResetWasCalled = true; 863 } 864 865 virtual void process(const RawEvent* rawEvent) { 866 mLastEvent = *rawEvent; 867 mProcessWasCalled = true; 868 } 869 870 virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode) { 871 ssize_t index = mKeyCodeStates.indexOfKey(keyCode); 872 return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN; 873 } 874 875 virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode) { 876 ssize_t index = mScanCodeStates.indexOfKey(scanCode); 877 return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN; 878 } 879 880 virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode) { 881 ssize_t index = mSwitchStates.indexOfKey(switchCode); 882 return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN; 883 } 884 885 virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes, 886 const int32_t* keyCodes, uint8_t* outFlags) { 887 bool result = false; 888 for (size_t i = 0; i < numCodes; i++) { 889 for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) { 890 if (keyCodes[i] == mSupportedKeyCodes[j]) { 891 outFlags[i] = 1; 892 result = true; 893 } 894 } 895 } 896 return result; 897 } 898 899 virtual int32_t getMetaState() { 900 return mMetaState; 901 } 902 903 virtual void fadePointer() { 904 } 905 }; 906 907 908 // --- InstrumentedInputReader --- 909 910 class InstrumentedInputReader : public InputReader { 911 InputDevice* mNextDevice; 912 913 public: 914 InstrumentedInputReader(const sp<EventHubInterface>& eventHub, 915 const sp<InputReaderPolicyInterface>& policy, 916 const sp<InputListenerInterface>& listener) : 917 InputReader(eventHub, policy, listener), 918 mNextDevice(NULL) { 919 } 920 921 virtual ~InstrumentedInputReader() { 922 if (mNextDevice) { 923 delete mNextDevice; 924 } 925 } 926 927 void setNextDevice(InputDevice* device) { 928 mNextDevice = device; 929 } 930 931 InputDevice* newDevice(int32_t deviceId, const String8& name, uint32_t classes) { 932 InputDeviceIdentifier identifier; 933 identifier.name = name; 934 int32_t generation = deviceId + 1; 935 return new InputDevice(&mContext, deviceId, generation, identifier, classes); 936 } 937 938 protected: 939 virtual InputDevice* createDeviceLocked(int32_t deviceId, 940 const InputDeviceIdentifier& identifier, uint32_t classes) { 941 if (mNextDevice) { 942 InputDevice* device = mNextDevice; 943 mNextDevice = NULL; 944 return device; 945 } 946 return InputReader::createDeviceLocked(deviceId, identifier, classes); 947 } 948 949 friend class InputReaderTest; 950 }; 951 952 953 // --- InputReaderTest --- 954 955 class InputReaderTest : public testing::Test { 956 protected: 957 sp<FakeInputListener> mFakeListener; 958 sp<FakeInputReaderPolicy> mFakePolicy; 959 sp<FakeEventHub> mFakeEventHub; 960 sp<InstrumentedInputReader> mReader; 961 962 virtual void SetUp() { 963 mFakeEventHub = new FakeEventHub(); 964 mFakePolicy = new FakeInputReaderPolicy(); 965 mFakeListener = new FakeInputListener(); 966 967 mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener); 968 } 969 970 virtual void TearDown() { 971 mReader.clear(); 972 973 mFakeListener.clear(); 974 mFakePolicy.clear(); 975 mFakeEventHub.clear(); 976 } 977 978 void addDevice(int32_t deviceId, const String8& name, uint32_t classes, 979 const PropertyMap* configuration) { 980 mFakeEventHub->addDevice(deviceId, name, classes); 981 982 if (configuration) { 983 mFakeEventHub->addConfigurationMap(deviceId, configuration); 984 } 985 mFakeEventHub->finishDeviceScan(); 986 mReader->loopOnce(); 987 mReader->loopOnce(); 988 mFakeEventHub->assertQueueIsEmpty(); 989 } 990 991 FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, 992 const String8& name, uint32_t classes, uint32_t sources, 993 const PropertyMap* configuration) { 994 InputDevice* device = mReader->newDevice(deviceId, name, classes); 995 FakeInputMapper* mapper = new FakeInputMapper(device, sources); 996 device->addMapper(mapper); 997 mReader->setNextDevice(device); 998 addDevice(deviceId, name, classes, configuration); 999 return mapper; 1000 } 1001 }; 1002 1003 TEST_F(InputReaderTest, GetInputDevices) { 1004 ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"), 1005 INPUT_DEVICE_CLASS_KEYBOARD, NULL)); 1006 ASSERT_NO_FATAL_FAILURE(addDevice(2, String8("ignored"), 1007 0, NULL)); // no classes so device will be ignored 1008 1009 Vector<InputDeviceInfo> inputDevices; 1010 mReader->getInputDevices(inputDevices); 1011 1012 ASSERT_EQ(1U, inputDevices.size()); 1013 ASSERT_EQ(1, inputDevices[0].getId()); 1014 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.string()); 1015 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType()); 1016 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources()); 1017 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size()); 1018 1019 // Should also have received a notification describing the new input devices. 1020 inputDevices = mFakePolicy->getInputDevices(); 1021 ASSERT_EQ(1U, inputDevices.size()); 1022 ASSERT_EQ(1, inputDevices[0].getId()); 1023 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.string()); 1024 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType()); 1025 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources()); 1026 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size()); 1027 } 1028 1029 TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) { 1030 FakeInputMapper* mapper = NULL; 1031 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 1032 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1033 mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN); 1034 1035 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0, 1036 AINPUT_SOURCE_ANY, AKEYCODE_A)) 1037 << "Should return unknown when the device id is >= 0 but unknown."; 1038 1039 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1, 1040 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1041 << "Should return unknown when the device id is valid but the sources are not supported by the device."; 1042 1043 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1, 1044 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1045 << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1046 1047 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1, 1048 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1049 << "Should return unknown when the device id is < 0 but the sources are not supported by any device."; 1050 1051 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1, 1052 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1053 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1054 } 1055 1056 TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) { 1057 FakeInputMapper* mapper = NULL; 1058 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 1059 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1060 mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN); 1061 1062 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0, 1063 AINPUT_SOURCE_ANY, KEY_A)) 1064 << "Should return unknown when the device id is >= 0 but unknown."; 1065 1066 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1, 1067 AINPUT_SOURCE_TRACKBALL, KEY_A)) 1068 << "Should return unknown when the device id is valid but the sources are not supported by the device."; 1069 1070 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1, 1071 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A)) 1072 << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1073 1074 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1, 1075 AINPUT_SOURCE_TRACKBALL, KEY_A)) 1076 << "Should return unknown when the device id is < 0 but the sources are not supported by any device."; 1077 1078 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1, 1079 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A)) 1080 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1081 } 1082 1083 TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) { 1084 FakeInputMapper* mapper = NULL; 1085 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 1086 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1087 mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN); 1088 1089 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0, 1090 AINPUT_SOURCE_ANY, SW_LID)) 1091 << "Should return unknown when the device id is >= 0 but unknown."; 1092 1093 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1, 1094 AINPUT_SOURCE_TRACKBALL, SW_LID)) 1095 << "Should return unknown when the device id is valid but the sources are not supported by the device."; 1096 1097 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1, 1098 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID)) 1099 << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1100 1101 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1, 1102 AINPUT_SOURCE_TRACKBALL, SW_LID)) 1103 << "Should return unknown when the device id is < 0 but the sources are not supported by any device."; 1104 1105 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1, 1106 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID)) 1107 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1108 } 1109 1110 TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) { 1111 FakeInputMapper* mapper = NULL; 1112 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 1113 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1114 mapper->addSupportedKeyCode(AKEYCODE_A); 1115 mapper->addSupportedKeyCode(AKEYCODE_B); 1116 1117 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 }; 1118 uint8_t flags[4] = { 0, 0, 0, 1 }; 1119 1120 ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags)) 1121 << "Should return false when device id is >= 0 but unknown."; 1122 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]); 1123 1124 flags[3] = 1; 1125 ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1126 << "Should return false when device id is valid but the sources are not supported by the device."; 1127 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]); 1128 1129 flags[3] = 1; 1130 ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1131 << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1132 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]); 1133 1134 flags[3] = 1; 1135 ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1136 << "Should return false when the device id is < 0 but the sources are not supported by any device."; 1137 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]); 1138 1139 flags[3] = 1; 1140 ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1141 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1142 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]); 1143 } 1144 1145 TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) { 1146 addDevice(1, String8("ignored"), INPUT_DEVICE_CLASS_KEYBOARD, NULL); 1147 1148 NotifyConfigurationChangedArgs args; 1149 1150 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args)); 1151 ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1152 } 1153 1154 TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) { 1155 FakeInputMapper* mapper = NULL; 1156 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 1157 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1158 1159 mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1); 1160 mReader->loopOnce(); 1161 ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty()); 1162 1163 RawEvent event; 1164 ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event)); 1165 ASSERT_EQ(0, event.when); 1166 ASSERT_EQ(1, event.deviceId); 1167 ASSERT_EQ(EV_KEY, event.type); 1168 ASSERT_EQ(KEY_A, event.code); 1169 ASSERT_EQ(1, event.value); 1170 } 1171 1172 1173 // --- InputDeviceTest --- 1174 1175 class InputDeviceTest : public testing::Test { 1176 protected: 1177 static const char* DEVICE_NAME; 1178 static const int32_t DEVICE_ID; 1179 static const int32_t DEVICE_GENERATION; 1180 static const uint32_t DEVICE_CLASSES; 1181 1182 sp<FakeEventHub> mFakeEventHub; 1183 sp<FakeInputReaderPolicy> mFakePolicy; 1184 sp<FakeInputListener> mFakeListener; 1185 FakeInputReaderContext* mFakeContext; 1186 1187 InputDevice* mDevice; 1188 1189 virtual void SetUp() { 1190 mFakeEventHub = new FakeEventHub(); 1191 mFakePolicy = new FakeInputReaderPolicy(); 1192 mFakeListener = new FakeInputListener(); 1193 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener); 1194 1195 mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0); 1196 InputDeviceIdentifier identifier; 1197 identifier.name = DEVICE_NAME; 1198 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION, 1199 identifier, DEVICE_CLASSES); 1200 } 1201 1202 virtual void TearDown() { 1203 delete mDevice; 1204 1205 delete mFakeContext; 1206 mFakeListener.clear(); 1207 mFakePolicy.clear(); 1208 mFakeEventHub.clear(); 1209 } 1210 }; 1211 1212 const char* InputDeviceTest::DEVICE_NAME = "device"; 1213 const int32_t InputDeviceTest::DEVICE_ID = 1; 1214 const int32_t InputDeviceTest::DEVICE_GENERATION = 2; 1215 const uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD 1216 | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK; 1217 1218 TEST_F(InputDeviceTest, ImmutableProperties) { 1219 ASSERT_EQ(DEVICE_ID, mDevice->getId()); 1220 ASSERT_STREQ(DEVICE_NAME, mDevice->getName()); 1221 ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses()); 1222 } 1223 1224 TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) { 1225 // Configuration. 1226 InputReaderConfiguration config; 1227 mDevice->configure(ARBITRARY_TIME, &config, 0); 1228 1229 // Reset. 1230 mDevice->reset(ARBITRARY_TIME); 1231 1232 NotifyDeviceResetArgs resetArgs; 1233 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs)); 1234 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime); 1235 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId); 1236 1237 // Metadata. 1238 ASSERT_TRUE(mDevice->isIgnored()); 1239 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources()); 1240 1241 InputDeviceInfo info; 1242 mDevice->getDeviceInfo(&info); 1243 ASSERT_EQ(DEVICE_ID, info.getId()); 1244 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.string()); 1245 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType()); 1246 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources()); 1247 1248 // State queries. 1249 ASSERT_EQ(0, mDevice->getMetaState()); 1250 1251 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0)) 1252 << "Ignored device should return unknown key code state."; 1253 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0)) 1254 << "Ignored device should return unknown scan code state."; 1255 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0)) 1256 << "Ignored device should return unknown switch state."; 1257 1258 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B }; 1259 uint8_t flags[2] = { 0, 1 }; 1260 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags)) 1261 << "Ignored device should never mark any key codes."; 1262 ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged."; 1263 ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged."; 1264 } 1265 1266 TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) { 1267 // Configuration. 1268 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value")); 1269 1270 FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD); 1271 mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1272 mapper1->setMetaState(AMETA_ALT_ON); 1273 mapper1->addSupportedKeyCode(AKEYCODE_A); 1274 mapper1->addSupportedKeyCode(AKEYCODE_B); 1275 mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN); 1276 mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP); 1277 mapper1->setScanCodeState(2, AKEY_STATE_DOWN); 1278 mapper1->setScanCodeState(3, AKEY_STATE_UP); 1279 mapper1->setSwitchState(4, AKEY_STATE_DOWN); 1280 mDevice->addMapper(mapper1); 1281 1282 FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN); 1283 mapper2->setMetaState(AMETA_SHIFT_ON); 1284 mDevice->addMapper(mapper2); 1285 1286 InputReaderConfiguration config; 1287 mDevice->configure(ARBITRARY_TIME, &config, 0); 1288 1289 String8 propertyValue; 1290 ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue)) 1291 << "Device should have read configuration during configuration phase."; 1292 ASSERT_STREQ("value", propertyValue.string()); 1293 1294 ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled()); 1295 ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled()); 1296 1297 // Reset 1298 mDevice->reset(ARBITRARY_TIME); 1299 ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled()); 1300 ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled()); 1301 1302 NotifyDeviceResetArgs resetArgs; 1303 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs)); 1304 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime); 1305 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId); 1306 1307 // Metadata. 1308 ASSERT_FALSE(mDevice->isIgnored()); 1309 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources()); 1310 1311 InputDeviceInfo info; 1312 mDevice->getDeviceInfo(&info); 1313 ASSERT_EQ(DEVICE_ID, info.getId()); 1314 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.string()); 1315 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType()); 1316 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources()); 1317 1318 // State queries. 1319 ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState()) 1320 << "Should query mappers and combine meta states."; 1321 1322 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1323 << "Should return unknown key code state when source not supported."; 1324 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1325 << "Should return unknown scan code state when source not supported."; 1326 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1327 << "Should return unknown switch state when source not supported."; 1328 1329 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A)) 1330 << "Should query mapper when source is supported."; 1331 ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3)) 1332 << "Should query mapper when source is supported."; 1333 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4)) 1334 << "Should query mapper when source is supported."; 1335 1336 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 }; 1337 uint8_t flags[4] = { 0, 0, 0, 1 }; 1338 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1339 << "Should do nothing when source is unsupported."; 1340 ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported."; 1341 ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported."; 1342 ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported."; 1343 ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported."; 1344 1345 ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags)) 1346 << "Should query mapper when source is supported."; 1347 ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set."; 1348 ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set."; 1349 ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged."; 1350 ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged."; 1351 1352 // Event handling. 1353 RawEvent event; 1354 mDevice->process(&event, 1); 1355 1356 ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled()); 1357 ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled()); 1358 } 1359 1360 1361 // --- InputMapperTest --- 1362 1363 class InputMapperTest : public testing::Test { 1364 protected: 1365 static const char* DEVICE_NAME; 1366 static const int32_t DEVICE_ID; 1367 static const int32_t DEVICE_GENERATION; 1368 static const uint32_t DEVICE_CLASSES; 1369 1370 sp<FakeEventHub> mFakeEventHub; 1371 sp<FakeInputReaderPolicy> mFakePolicy; 1372 sp<FakeInputListener> mFakeListener; 1373 FakeInputReaderContext* mFakeContext; 1374 InputDevice* mDevice; 1375 1376 virtual void SetUp() { 1377 mFakeEventHub = new FakeEventHub(); 1378 mFakePolicy = new FakeInputReaderPolicy(); 1379 mFakeListener = new FakeInputListener(); 1380 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener); 1381 InputDeviceIdentifier identifier; 1382 identifier.name = DEVICE_NAME; 1383 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION, 1384 identifier, DEVICE_CLASSES); 1385 1386 mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0); 1387 } 1388 1389 virtual void TearDown() { 1390 delete mDevice; 1391 delete mFakeContext; 1392 mFakeListener.clear(); 1393 mFakePolicy.clear(); 1394 mFakeEventHub.clear(); 1395 } 1396 1397 void addConfigurationProperty(const char* key, const char* value) { 1398 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8(key), String8(value)); 1399 } 1400 1401 void addMapperAndConfigure(InputMapper* mapper) { 1402 mDevice->addMapper(mapper); 1403 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 0); 1404 mDevice->reset(ARBITRARY_TIME); 1405 } 1406 1407 void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height, 1408 int32_t orientation) { 1409 mFakePolicy->setDisplayInfo(displayId, width, height, orientation); 1410 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 1411 InputReaderConfiguration::CHANGE_DISPLAY_INFO); 1412 } 1413 1414 static void process(InputMapper* mapper, nsecs_t when, int32_t deviceId, int32_t type, 1415 int32_t code, int32_t value) { 1416 RawEvent event; 1417 event.when = when; 1418 event.deviceId = deviceId; 1419 event.type = type; 1420 event.code = code; 1421 event.value = value; 1422 mapper->process(&event); 1423 } 1424 1425 static void assertMotionRange(const InputDeviceInfo& info, 1426 int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) { 1427 const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source); 1428 ASSERT_TRUE(range != NULL) << "Axis: " << axis << " Source: " << source; 1429 ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source; 1430 ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source; 1431 ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source; 1432 ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source; 1433 ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source; 1434 ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source; 1435 } 1436 1437 static void assertPointerCoords(const PointerCoords& coords, 1438 float x, float y, float pressure, float size, 1439 float touchMajor, float touchMinor, float toolMajor, float toolMinor, 1440 float orientation, float distance) { 1441 ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1); 1442 ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 1443 ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON); 1444 ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON); 1445 ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1); 1446 ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1); 1447 ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1); 1448 ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1); 1449 ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON); 1450 ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON); 1451 } 1452 1453 static void assertPosition(const sp<FakePointerController>& controller, float x, float y) { 1454 float actualX, actualY; 1455 controller->getPosition(&actualX, &actualY); 1456 ASSERT_NEAR(x, actualX, 1); 1457 ASSERT_NEAR(y, actualY, 1); 1458 } 1459 }; 1460 1461 const char* InputMapperTest::DEVICE_NAME = "device"; 1462 const int32_t InputMapperTest::DEVICE_ID = 1; 1463 const int32_t InputMapperTest::DEVICE_GENERATION = 2; 1464 const uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests 1465 1466 1467 // --- SwitchInputMapperTest --- 1468 1469 class SwitchInputMapperTest : public InputMapperTest { 1470 protected: 1471 }; 1472 1473 TEST_F(SwitchInputMapperTest, GetSources) { 1474 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice); 1475 addMapperAndConfigure(mapper); 1476 1477 ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources()); 1478 } 1479 1480 TEST_F(SwitchInputMapperTest, GetSwitchState) { 1481 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice); 1482 addMapperAndConfigure(mapper); 1483 1484 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1); 1485 ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID)); 1486 1487 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0); 1488 ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID)); 1489 } 1490 1491 TEST_F(SwitchInputMapperTest, Process) { 1492 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice); 1493 addMapperAndConfigure(mapper); 1494 1495 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_LID, 1); 1496 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_JACK_PHYSICAL_INSERT, 1); 1497 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_HEADPHONE_INSERT, 0); 1498 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 1499 1500 NotifySwitchArgs args; 1501 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args)); 1502 ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1503 ASSERT_EQ((1 << SW_LID) | (1 << SW_JACK_PHYSICAL_INSERT), args.switchValues); 1504 ASSERT_EQ((1 << SW_LID) | (1 << SW_JACK_PHYSICAL_INSERT) | (1 << SW_HEADPHONE_INSERT), 1505 args.switchMask); 1506 ASSERT_EQ(uint32_t(0), args.policyFlags); 1507 } 1508 1509 1510 // --- KeyboardInputMapperTest --- 1511 1512 class KeyboardInputMapperTest : public InputMapperTest { 1513 protected: 1514 void testDPadKeyRotation(KeyboardInputMapper* mapper, 1515 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode); 1516 }; 1517 1518 void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper, 1519 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) { 1520 NotifyKeyArgs args; 1521 1522 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 1); 1523 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1524 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1525 ASSERT_EQ(originalScanCode, args.scanCode); 1526 ASSERT_EQ(rotatedKeyCode, args.keyCode); 1527 1528 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 0); 1529 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1530 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1531 ASSERT_EQ(originalScanCode, args.scanCode); 1532 ASSERT_EQ(rotatedKeyCode, args.keyCode); 1533 } 1534 1535 1536 TEST_F(KeyboardInputMapperTest, GetSources) { 1537 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1538 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1539 addMapperAndConfigure(mapper); 1540 1541 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources()); 1542 } 1543 1544 TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) { 1545 const int32_t USAGE_A = 0x070004; 1546 const int32_t USAGE_UNKNOWN = 0x07ffff; 1547 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE); 1548 mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE); 1549 1550 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1551 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1552 addMapperAndConfigure(mapper); 1553 1554 // Key down by scan code. 1555 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1556 EV_KEY, KEY_HOME, 1); 1557 NotifyKeyArgs args; 1558 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1559 ASSERT_EQ(DEVICE_ID, args.deviceId); 1560 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 1561 ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1562 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1563 ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 1564 ASSERT_EQ(KEY_HOME, args.scanCode); 1565 ASSERT_EQ(AMETA_NONE, args.metaState); 1566 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 1567 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 1568 ASSERT_EQ(ARBITRARY_TIME, args.downTime); 1569 1570 // Key up by scan code. 1571 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 1572 EV_KEY, KEY_HOME, 0); 1573 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1574 ASSERT_EQ(DEVICE_ID, args.deviceId); 1575 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 1576 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 1577 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1578 ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 1579 ASSERT_EQ(KEY_HOME, args.scanCode); 1580 ASSERT_EQ(AMETA_NONE, args.metaState); 1581 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 1582 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 1583 ASSERT_EQ(ARBITRARY_TIME, args.downTime); 1584 1585 // Key down by usage code. 1586 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1587 EV_MSC, MSC_SCAN, USAGE_A); 1588 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1589 EV_KEY, 0, 1); 1590 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1591 ASSERT_EQ(DEVICE_ID, args.deviceId); 1592 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 1593 ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1594 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1595 ASSERT_EQ(AKEYCODE_A, args.keyCode); 1596 ASSERT_EQ(0, args.scanCode); 1597 ASSERT_EQ(AMETA_NONE, args.metaState); 1598 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 1599 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 1600 ASSERT_EQ(ARBITRARY_TIME, args.downTime); 1601 1602 // Key up by usage code. 1603 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1604 EV_MSC, MSC_SCAN, USAGE_A); 1605 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 1606 EV_KEY, 0, 0); 1607 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1608 ASSERT_EQ(DEVICE_ID, args.deviceId); 1609 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 1610 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 1611 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1612 ASSERT_EQ(AKEYCODE_A, args.keyCode); 1613 ASSERT_EQ(0, args.scanCode); 1614 ASSERT_EQ(AMETA_NONE, args.metaState); 1615 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 1616 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 1617 ASSERT_EQ(ARBITRARY_TIME, args.downTime); 1618 1619 // Key down with unknown scan code or usage code. 1620 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1621 EV_MSC, MSC_SCAN, USAGE_UNKNOWN); 1622 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1623 EV_KEY, KEY_UNKNOWN, 1); 1624 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1625 ASSERT_EQ(DEVICE_ID, args.deviceId); 1626 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 1627 ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1628 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1629 ASSERT_EQ(0, args.keyCode); 1630 ASSERT_EQ(KEY_UNKNOWN, args.scanCode); 1631 ASSERT_EQ(AMETA_NONE, args.metaState); 1632 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 1633 ASSERT_EQ(0U, args.policyFlags); 1634 ASSERT_EQ(ARBITRARY_TIME, args.downTime); 1635 1636 // Key up with unknown scan code or usage code. 1637 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1638 EV_MSC, MSC_SCAN, USAGE_UNKNOWN); 1639 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 1640 EV_KEY, KEY_UNKNOWN, 0); 1641 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1642 ASSERT_EQ(DEVICE_ID, args.deviceId); 1643 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 1644 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 1645 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1646 ASSERT_EQ(0, args.keyCode); 1647 ASSERT_EQ(KEY_UNKNOWN, args.scanCode); 1648 ASSERT_EQ(AMETA_NONE, args.metaState); 1649 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 1650 ASSERT_EQ(0U, args.policyFlags); 1651 ASSERT_EQ(ARBITRARY_TIME, args.downTime); 1652 } 1653 1654 TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) { 1655 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0); 1656 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0); 1657 1658 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1659 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1660 addMapperAndConfigure(mapper); 1661 1662 // Initial metastate. 1663 ASSERT_EQ(AMETA_NONE, mapper->getMetaState()); 1664 1665 // Metakey down. 1666 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1667 EV_KEY, KEY_LEFTSHIFT, 1); 1668 NotifyKeyArgs args; 1669 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1670 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 1671 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState()); 1672 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled()); 1673 1674 // Key down. 1675 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 1676 EV_KEY, KEY_A, 1); 1677 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1678 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 1679 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState()); 1680 1681 // Key up. 1682 process(mapper, ARBITRARY_TIME + 2, DEVICE_ID, 1683 EV_KEY, KEY_A, 0); 1684 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1685 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 1686 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState()); 1687 1688 // Metakey up. 1689 process(mapper, ARBITRARY_TIME + 3, DEVICE_ID, 1690 EV_KEY, KEY_LEFTSHIFT, 0); 1691 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1692 ASSERT_EQ(AMETA_NONE, args.metaState); 1693 ASSERT_EQ(AMETA_NONE, mapper->getMetaState()); 1694 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled()); 1695 } 1696 1697 TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) { 1698 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0); 1699 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0); 1700 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0); 1701 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0); 1702 1703 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1704 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1705 addMapperAndConfigure(mapper); 1706 1707 setDisplayInfoAndReconfigure(DISPLAY_ID, 1708 DISPLAY_WIDTH, DISPLAY_HEIGHT, 1709 DISPLAY_ORIENTATION_90); 1710 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1711 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP)); 1712 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1713 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT)); 1714 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1715 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN)); 1716 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1717 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT)); 1718 } 1719 1720 TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) { 1721 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0); 1722 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0); 1723 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0); 1724 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0); 1725 1726 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1727 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1728 addConfigurationProperty("keyboard.orientationAware", "1"); 1729 addMapperAndConfigure(mapper); 1730 1731 setDisplayInfoAndReconfigure(DISPLAY_ID, 1732 DISPLAY_WIDTH, DISPLAY_HEIGHT, 1733 DISPLAY_ORIENTATION_0); 1734 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1735 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP)); 1736 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1737 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT)); 1738 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1739 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN)); 1740 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1741 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT)); 1742 1743 setDisplayInfoAndReconfigure(DISPLAY_ID, 1744 DISPLAY_WIDTH, DISPLAY_HEIGHT, 1745 DISPLAY_ORIENTATION_90); 1746 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1747 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT)); 1748 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1749 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP)); 1750 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1751 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT)); 1752 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1753 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN)); 1754 1755 setDisplayInfoAndReconfigure(DISPLAY_ID, 1756 DISPLAY_WIDTH, DISPLAY_HEIGHT, 1757 DISPLAY_ORIENTATION_180); 1758 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1759 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN)); 1760 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1761 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT)); 1762 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1763 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP)); 1764 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1765 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT)); 1766 1767 setDisplayInfoAndReconfigure(DISPLAY_ID, 1768 DISPLAY_WIDTH, DISPLAY_HEIGHT, 1769 DISPLAY_ORIENTATION_270); 1770 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1771 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT)); 1772 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1773 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN)); 1774 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1775 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT)); 1776 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1777 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP)); 1778 1779 // Special case: if orientation changes while key is down, we still emit the same keycode 1780 // in the key up as we did in the key down. 1781 NotifyKeyArgs args; 1782 1783 setDisplayInfoAndReconfigure(DISPLAY_ID, 1784 DISPLAY_WIDTH, DISPLAY_HEIGHT, 1785 DISPLAY_ORIENTATION_270); 1786 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1); 1787 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1788 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1789 ASSERT_EQ(KEY_UP, args.scanCode); 1790 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode); 1791 1792 setDisplayInfoAndReconfigure(DISPLAY_ID, 1793 DISPLAY_WIDTH, DISPLAY_HEIGHT, 1794 DISPLAY_ORIENTATION_180); 1795 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0); 1796 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1797 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1798 ASSERT_EQ(KEY_UP, args.scanCode); 1799 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode); 1800 } 1801 1802 TEST_F(KeyboardInputMapperTest, GetKeyCodeState) { 1803 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1804 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1805 addMapperAndConfigure(mapper); 1806 1807 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1); 1808 ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A)); 1809 1810 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0); 1811 ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A)); 1812 } 1813 1814 TEST_F(KeyboardInputMapperTest, GetScanCodeState) { 1815 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1816 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1817 addMapperAndConfigure(mapper); 1818 1819 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1); 1820 ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A)); 1821 1822 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0); 1823 ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A)); 1824 } 1825 1826 TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) { 1827 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1828 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1829 addMapperAndConfigure(mapper); 1830 1831 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0); 1832 1833 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B }; 1834 uint8_t flags[2] = { 0, 0 }; 1835 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags)); 1836 ASSERT_TRUE(flags[0]); 1837 ASSERT_FALSE(flags[1]); 1838 } 1839 1840 TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) { 1841 mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/); 1842 mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/); 1843 mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/); 1844 mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0); 1845 mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0); 1846 mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0); 1847 1848 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1849 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1850 addMapperAndConfigure(mapper); 1851 1852 // Initialization should have turned all of the lights off. 1853 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 1854 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 1855 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 1856 1857 // Toggle caps lock on. 1858 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1859 EV_KEY, KEY_CAPSLOCK, 1); 1860 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1861 EV_KEY, KEY_CAPSLOCK, 0); 1862 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 1863 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 1864 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 1865 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState()); 1866 1867 // Toggle num lock on. 1868 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1869 EV_KEY, KEY_NUMLOCK, 1); 1870 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1871 EV_KEY, KEY_NUMLOCK, 0); 1872 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 1873 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 1874 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 1875 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState()); 1876 1877 // Toggle caps lock off. 1878 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1879 EV_KEY, KEY_CAPSLOCK, 1); 1880 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1881 EV_KEY, KEY_CAPSLOCK, 0); 1882 ASSERT_FALSE(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_NUM_LOCK_ON, mapper->getMetaState()); 1886 1887 // Toggle scroll lock on. 1888 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1889 EV_KEY, KEY_SCROLLLOCK, 1); 1890 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1891 EV_KEY, KEY_SCROLLLOCK, 0); 1892 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 1893 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 1894 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 1895 ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState()); 1896 1897 // Toggle num lock off. 1898 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1899 EV_KEY, KEY_NUMLOCK, 1); 1900 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1901 EV_KEY, KEY_NUMLOCK, 0); 1902 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 1903 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 1904 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 1905 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState()); 1906 1907 // Toggle scroll lock off. 1908 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1909 EV_KEY, KEY_SCROLLLOCK, 1); 1910 process(mapper, ARBITRARY_TIME, DEVICE_ID, 1911 EV_KEY, KEY_SCROLLLOCK, 0); 1912 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 1913 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 1914 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 1915 ASSERT_EQ(AMETA_NONE, mapper->getMetaState()); 1916 } 1917 1918 1919 // --- CursorInputMapperTest --- 1920 1921 class CursorInputMapperTest : public InputMapperTest { 1922 protected: 1923 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD; 1924 1925 sp<FakePointerController> mFakePointerController; 1926 1927 virtual void SetUp() { 1928 InputMapperTest::SetUp(); 1929 1930 mFakePointerController = new FakePointerController(); 1931 mFakePolicy->setPointerController(DEVICE_ID, mFakePointerController); 1932 } 1933 1934 void testMotionRotation(CursorInputMapper* mapper, 1935 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY); 1936 }; 1937 1938 const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6; 1939 1940 void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper, 1941 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) { 1942 NotifyMotionArgs args; 1943 1944 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, originalX); 1945 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, originalY); 1946 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 1947 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 1948 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 1949 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 1950 float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD, 1951 float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD, 1952 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 1953 } 1954 1955 TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) { 1956 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 1957 addConfigurationProperty("cursor.mode", "pointer"); 1958 addMapperAndConfigure(mapper); 1959 1960 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources()); 1961 } 1962 1963 TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) { 1964 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 1965 addConfigurationProperty("cursor.mode", "navigation"); 1966 addMapperAndConfigure(mapper); 1967 1968 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources()); 1969 } 1970 1971 TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) { 1972 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 1973 addConfigurationProperty("cursor.mode", "pointer"); 1974 addMapperAndConfigure(mapper); 1975 1976 InputDeviceInfo info; 1977 mapper->populateDeviceInfo(&info); 1978 1979 // Initially there may not be a valid motion range. 1980 ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE)); 1981 ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE)); 1982 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 1983 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f)); 1984 1985 // When the bounds are set, then there should be a valid motion range. 1986 mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1); 1987 1988 InputDeviceInfo info2; 1989 mapper->populateDeviceInfo(&info2); 1990 1991 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, 1992 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE, 1993 1, 800 - 1, 0.0f, 0.0f)); 1994 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, 1995 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE, 1996 2, 480 - 1, 0.0f, 0.0f)); 1997 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, 1998 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 1999 0.0f, 1.0f, 0.0f, 0.0f)); 2000 } 2001 2002 TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) { 2003 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2004 addConfigurationProperty("cursor.mode", "navigation"); 2005 addMapperAndConfigure(mapper); 2006 2007 InputDeviceInfo info; 2008 mapper->populateDeviceInfo(&info); 2009 2010 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 2011 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL, 2012 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD)); 2013 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 2014 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL, 2015 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD)); 2016 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 2017 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL, 2018 0.0f, 1.0f, 0.0f, 0.0f)); 2019 } 2020 2021 TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) { 2022 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2023 addConfigurationProperty("cursor.mode", "navigation"); 2024 addMapperAndConfigure(mapper); 2025 2026 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2027 2028 NotifyMotionArgs args; 2029 2030 // Button press. 2031 // Mostly testing non x/y behavior here so we don't need to check again elsewhere. 2032 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1); 2033 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2034 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2035 ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 2036 ASSERT_EQ(DEVICE_ID, args.deviceId); 2037 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source); 2038 ASSERT_EQ(uint32_t(0), args.policyFlags); 2039 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 2040 ASSERT_EQ(0, args.flags); 2041 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2042 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState); 2043 ASSERT_EQ(0, args.edgeFlags); 2044 ASSERT_EQ(uint32_t(1), args.pointerCount); 2045 ASSERT_EQ(0, args.pointerProperties[0].id); 2046 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType); 2047 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2048 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2049 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision); 2050 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision); 2051 ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2052 2053 // Button release. Should have same down time. 2054 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_KEY, BTN_MOUSE, 0); 2055 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2056 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2057 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 2058 ASSERT_EQ(DEVICE_ID, args.deviceId); 2059 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source); 2060 ASSERT_EQ(uint32_t(0), args.policyFlags); 2061 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action); 2062 ASSERT_EQ(0, args.flags); 2063 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2064 ASSERT_EQ(0, args.buttonState); 2065 ASSERT_EQ(0, args.edgeFlags); 2066 ASSERT_EQ(uint32_t(1), args.pointerCount); 2067 ASSERT_EQ(0, args.pointerProperties[0].id); 2068 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType); 2069 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2070 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2071 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision); 2072 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision); 2073 ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2074 } 2075 2076 TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) { 2077 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2078 addConfigurationProperty("cursor.mode", "navigation"); 2079 addMapperAndConfigure(mapper); 2080 2081 NotifyMotionArgs args; 2082 2083 // Motion in X but not Y. 2084 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1); 2085 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2086 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2087 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 2088 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2089 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2090 2091 // Motion in Y but not X. 2092 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2); 2093 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2094 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2095 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 2096 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2097 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2098 } 2099 2100 TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) { 2101 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2102 addConfigurationProperty("cursor.mode", "navigation"); 2103 addMapperAndConfigure(mapper); 2104 2105 NotifyMotionArgs args; 2106 2107 // Button press. 2108 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1); 2109 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2110 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2111 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 2112 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2113 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2114 2115 // Button release. 2116 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0); 2117 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2118 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2119 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action); 2120 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2121 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2122 } 2123 2124 TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) { 2125 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2126 addConfigurationProperty("cursor.mode", "navigation"); 2127 addMapperAndConfigure(mapper); 2128 2129 NotifyMotionArgs args; 2130 2131 // Combined X, Y and Button. 2132 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1); 2133 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2); 2134 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1); 2135 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2136 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2137 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 2138 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2139 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 2140 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2141 2142 // Move X, Y a bit while pressed. 2143 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 2); 2144 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 1); 2145 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2146 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2147 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 2148 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2149 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 2150 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2151 2152 // Release Button. 2153 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0); 2154 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2155 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2156 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action); 2157 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2158 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2159 } 2160 2161 TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) { 2162 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2163 addConfigurationProperty("cursor.mode", "navigation"); 2164 addMapperAndConfigure(mapper); 2165 2166 setDisplayInfoAndReconfigure(DISPLAY_ID, 2167 DISPLAY_WIDTH, DISPLAY_HEIGHT, 2168 DISPLAY_ORIENTATION_90); 2169 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1)); 2170 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1)); 2171 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0)); 2172 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1)); 2173 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1)); 2174 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1)); 2175 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0)); 2176 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1)); 2177 } 2178 2179 TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) { 2180 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2181 addConfigurationProperty("cursor.mode", "navigation"); 2182 addConfigurationProperty("cursor.orientationAware", "1"); 2183 addMapperAndConfigure(mapper); 2184 2185 setDisplayInfoAndReconfigure(DISPLAY_ID, 2186 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0); 2187 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1)); 2188 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1)); 2189 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0)); 2190 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1)); 2191 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1)); 2192 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1)); 2193 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0)); 2194 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1)); 2195 2196 setDisplayInfoAndReconfigure(DISPLAY_ID, 2197 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_90); 2198 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0)); 2199 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1)); 2200 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1)); 2201 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1)); 2202 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0)); 2203 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1)); 2204 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1)); 2205 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1)); 2206 2207 setDisplayInfoAndReconfigure(DISPLAY_ID, 2208 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_180); 2209 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1)); 2210 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1)); 2211 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0)); 2212 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1)); 2213 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1)); 2214 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1)); 2215 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0)); 2216 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1)); 2217 2218 setDisplayInfoAndReconfigure(DISPLAY_ID, 2219 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_270); 2220 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0)); 2221 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1)); 2222 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1)); 2223 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1)); 2224 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0)); 2225 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1)); 2226 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1)); 2227 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1)); 2228 } 2229 2230 TEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) { 2231 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2232 addConfigurationProperty("cursor.mode", "pointer"); 2233 addMapperAndConfigure(mapper); 2234 2235 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); 2236 mFakePointerController->setPosition(100, 200); 2237 mFakePointerController->setButtonState(0); 2238 2239 NotifyMotionArgs motionArgs; 2240 NotifyKeyArgs keyArgs; 2241 2242 // press BTN_LEFT, release BTN_LEFT 2243 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 1); 2244 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2245 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2246 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2247 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState); 2248 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState()); 2249 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2250 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2251 2252 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 0); 2253 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2254 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2255 ASSERT_EQ(0, motionArgs.buttonState); 2256 ASSERT_EQ(0, mFakePointerController->getButtonState()); 2257 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 2258 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2259 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2260 2261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2262 ASSERT_EQ(0, motionArgs.buttonState); 2263 ASSERT_EQ(0, mFakePointerController->getButtonState()); 2264 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2265 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2266 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2267 2268 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE 2269 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 1); 2270 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 1); 2271 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2272 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2273 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2274 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 2275 motionArgs.buttonState); 2276 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 2277 mFakePointerController->getButtonState()); 2278 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2279 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2280 2281 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 0); 2282 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2283 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2284 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 2285 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState()); 2286 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 2287 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2288 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2289 2290 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 0); 2291 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2292 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2293 ASSERT_EQ(0, motionArgs.buttonState); 2294 ASSERT_EQ(0, mFakePointerController->getButtonState()); 2295 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 2296 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2297 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2298 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2299 ASSERT_EQ(0, motionArgs.buttonState); 2300 ASSERT_EQ(0, mFakePointerController->getButtonState()); 2301 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2302 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2303 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2304 2305 // press BTN_BACK, release BTN_BACK 2306 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 1); 2307 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2308 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2309 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2310 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2311 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2312 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 2313 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState()); 2314 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2315 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2316 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2317 2318 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 0); 2319 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2320 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2321 ASSERT_EQ(0, motionArgs.buttonState); 2322 ASSERT_EQ(0, mFakePointerController->getButtonState()); 2323 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2324 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2325 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2326 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2327 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2328 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2329 2330 // press BTN_SIDE, release BTN_SIDE 2331 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 1); 2332 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2333 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2334 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2335 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2336 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2337 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 2338 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState()); 2339 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2340 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2341 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2342 2343 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 0); 2344 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2345 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2346 ASSERT_EQ(0, motionArgs.buttonState); 2347 ASSERT_EQ(0, mFakePointerController->getButtonState()); 2348 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2349 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2350 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2351 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2352 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2353 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2354 2355 // press BTN_FORWARD, release BTN_FORWARD 2356 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 1); 2357 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2358 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2359 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2360 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2361 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2362 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 2363 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState()); 2364 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2365 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2366 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2367 2368 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 0); 2369 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2370 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2371 ASSERT_EQ(0, motionArgs.buttonState); 2372 ASSERT_EQ(0, mFakePointerController->getButtonState()); 2373 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2374 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2375 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2376 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2377 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2378 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2379 2380 // press BTN_EXTRA, release BTN_EXTRA 2381 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 1); 2382 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2383 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2384 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2385 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2386 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2387 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 2388 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState()); 2389 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2390 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2391 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2392 2393 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 0); 2394 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2395 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2396 ASSERT_EQ(0, motionArgs.buttonState); 2397 ASSERT_EQ(0, mFakePointerController->getButtonState()); 2398 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2399 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2400 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2401 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2402 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2403 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2404 } 2405 2406 TEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) { 2407 CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2408 addConfigurationProperty("cursor.mode", "pointer"); 2409 addMapperAndConfigure(mapper); 2410 2411 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); 2412 mFakePointerController->setPosition(100, 200); 2413 mFakePointerController->setButtonState(0); 2414 2415 NotifyMotionArgs args; 2416 2417 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10); 2418 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20); 2419 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2420 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2421 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action); 2422 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2423 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2424 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f)); 2425 } 2426 2427 2428 // --- TouchInputMapperTest --- 2429 2430 class TouchInputMapperTest : public InputMapperTest { 2431 protected: 2432 static const int32_t RAW_X_MIN; 2433 static const int32_t RAW_X_MAX; 2434 static const int32_t RAW_Y_MIN; 2435 static const int32_t RAW_Y_MAX; 2436 static const int32_t RAW_TOUCH_MIN; 2437 static const int32_t RAW_TOUCH_MAX; 2438 static const int32_t RAW_TOOL_MIN; 2439 static const int32_t RAW_TOOL_MAX; 2440 static const int32_t RAW_PRESSURE_MIN; 2441 static const int32_t RAW_PRESSURE_MAX; 2442 static const int32_t RAW_ORIENTATION_MIN; 2443 static const int32_t RAW_ORIENTATION_MAX; 2444 static const int32_t RAW_DISTANCE_MIN; 2445 static const int32_t RAW_DISTANCE_MAX; 2446 static const int32_t RAW_TILT_MIN; 2447 static const int32_t RAW_TILT_MAX; 2448 static const int32_t RAW_ID_MIN; 2449 static const int32_t RAW_ID_MAX; 2450 static const int32_t RAW_SLOT_MIN; 2451 static const int32_t RAW_SLOT_MAX; 2452 static const float X_PRECISION; 2453 static const float Y_PRECISION; 2454 2455 static const float GEOMETRIC_SCALE; 2456 2457 static const VirtualKeyDefinition VIRTUAL_KEYS[2]; 2458 2459 enum Axes { 2460 POSITION = 1 << 0, 2461 TOUCH = 1 << 1, 2462 TOOL = 1 << 2, 2463 PRESSURE = 1 << 3, 2464 ORIENTATION = 1 << 4, 2465 MINOR = 1 << 5, 2466 ID = 1 << 6, 2467 DISTANCE = 1 << 7, 2468 TILT = 1 << 8, 2469 SLOT = 1 << 9, 2470 TOOL_TYPE = 1 << 10, 2471 }; 2472 2473 void prepareDisplay(int32_t orientation); 2474 void prepareVirtualKeys(); 2475 int32_t toRawX(float displayX); 2476 int32_t toRawY(float displayY); 2477 float toDisplayX(int32_t rawX); 2478 float toDisplayY(int32_t rawY); 2479 }; 2480 2481 const int32_t TouchInputMapperTest::RAW_X_MIN = 25; 2482 const int32_t TouchInputMapperTest::RAW_X_MAX = 1019; 2483 const int32_t TouchInputMapperTest::RAW_Y_MIN = 30; 2484 const int32_t TouchInputMapperTest::RAW_Y_MAX = 1009; 2485 const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0; 2486 const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31; 2487 const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0; 2488 const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15; 2489 const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = RAW_TOUCH_MIN; 2490 const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = RAW_TOUCH_MAX; 2491 const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7; 2492 const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7; 2493 const int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0; 2494 const int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7; 2495 const int32_t TouchInputMapperTest::RAW_TILT_MIN = 0; 2496 const int32_t TouchInputMapperTest::RAW_TILT_MAX = 150; 2497 const int32_t TouchInputMapperTest::RAW_ID_MIN = 0; 2498 const int32_t TouchInputMapperTest::RAW_ID_MAX = 9; 2499 const int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0; 2500 const int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9; 2501 const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH; 2502 const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT; 2503 2504 const float TouchInputMapperTest::GEOMETRIC_SCALE = 2505 avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1), 2506 float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1)); 2507 2508 const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = { 2509 { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 }, 2510 { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 }, 2511 }; 2512 2513 void TouchInputMapperTest::prepareDisplay(int32_t orientation) { 2514 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation); 2515 } 2516 2517 void TouchInputMapperTest::prepareVirtualKeys() { 2518 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]); 2519 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]); 2520 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE); 2521 mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE); 2522 } 2523 2524 int32_t TouchInputMapperTest::toRawX(float displayX) { 2525 return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN); 2526 } 2527 2528 int32_t TouchInputMapperTest::toRawY(float displayY) { 2529 return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN); 2530 } 2531 2532 float TouchInputMapperTest::toDisplayX(int32_t rawX) { 2533 return float(rawX - RAW_X_MIN) * DISPLAY_WIDTH / (RAW_X_MAX - RAW_X_MIN + 1); 2534 } 2535 2536 float TouchInputMapperTest::toDisplayY(int32_t rawY) { 2537 return float(rawY - RAW_Y_MIN) * DISPLAY_HEIGHT / (RAW_Y_MAX - RAW_Y_MIN + 1); 2538 } 2539 2540 2541 // --- SingleTouchInputMapperTest --- 2542 2543 class SingleTouchInputMapperTest : public TouchInputMapperTest { 2544 protected: 2545 void prepareButtons(); 2546 void prepareAxes(int axes); 2547 2548 void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y); 2549 void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y); 2550 void processUp(SingleTouchInputMapper* mappery); 2551 void processPressure(SingleTouchInputMapper* mapper, int32_t pressure); 2552 void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor); 2553 void processDistance(SingleTouchInputMapper* mapper, int32_t distance); 2554 void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY); 2555 void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value); 2556 void processSync(SingleTouchInputMapper* mapper); 2557 }; 2558 2559 void SingleTouchInputMapperTest::prepareButtons() { 2560 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0); 2561 } 2562 2563 void SingleTouchInputMapperTest::prepareAxes(int axes) { 2564 if (axes & POSITION) { 2565 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X, 2566 RAW_X_MIN, RAW_X_MAX, 0, 0); 2567 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y, 2568 RAW_Y_MIN, RAW_Y_MAX, 0, 0); 2569 } 2570 if (axes & PRESSURE) { 2571 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE, 2572 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0); 2573 } 2574 if (axes & TOOL) { 2575 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH, 2576 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0); 2577 } 2578 if (axes & DISTANCE) { 2579 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE, 2580 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0); 2581 } 2582 if (axes & TILT) { 2583 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X, 2584 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0); 2585 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y, 2586 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0); 2587 } 2588 } 2589 2590 void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) { 2591 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 1); 2592 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x); 2593 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y); 2594 } 2595 2596 void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) { 2597 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x); 2598 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y); 2599 } 2600 2601 void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) { 2602 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 0); 2603 } 2604 2605 void SingleTouchInputMapperTest::processPressure( 2606 SingleTouchInputMapper* mapper, int32_t pressure) { 2607 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_PRESSURE, pressure); 2608 } 2609 2610 void SingleTouchInputMapperTest::processToolMajor( 2611 SingleTouchInputMapper* mapper, int32_t toolMajor) { 2612 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TOOL_WIDTH, toolMajor); 2613 } 2614 2615 void SingleTouchInputMapperTest::processDistance( 2616 SingleTouchInputMapper* mapper, int32_t distance) { 2617 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_DISTANCE, distance); 2618 } 2619 2620 void SingleTouchInputMapperTest::processTilt( 2621 SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) { 2622 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_X, tiltX); 2623 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_Y, tiltY); 2624 } 2625 2626 void SingleTouchInputMapperTest::processKey( 2627 SingleTouchInputMapper* mapper, int32_t code, int32_t value) { 2628 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value); 2629 } 2630 2631 void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) { 2632 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2633 } 2634 2635 2636 TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) { 2637 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2638 prepareButtons(); 2639 prepareAxes(POSITION); 2640 addMapperAndConfigure(mapper); 2641 2642 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources()); 2643 } 2644 2645 TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) { 2646 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2647 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X); 2648 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y); 2649 prepareButtons(); 2650 prepareAxes(POSITION); 2651 addMapperAndConfigure(mapper); 2652 2653 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources()); 2654 } 2655 2656 TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) { 2657 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2658 prepareButtons(); 2659 prepareAxes(POSITION); 2660 addConfigurationProperty("touch.deviceType", "touchPad"); 2661 addMapperAndConfigure(mapper); 2662 2663 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources()); 2664 } 2665 2666 TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) { 2667 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2668 prepareButtons(); 2669 prepareAxes(POSITION); 2670 addConfigurationProperty("touch.deviceType", "touchScreen"); 2671 addMapperAndConfigure(mapper); 2672 2673 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources()); 2674 } 2675 2676 TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) { 2677 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2678 addConfigurationProperty("touch.deviceType", "touchScreen"); 2679 prepareDisplay(DISPLAY_ORIENTATION_0); 2680 prepareButtons(); 2681 prepareAxes(POSITION); 2682 prepareVirtualKeys(); 2683 addMapperAndConfigure(mapper); 2684 2685 // Unknown key. 2686 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A)); 2687 2688 // Virtual key is down. 2689 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2690 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2691 processDown(mapper, x, y); 2692 processSync(mapper); 2693 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2694 2695 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME)); 2696 2697 // Virtual key is up. 2698 processUp(mapper); 2699 processSync(mapper); 2700 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2701 2702 ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME)); 2703 } 2704 2705 TEST_F(SingleTouchInputMapperTest, GetScanCodeState) { 2706 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2707 addConfigurationProperty("touch.deviceType", "touchScreen"); 2708 prepareDisplay(DISPLAY_ORIENTATION_0); 2709 prepareButtons(); 2710 prepareAxes(POSITION); 2711 prepareVirtualKeys(); 2712 addMapperAndConfigure(mapper); 2713 2714 // Unknown key. 2715 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A)); 2716 2717 // Virtual key is down. 2718 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2719 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2720 processDown(mapper, x, y); 2721 processSync(mapper); 2722 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2723 2724 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME)); 2725 2726 // Virtual key is up. 2727 processUp(mapper); 2728 processSync(mapper); 2729 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2730 2731 ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME)); 2732 } 2733 2734 TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) { 2735 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2736 addConfigurationProperty("touch.deviceType", "touchScreen"); 2737 prepareDisplay(DISPLAY_ORIENTATION_0); 2738 prepareButtons(); 2739 prepareAxes(POSITION); 2740 prepareVirtualKeys(); 2741 addMapperAndConfigure(mapper); 2742 2743 const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A }; 2744 uint8_t flags[2] = { 0, 0 }; 2745 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags)); 2746 ASSERT_TRUE(flags[0]); 2747 ASSERT_FALSE(flags[1]); 2748 } 2749 2750 TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) { 2751 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2752 addConfigurationProperty("touch.deviceType", "touchScreen"); 2753 prepareDisplay(DISPLAY_ORIENTATION_0); 2754 prepareButtons(); 2755 prepareAxes(POSITION); 2756 prepareVirtualKeys(); 2757 addMapperAndConfigure(mapper); 2758 2759 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2760 2761 NotifyKeyArgs args; 2762 2763 // Press virtual key. 2764 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2765 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2766 processDown(mapper, x, y); 2767 processSync(mapper); 2768 2769 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 2770 ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 2771 ASSERT_EQ(DEVICE_ID, args.deviceId); 2772 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 2773 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags); 2774 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 2775 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags); 2776 ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 2777 ASSERT_EQ(KEY_HOME, args.scanCode); 2778 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2779 ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2780 2781 // Release virtual key. 2782 processUp(mapper); 2783 processSync(mapper); 2784 2785 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 2786 ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 2787 ASSERT_EQ(DEVICE_ID, args.deviceId); 2788 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 2789 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags); 2790 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 2791 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags); 2792 ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 2793 ASSERT_EQ(KEY_HOME, args.scanCode); 2794 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2795 ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2796 2797 // Should not have sent any motions. 2798 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 2799 } 2800 2801 TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) { 2802 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2803 addConfigurationProperty("touch.deviceType", "touchScreen"); 2804 prepareDisplay(DISPLAY_ORIENTATION_0); 2805 prepareButtons(); 2806 prepareAxes(POSITION); 2807 prepareVirtualKeys(); 2808 addMapperAndConfigure(mapper); 2809 2810 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2811 2812 NotifyKeyArgs keyArgs; 2813 2814 // Press virtual key. 2815 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2816 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2817 processDown(mapper, x, y); 2818 processSync(mapper); 2819 2820 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2821 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime); 2822 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId); 2823 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source); 2824 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags); 2825 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2826 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags); 2827 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode); 2828 ASSERT_EQ(KEY_HOME, keyArgs.scanCode); 2829 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState); 2830 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime); 2831 2832 // Move out of bounds. This should generate a cancel and a pointer down since we moved 2833 // into the display area. 2834 y -= 100; 2835 processMove(mapper, x, y); 2836 processSync(mapper); 2837 2838 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2839 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime); 2840 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId); 2841 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source); 2842 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags); 2843 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2844 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY 2845 | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags); 2846 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode); 2847 ASSERT_EQ(KEY_HOME, keyArgs.scanCode); 2848 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState); 2849 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime); 2850 2851 NotifyMotionArgs motionArgs; 2852 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2853 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2854 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2855 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2856 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2857 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2858 ASSERT_EQ(0, motionArgs.flags); 2859 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2860 ASSERT_EQ(0, motionArgs.buttonState); 2861 ASSERT_EQ(0, motionArgs.edgeFlags); 2862 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2863 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2864 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2865 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2866 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2867 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2868 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2869 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2870 2871 // Keep moving out of bounds. Should generate a pointer move. 2872 y -= 50; 2873 processMove(mapper, x, y); 2874 processSync(mapper); 2875 2876 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2877 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2878 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2879 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2880 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2881 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 2882 ASSERT_EQ(0, motionArgs.flags); 2883 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2884 ASSERT_EQ(0, motionArgs.buttonState); 2885 ASSERT_EQ(0, motionArgs.edgeFlags); 2886 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2887 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2888 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2889 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2890 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2891 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2892 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2893 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2894 2895 // Release out of bounds. Should generate a pointer up. 2896 processUp(mapper); 2897 processSync(mapper); 2898 2899 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2900 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2901 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2902 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2903 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2904 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 2905 ASSERT_EQ(0, motionArgs.flags); 2906 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2907 ASSERT_EQ(0, motionArgs.buttonState); 2908 ASSERT_EQ(0, motionArgs.edgeFlags); 2909 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2910 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2911 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2912 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2913 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2914 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2915 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2916 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2917 2918 // Should not have sent any more keys or motions. 2919 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 2920 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 2921 } 2922 2923 TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) { 2924 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2925 addConfigurationProperty("touch.deviceType", "touchScreen"); 2926 prepareDisplay(DISPLAY_ORIENTATION_0); 2927 prepareButtons(); 2928 prepareAxes(POSITION); 2929 prepareVirtualKeys(); 2930 addMapperAndConfigure(mapper); 2931 2932 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2933 2934 NotifyMotionArgs motionArgs; 2935 2936 // Initially go down out of bounds. 2937 int32_t x = -10; 2938 int32_t y = -10; 2939 processDown(mapper, x, y); 2940 processSync(mapper); 2941 2942 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 2943 2944 // Move into the display area. Should generate a pointer down. 2945 x = 50; 2946 y = 75; 2947 processMove(mapper, x, y); 2948 processSync(mapper); 2949 2950 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2951 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2952 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2953 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2954 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2955 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2956 ASSERT_EQ(0, motionArgs.flags); 2957 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2958 ASSERT_EQ(0, motionArgs.buttonState); 2959 ASSERT_EQ(0, motionArgs.edgeFlags); 2960 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2961 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2962 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2963 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2964 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2965 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2966 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2967 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2968 2969 // Release. Should generate a pointer up. 2970 processUp(mapper); 2971 processSync(mapper); 2972 2973 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2974 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2975 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2976 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2977 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2978 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 2979 ASSERT_EQ(0, motionArgs.flags); 2980 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2981 ASSERT_EQ(0, motionArgs.buttonState); 2982 ASSERT_EQ(0, motionArgs.edgeFlags); 2983 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2984 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2985 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2986 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2987 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2988 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2989 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2990 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2991 2992 // Should not have sent any more keys or motions. 2993 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 2994 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 2995 } 2996 2997 TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) { 2998 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2999 addConfigurationProperty("touch.deviceType", "touchScreen"); 3000 prepareDisplay(DISPLAY_ORIENTATION_0); 3001 prepareButtons(); 3002 prepareAxes(POSITION); 3003 prepareVirtualKeys(); 3004 addMapperAndConfigure(mapper); 3005 3006 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 3007 3008 NotifyMotionArgs motionArgs; 3009 3010 // Down. 3011 int32_t x = 100; 3012 int32_t y = 125; 3013 processDown(mapper, x, y); 3014 processSync(mapper); 3015 3016 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3017 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3018 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3019 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3020 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3021 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3022 ASSERT_EQ(0, motionArgs.flags); 3023 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3024 ASSERT_EQ(0, motionArgs.buttonState); 3025 ASSERT_EQ(0, motionArgs.edgeFlags); 3026 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3027 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3028 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3029 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3030 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 3031 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3032 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3033 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3034 3035 // Move. 3036 x += 50; 3037 y += 75; 3038 processMove(mapper, x, y); 3039 processSync(mapper); 3040 3041 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3042 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3043 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3044 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3045 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3046 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3047 ASSERT_EQ(0, motionArgs.flags); 3048 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3049 ASSERT_EQ(0, motionArgs.buttonState); 3050 ASSERT_EQ(0, motionArgs.edgeFlags); 3051 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3052 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3053 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3054 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3055 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 3056 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3057 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3058 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3059 3060 // Up. 3061 processUp(mapper); 3062 processSync(mapper); 3063 3064 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3065 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3066 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3067 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3068 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3069 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3070 ASSERT_EQ(0, motionArgs.flags); 3071 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3072 ASSERT_EQ(0, motionArgs.buttonState); 3073 ASSERT_EQ(0, motionArgs.edgeFlags); 3074 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3075 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3076 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3077 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3078 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 3079 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3080 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3081 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3082 3083 // Should not have sent any more keys or motions. 3084 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 3085 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 3086 } 3087 3088 TEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) { 3089 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3090 addConfigurationProperty("touch.deviceType", "touchScreen"); 3091 prepareButtons(); 3092 prepareAxes(POSITION); 3093 addConfigurationProperty("touch.orientationAware", "0"); 3094 addMapperAndConfigure(mapper); 3095 3096 NotifyMotionArgs args; 3097 3098 // Rotation 90. 3099 prepareDisplay(DISPLAY_ORIENTATION_90); 3100 processDown(mapper, toRawX(50), toRawY(75)); 3101 processSync(mapper); 3102 3103 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3104 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 3105 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3106 3107 processUp(mapper); 3108 processSync(mapper); 3109 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3110 } 3111 3112 TEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) { 3113 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3114 addConfigurationProperty("touch.deviceType", "touchScreen"); 3115 prepareButtons(); 3116 prepareAxes(POSITION); 3117 addMapperAndConfigure(mapper); 3118 3119 NotifyMotionArgs args; 3120 3121 // Rotation 0. 3122 prepareDisplay(DISPLAY_ORIENTATION_0); 3123 processDown(mapper, toRawX(50), toRawY(75)); 3124 processSync(mapper); 3125 3126 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3127 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 3128 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3129 3130 processUp(mapper); 3131 processSync(mapper); 3132 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3133 3134 // Rotation 90. 3135 prepareDisplay(DISPLAY_ORIENTATION_90); 3136 processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50)); 3137 processSync(mapper); 3138 3139 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3140 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 3141 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3142 3143 processUp(mapper); 3144 processSync(mapper); 3145 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3146 3147 // Rotation 180. 3148 prepareDisplay(DISPLAY_ORIENTATION_180); 3149 processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN); 3150 processSync(mapper); 3151 3152 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3153 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 3154 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3155 3156 processUp(mapper); 3157 processSync(mapper); 3158 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3159 3160 // Rotation 270. 3161 prepareDisplay(DISPLAY_ORIENTATION_270); 3162 processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN); 3163 processSync(mapper); 3164 3165 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3166 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 3167 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3168 3169 processUp(mapper); 3170 processSync(mapper); 3171 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3172 } 3173 3174 TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) { 3175 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3176 addConfigurationProperty("touch.deviceType", "touchScreen"); 3177 prepareDisplay(DISPLAY_ORIENTATION_0); 3178 prepareButtons(); 3179 prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT); 3180 addMapperAndConfigure(mapper); 3181 3182 // These calculations are based on the input device calibration documentation. 3183 int32_t rawX = 100; 3184 int32_t rawY = 200; 3185 int32_t rawPressure = 10; 3186 int32_t rawToolMajor = 12; 3187 int32_t rawDistance = 2; 3188 int32_t rawTiltX = 30; 3189 int32_t rawTiltY = 110; 3190 3191 float x = toDisplayX(rawX); 3192 float y = toDisplayY(rawY); 3193 float pressure = float(rawPressure) / RAW_PRESSURE_MAX; 3194 float size = float(rawToolMajor) / RAW_TOOL_MAX; 3195 float tool = float(rawToolMajor) * GEOMETRIC_SCALE; 3196 float distance = float(rawDistance); 3197 3198 float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f; 3199 float tiltScale = M_PI / 180; 3200 float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale; 3201 float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale; 3202 float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle)); 3203 float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle)); 3204 3205 processDown(mapper, rawX, rawY); 3206 processPressure(mapper, rawPressure); 3207 processToolMajor(mapper, rawToolMajor); 3208 processDistance(mapper, rawDistance); 3209 processTilt(mapper, rawTiltX, rawTiltY); 3210 processSync(mapper); 3211 3212 NotifyMotionArgs args; 3213 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3214 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 3215 x, y, pressure, size, tool, tool, tool, tool, orientation, distance)); 3216 ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT)); 3217 } 3218 3219 TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) { 3220 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3221 addConfigurationProperty("touch.deviceType", "touchScreen"); 3222 prepareDisplay(DISPLAY_ORIENTATION_0); 3223 prepareButtons(); 3224 prepareAxes(POSITION); 3225 addMapperAndConfigure(mapper); 3226 3227 NotifyMotionArgs motionArgs; 3228 NotifyKeyArgs keyArgs; 3229 3230 processDown(mapper, 100, 200); 3231 processSync(mapper); 3232 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3233 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3234 ASSERT_EQ(0, motionArgs.buttonState); 3235 3236 // press BTN_LEFT, release BTN_LEFT 3237 processKey(mapper, BTN_LEFT, 1); 3238 processSync(mapper); 3239 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3240 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3241 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState); 3242 3243 processKey(mapper, BTN_LEFT, 0); 3244 processSync(mapper); 3245 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3246 ASSERT_EQ(0, motionArgs.buttonState); 3247 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3248 3249 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE 3250 processKey(mapper, BTN_RIGHT, 1); 3251 processKey(mapper, BTN_MIDDLE, 1); 3252 processSync(mapper); 3253 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3254 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3255 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 3256 motionArgs.buttonState); 3257 3258 processKey(mapper, BTN_RIGHT, 0); 3259 processSync(mapper); 3260 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3261 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 3262 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3263 3264 processKey(mapper, BTN_MIDDLE, 0); 3265 processSync(mapper); 3266 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3267 ASSERT_EQ(0, motionArgs.buttonState); 3268 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3269 3270 // press BTN_BACK, release BTN_BACK 3271 processKey(mapper, BTN_BACK, 1); 3272 processSync(mapper); 3273 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3274 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3275 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3276 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3277 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 3278 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3279 3280 processKey(mapper, BTN_BACK, 0); 3281 processSync(mapper); 3282 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3283 ASSERT_EQ(0, motionArgs.buttonState); 3284 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3285 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3286 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3287 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3288 3289 // press BTN_SIDE, release BTN_SIDE 3290 processKey(mapper, BTN_SIDE, 1); 3291 processSync(mapper); 3292 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3293 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3294 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3295 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3296 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 3297 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3298 3299 processKey(mapper, BTN_SIDE, 0); 3300 processSync(mapper); 3301 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3302 ASSERT_EQ(0, motionArgs.buttonState); 3303 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3304 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3305 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3306 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3307 3308 // press BTN_FORWARD, release BTN_FORWARD 3309 processKey(mapper, BTN_FORWARD, 1); 3310 processSync(mapper); 3311 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3312 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3313 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3314 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3315 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 3316 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3317 3318 processKey(mapper, BTN_FORWARD, 0); 3319 processSync(mapper); 3320 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3321 ASSERT_EQ(0, motionArgs.buttonState); 3322 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3323 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3324 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3325 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3326 3327 // press BTN_EXTRA, release BTN_EXTRA 3328 processKey(mapper, BTN_EXTRA, 1); 3329 processSync(mapper); 3330 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3331 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3332 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3333 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3334 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 3335 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3336 3337 processKey(mapper, BTN_EXTRA, 0); 3338 processSync(mapper); 3339 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3340 ASSERT_EQ(0, motionArgs.buttonState); 3341 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3342 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3343 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3344 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3345 3346 // press BTN_STYLUS, release BTN_STYLUS 3347 processKey(mapper, BTN_STYLUS, 1); 3348 processSync(mapper); 3349 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3350 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3351 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState); 3352 3353 processKey(mapper, BTN_STYLUS, 0); 3354 processSync(mapper); 3355 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3356 ASSERT_EQ(0, motionArgs.buttonState); 3357 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3358 3359 // press BTN_STYLUS2, release BTN_STYLUS2 3360 processKey(mapper, BTN_STYLUS2, 1); 3361 processSync(mapper); 3362 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3363 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3364 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 3365 3366 processKey(mapper, BTN_STYLUS2, 0); 3367 processSync(mapper); 3368 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3369 ASSERT_EQ(0, motionArgs.buttonState); 3370 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3371 3372 // release touch 3373 processUp(mapper); 3374 processSync(mapper); 3375 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3376 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3377 ASSERT_EQ(0, motionArgs.buttonState); 3378 } 3379 3380 TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) { 3381 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3382 addConfigurationProperty("touch.deviceType", "touchScreen"); 3383 prepareDisplay(DISPLAY_ORIENTATION_0); 3384 prepareButtons(); 3385 prepareAxes(POSITION); 3386 addMapperAndConfigure(mapper); 3387 3388 NotifyMotionArgs motionArgs; 3389 3390 // default tool type is finger 3391 processDown(mapper, 100, 200); 3392 processSync(mapper); 3393 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3394 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3395 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3396 3397 // eraser 3398 processKey(mapper, BTN_TOOL_RUBBER, 1); 3399 processSync(mapper); 3400 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3401 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3402 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 3403 3404 // stylus 3405 processKey(mapper, BTN_TOOL_RUBBER, 0); 3406 processKey(mapper, BTN_TOOL_PEN, 1); 3407 processSync(mapper); 3408 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3409 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3410 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 3411 3412 // brush 3413 processKey(mapper, BTN_TOOL_PEN, 0); 3414 processKey(mapper, BTN_TOOL_BRUSH, 1); 3415 processSync(mapper); 3416 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3417 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3418 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 3419 3420 // pencil 3421 processKey(mapper, BTN_TOOL_BRUSH, 0); 3422 processKey(mapper, BTN_TOOL_PENCIL, 1); 3423 processSync(mapper); 3424 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3425 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3426 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 3427 3428 // airbrush 3429 processKey(mapper, BTN_TOOL_PENCIL, 0); 3430 processKey(mapper, BTN_TOOL_AIRBRUSH, 1); 3431 processSync(mapper); 3432 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3433 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3434 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 3435 3436 // mouse 3437 processKey(mapper, BTN_TOOL_AIRBRUSH, 0); 3438 processKey(mapper, BTN_TOOL_MOUSE, 1); 3439 processSync(mapper); 3440 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3441 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3442 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 3443 3444 // lens 3445 processKey(mapper, BTN_TOOL_MOUSE, 0); 3446 processKey(mapper, BTN_TOOL_LENS, 1); 3447 processSync(mapper); 3448 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3449 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3450 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 3451 3452 // double-tap 3453 processKey(mapper, BTN_TOOL_LENS, 0); 3454 processKey(mapper, BTN_TOOL_DOUBLETAP, 1); 3455 processSync(mapper); 3456 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3457 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3458 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3459 3460 // triple-tap 3461 processKey(mapper, BTN_TOOL_DOUBLETAP, 0); 3462 processKey(mapper, BTN_TOOL_TRIPLETAP, 1); 3463 processSync(mapper); 3464 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3465 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3466 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3467 3468 // quad-tap 3469 processKey(mapper, BTN_TOOL_TRIPLETAP, 0); 3470 processKey(mapper, BTN_TOOL_QUADTAP, 1); 3471 processSync(mapper); 3472 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3473 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3474 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3475 3476 // finger 3477 processKey(mapper, BTN_TOOL_QUADTAP, 0); 3478 processKey(mapper, BTN_TOOL_FINGER, 1); 3479 processSync(mapper); 3480 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3481 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3482 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3483 3484 // stylus trumps finger 3485 processKey(mapper, BTN_TOOL_PEN, 1); 3486 processSync(mapper); 3487 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3488 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3489 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 3490 3491 // eraser trumps stylus 3492 processKey(mapper, BTN_TOOL_RUBBER, 1); 3493 processSync(mapper); 3494 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3495 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3496 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 3497 3498 // mouse trumps eraser 3499 processKey(mapper, BTN_TOOL_MOUSE, 1); 3500 processSync(mapper); 3501 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3502 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3503 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 3504 3505 // back to default tool type 3506 processKey(mapper, BTN_TOOL_MOUSE, 0); 3507 processKey(mapper, BTN_TOOL_RUBBER, 0); 3508 processKey(mapper, BTN_TOOL_PEN, 0); 3509 processKey(mapper, BTN_TOOL_FINGER, 0); 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_FINGER, motionArgs.pointerProperties[0].toolType); 3514 } 3515 3516 TEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) { 3517 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3518 addConfigurationProperty("touch.deviceType", "touchScreen"); 3519 prepareDisplay(DISPLAY_ORIENTATION_0); 3520 prepareButtons(); 3521 prepareAxes(POSITION); 3522 mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0); 3523 addMapperAndConfigure(mapper); 3524 3525 NotifyMotionArgs motionArgs; 3526 3527 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0 3528 processKey(mapper, BTN_TOOL_FINGER, 1); 3529 processMove(mapper, 100, 200); 3530 processSync(mapper); 3531 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3532 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3533 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3534 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3535 3536 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3537 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3538 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3539 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3540 3541 // move a little 3542 processMove(mapper, 150, 250); 3543 processSync(mapper); 3544 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3545 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3546 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3547 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3548 3549 // down when BTN_TOUCH is pressed, pressure defaults to 1 3550 processKey(mapper, BTN_TOUCH, 1); 3551 processSync(mapper); 3552 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3553 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3554 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3555 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3556 3557 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3558 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3559 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3560 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3561 3562 // up when BTN_TOUCH is released, hover restored 3563 processKey(mapper, BTN_TOUCH, 0); 3564 processSync(mapper); 3565 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3566 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3567 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3568 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3569 3570 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3571 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3572 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3573 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3574 3575 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3576 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3577 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3578 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3579 3580 // exit hover when pointer goes away 3581 processKey(mapper, BTN_TOOL_FINGER, 0); 3582 processSync(mapper); 3583 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3584 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3585 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3586 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3587 } 3588 3589 TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) { 3590 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3591 addConfigurationProperty("touch.deviceType", "touchScreen"); 3592 prepareDisplay(DISPLAY_ORIENTATION_0); 3593 prepareButtons(); 3594 prepareAxes(POSITION | PRESSURE); 3595 addMapperAndConfigure(mapper); 3596 3597 NotifyMotionArgs motionArgs; 3598 3599 // initially hovering because pressure is 0 3600 processDown(mapper, 100, 200); 3601 processPressure(mapper, 0); 3602 processSync(mapper); 3603 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3604 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3605 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3606 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3607 3608 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3609 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3610 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3611 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3612 3613 // move a little 3614 processMove(mapper, 150, 250); 3615 processSync(mapper); 3616 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3617 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3618 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3619 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3620 3621 // down when pressure is non-zero 3622 processPressure(mapper, RAW_PRESSURE_MAX); 3623 processSync(mapper); 3624 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3625 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3626 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3627 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3628 3629 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3630 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3631 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3632 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3633 3634 // up when pressure becomes 0, hover restored 3635 processPressure(mapper, 0); 3636 processSync(mapper); 3637 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3638 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3639 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3640 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3641 3642 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3643 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3644 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3645 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3646 3647 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3648 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3649 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3650 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3651 3652 // exit hover when pointer goes away 3653 processUp(mapper); 3654 processSync(mapper); 3655 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3656 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3657 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3658 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3659 } 3660 3661 3662 // --- MultiTouchInputMapperTest --- 3663 3664 class MultiTouchInputMapperTest : public TouchInputMapperTest { 3665 protected: 3666 void prepareAxes(int axes); 3667 3668 void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y); 3669 void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor); 3670 void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor); 3671 void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor); 3672 void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor); 3673 void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation); 3674 void processPressure(MultiTouchInputMapper* mapper, int32_t pressure); 3675 void processDistance(MultiTouchInputMapper* mapper, int32_t distance); 3676 void processId(MultiTouchInputMapper* mapper, int32_t id); 3677 void processSlot(MultiTouchInputMapper* mapper, int32_t slot); 3678 void processToolType(MultiTouchInputMapper* mapper, int32_t toolType); 3679 void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value); 3680 void processMTSync(MultiTouchInputMapper* mapper); 3681 void processSync(MultiTouchInputMapper* mapper); 3682 }; 3683 3684 void MultiTouchInputMapperTest::prepareAxes(int axes) { 3685 if (axes & POSITION) { 3686 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X, 3687 RAW_X_MIN, RAW_X_MAX, 0, 0); 3688 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y, 3689 RAW_Y_MIN, RAW_Y_MAX, 0, 0); 3690 } 3691 if (axes & TOUCH) { 3692 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR, 3693 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0); 3694 if (axes & MINOR) { 3695 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR, 3696 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0); 3697 } 3698 } 3699 if (axes & TOOL) { 3700 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR, 3701 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0); 3702 if (axes & MINOR) { 3703 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR, 3704 RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0); 3705 } 3706 } 3707 if (axes & ORIENTATION) { 3708 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION, 3709 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0); 3710 } 3711 if (axes & PRESSURE) { 3712 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE, 3713 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0); 3714 } 3715 if (axes & DISTANCE) { 3716 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE, 3717 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0); 3718 } 3719 if (axes & ID) { 3720 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID, 3721 RAW_ID_MIN, RAW_ID_MAX, 0, 0); 3722 } 3723 if (axes & SLOT) { 3724 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT, 3725 RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0); 3726 mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0); 3727 } 3728 if (axes & TOOL_TYPE) { 3729 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE, 3730 0, MT_TOOL_MAX, 0, 0); 3731 } 3732 } 3733 3734 void MultiTouchInputMapperTest::processPosition( 3735 MultiTouchInputMapper* mapper, int32_t x, int32_t y) { 3736 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_X, x); 3737 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_Y, y); 3738 } 3739 3740 void MultiTouchInputMapperTest::processTouchMajor( 3741 MultiTouchInputMapper* mapper, int32_t touchMajor) { 3742 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor); 3743 } 3744 3745 void MultiTouchInputMapperTest::processTouchMinor( 3746 MultiTouchInputMapper* mapper, int32_t touchMinor) { 3747 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor); 3748 } 3749 3750 void MultiTouchInputMapperTest::processToolMajor( 3751 MultiTouchInputMapper* mapper, int32_t toolMajor) { 3752 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor); 3753 } 3754 3755 void MultiTouchInputMapperTest::processToolMinor( 3756 MultiTouchInputMapper* mapper, int32_t toolMinor) { 3757 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor); 3758 } 3759 3760 void MultiTouchInputMapperTest::processOrientation( 3761 MultiTouchInputMapper* mapper, int32_t orientation) { 3762 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_ORIENTATION, orientation); 3763 } 3764 3765 void MultiTouchInputMapperTest::processPressure( 3766 MultiTouchInputMapper* mapper, int32_t pressure) { 3767 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_PRESSURE, pressure); 3768 } 3769 3770 void MultiTouchInputMapperTest::processDistance( 3771 MultiTouchInputMapper* mapper, int32_t distance) { 3772 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_DISTANCE, distance); 3773 } 3774 3775 void MultiTouchInputMapperTest::processId( 3776 MultiTouchInputMapper* mapper, int32_t id) { 3777 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TRACKING_ID, id); 3778 } 3779 3780 void MultiTouchInputMapperTest::processSlot( 3781 MultiTouchInputMapper* mapper, int32_t slot) { 3782 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_SLOT, slot); 3783 } 3784 3785 void MultiTouchInputMapperTest::processToolType( 3786 MultiTouchInputMapper* mapper, int32_t toolType) { 3787 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOOL_TYPE, toolType); 3788 } 3789 3790 void MultiTouchInputMapperTest::processKey( 3791 MultiTouchInputMapper* mapper, int32_t code, int32_t value) { 3792 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value); 3793 } 3794 3795 void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) { 3796 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_MT_REPORT, 0); 3797 } 3798 3799 void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) { 3800 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 3801 } 3802 3803 3804 TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) { 3805 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 3806 addConfigurationProperty("touch.deviceType", "touchScreen"); 3807 prepareDisplay(DISPLAY_ORIENTATION_0); 3808 prepareAxes(POSITION); 3809 prepareVirtualKeys(); 3810 addMapperAndConfigure(mapper); 3811 3812 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 3813 3814 NotifyMotionArgs motionArgs; 3815 3816 // Two fingers down at once. 3817 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500; 3818 processPosition(mapper, x1, y1); 3819 processMTSync(mapper); 3820 processPosition(mapper, x2, y2); 3821 processMTSync(mapper); 3822 processSync(mapper); 3823 3824 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3825 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3826 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3827 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3828 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3829 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3830 ASSERT_EQ(0, motionArgs.flags); 3831 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3832 ASSERT_EQ(0, motionArgs.buttonState); 3833 ASSERT_EQ(0, motionArgs.edgeFlags); 3834 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3835 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3836 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3837 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3838 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3839 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3840 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3841 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3842 3843 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3844 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3845 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3846 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3847 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3848 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 3849 motionArgs.action); 3850 ASSERT_EQ(0, motionArgs.flags); 3851 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3852 ASSERT_EQ(0, motionArgs.buttonState); 3853 ASSERT_EQ(0, motionArgs.edgeFlags); 3854 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 3855 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3856 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3857 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3858 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3859 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3860 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3861 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3862 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3863 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3864 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3865 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3866 3867 // Move. 3868 x1 += 10; y1 += 15; x2 += 5; y2 -= 10; 3869 processPosition(mapper, x1, y1); 3870 processMTSync(mapper); 3871 processPosition(mapper, x2, y2); 3872 processMTSync(mapper); 3873 processSync(mapper); 3874 3875 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3876 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3877 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3878 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3879 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3880 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3881 ASSERT_EQ(0, motionArgs.flags); 3882 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3883 ASSERT_EQ(0, motionArgs.buttonState); 3884 ASSERT_EQ(0, motionArgs.edgeFlags); 3885 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 3886 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3887 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3888 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3889 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3890 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3891 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3892 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3893 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3894 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3895 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3896 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3897 3898 // First finger up. 3899 x2 += 15; y2 -= 20; 3900 processPosition(mapper, x2, y2); 3901 processMTSync(mapper); 3902 processSync(mapper); 3903 3904 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3905 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3906 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3907 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3908 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3909 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 3910 motionArgs.action); 3911 ASSERT_EQ(0, motionArgs.flags); 3912 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3913 ASSERT_EQ(0, motionArgs.buttonState); 3914 ASSERT_EQ(0, motionArgs.edgeFlags); 3915 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 3916 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3917 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3918 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3919 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3920 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3921 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3922 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3923 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3924 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3925 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3926 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3927 3928 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3929 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3930 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3931 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3932 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3933 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3934 ASSERT_EQ(0, motionArgs.flags); 3935 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3936 ASSERT_EQ(0, motionArgs.buttonState); 3937 ASSERT_EQ(0, motionArgs.edgeFlags); 3938 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3939 ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 3940 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3941 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3942 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3943 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3944 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3945 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3946 3947 // Move. 3948 x2 += 20; y2 -= 25; 3949 processPosition(mapper, x2, y2); 3950 processMTSync(mapper); 3951 processSync(mapper); 3952 3953 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3954 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3955 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3956 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3957 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3958 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3959 ASSERT_EQ(0, motionArgs.flags); 3960 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3961 ASSERT_EQ(0, motionArgs.buttonState); 3962 ASSERT_EQ(0, motionArgs.edgeFlags); 3963 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3964 ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 3965 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3966 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3967 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3968 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3969 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3970 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3971 3972 // New finger down. 3973 int32_t x3 = 700, y3 = 300; 3974 processPosition(mapper, x2, y2); 3975 processMTSync(mapper); 3976 processPosition(mapper, x3, y3); 3977 processMTSync(mapper); 3978 processSync(mapper); 3979 3980 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3981 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3982 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3983 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3984 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3985 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 3986 motionArgs.action); 3987 ASSERT_EQ(0, motionArgs.flags); 3988 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3989 ASSERT_EQ(0, motionArgs.buttonState); 3990 ASSERT_EQ(0, motionArgs.edgeFlags); 3991 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 3992 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3993 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3994 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3995 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3996 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3997 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 3998 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3999 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4000 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4001 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4002 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4003 4004 // Second finger up. 4005 x3 += 30; y3 -= 20; 4006 processPosition(mapper, x3, y3); 4007 processMTSync(mapper); 4008 processSync(mapper); 4009 4010 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4011 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4012 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4013 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4014 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4015 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4016 motionArgs.action); 4017 ASSERT_EQ(0, motionArgs.flags); 4018 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 4019 ASSERT_EQ(0, motionArgs.buttonState); 4020 ASSERT_EQ(0, motionArgs.edgeFlags); 4021 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4022 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4023 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4024 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4025 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4026 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4027 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4028 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4029 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4030 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4031 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4032 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4033 4034 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4035 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4036 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4037 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4038 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4039 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4040 ASSERT_EQ(0, motionArgs.flags); 4041 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 4042 ASSERT_EQ(0, motionArgs.buttonState); 4043 ASSERT_EQ(0, motionArgs.edgeFlags); 4044 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4045 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4046 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4047 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4048 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4049 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4050 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4051 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4052 4053 // Last finger up. 4054 processMTSync(mapper); 4055 processSync(mapper); 4056 4057 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4058 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4059 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4060 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4061 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4062 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4063 ASSERT_EQ(0, motionArgs.flags); 4064 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 4065 ASSERT_EQ(0, motionArgs.buttonState); 4066 ASSERT_EQ(0, motionArgs.edgeFlags); 4067 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4068 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4069 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4070 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4071 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4072 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4073 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4074 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4075 4076 // Should not have sent any more keys or motions. 4077 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 4078 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 4079 } 4080 4081 TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) { 4082 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4083 addConfigurationProperty("touch.deviceType", "touchScreen"); 4084 prepareDisplay(DISPLAY_ORIENTATION_0); 4085 prepareAxes(POSITION | ID); 4086 prepareVirtualKeys(); 4087 addMapperAndConfigure(mapper); 4088 4089 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 4090 4091 NotifyMotionArgs motionArgs; 4092 4093 // Two fingers down at once. 4094 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500; 4095 processPosition(mapper, x1, y1); 4096 processId(mapper, 1); 4097 processMTSync(mapper); 4098 processPosition(mapper, x2, y2); 4099 processId(mapper, 2); 4100 processMTSync(mapper); 4101 processSync(mapper); 4102 4103 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4104 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4105 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4106 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4107 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4108 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4109 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4110 4111 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4112 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4113 motionArgs.action); 4114 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4115 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4116 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4117 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4118 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4119 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4120 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4121 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4122 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4123 4124 // Move. 4125 x1 += 10; y1 += 15; x2 += 5; y2 -= 10; 4126 processPosition(mapper, x1, y1); 4127 processId(mapper, 1); 4128 processMTSync(mapper); 4129 processPosition(mapper, x2, y2); 4130 processId(mapper, 2); 4131 processMTSync(mapper); 4132 processSync(mapper); 4133 4134 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4135 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4136 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4137 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4138 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4139 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4140 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4141 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4142 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4143 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4144 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4145 4146 // First finger up. 4147 x2 += 15; y2 -= 20; 4148 processPosition(mapper, x2, y2); 4149 processId(mapper, 2); 4150 processMTSync(mapper); 4151 processSync(mapper); 4152 4153 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4154 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4155 motionArgs.action); 4156 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4157 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4158 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4159 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4160 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4161 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4162 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4163 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4164 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4165 4166 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4167 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4168 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4169 ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4170 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4171 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4172 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4173 4174 // Move. 4175 x2 += 20; y2 -= 25; 4176 processPosition(mapper, x2, y2); 4177 processId(mapper, 2); 4178 processMTSync(mapper); 4179 processSync(mapper); 4180 4181 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4182 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4183 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4184 ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4185 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4186 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4187 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4188 4189 // New finger down. 4190 int32_t x3 = 700, y3 = 300; 4191 processPosition(mapper, x2, y2); 4192 processId(mapper, 2); 4193 processMTSync(mapper); 4194 processPosition(mapper, x3, y3); 4195 processId(mapper, 3); 4196 processMTSync(mapper); 4197 processSync(mapper); 4198 4199 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4200 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4201 motionArgs.action); 4202 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4203 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4204 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4205 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4206 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4207 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4208 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4209 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4210 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4211 4212 // Second finger up. 4213 x3 += 30; y3 -= 20; 4214 processPosition(mapper, x3, y3); 4215 processId(mapper, 3); 4216 processMTSync(mapper); 4217 processSync(mapper); 4218 4219 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4220 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4221 motionArgs.action); 4222 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4223 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4224 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4225 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4226 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4227 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4228 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4229 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4230 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4231 4232 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4233 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4234 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4235 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4236 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4237 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4238 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4239 4240 // Last finger up. 4241 processMTSync(mapper); 4242 processSync(mapper); 4243 4244 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4245 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4246 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4247 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4248 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4249 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4250 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4251 4252 // Should not have sent any more keys or motions. 4253 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 4254 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 4255 } 4256 4257 TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) { 4258 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4259 addConfigurationProperty("touch.deviceType", "touchScreen"); 4260 prepareDisplay(DISPLAY_ORIENTATION_0); 4261 prepareAxes(POSITION | ID | SLOT); 4262 prepareVirtualKeys(); 4263 addMapperAndConfigure(mapper); 4264 4265 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 4266 4267 NotifyMotionArgs motionArgs; 4268 4269 // Two fingers down at once. 4270 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500; 4271 processPosition(mapper, x1, y1); 4272 processId(mapper, 1); 4273 processSlot(mapper, 1); 4274 processPosition(mapper, x2, y2); 4275 processId(mapper, 2); 4276 processSync(mapper); 4277 4278 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4279 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4280 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4281 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4282 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4283 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4284 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4285 4286 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4287 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4288 motionArgs.action); 4289 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4290 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4291 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4292 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4293 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4294 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4295 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4296 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4297 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4298 4299 // Move. 4300 x1 += 10; y1 += 15; x2 += 5; y2 -= 10; 4301 processSlot(mapper, 0); 4302 processPosition(mapper, x1, y1); 4303 processSlot(mapper, 1); 4304 processPosition(mapper, x2, y2); 4305 processSync(mapper); 4306 4307 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4308 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4309 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4310 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4311 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4312 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4313 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4314 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4315 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4316 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4317 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4318 4319 // First finger up. 4320 x2 += 15; y2 -= 20; 4321 processSlot(mapper, 0); 4322 processId(mapper, -1); 4323 processSlot(mapper, 1); 4324 processPosition(mapper, x2, y2); 4325 processSync(mapper); 4326 4327 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4328 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4329 motionArgs.action); 4330 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4331 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4332 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4333 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4334 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4335 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4336 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4337 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4338 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4339 4340 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4341 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4342 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4343 ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4344 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4345 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4346 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4347 4348 // Move. 4349 x2 += 20; y2 -= 25; 4350 processPosition(mapper, x2, y2); 4351 processSync(mapper); 4352 4353 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4354 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4355 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4356 ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4357 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4358 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4359 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4360 4361 // New finger down. 4362 int32_t x3 = 700, y3 = 300; 4363 processPosition(mapper, x2, y2); 4364 processSlot(mapper, 0); 4365 processId(mapper, 3); 4366 processPosition(mapper, x3, y3); 4367 processSync(mapper); 4368 4369 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4370 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4371 motionArgs.action); 4372 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4373 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4374 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4375 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4376 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4377 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4378 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4379 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4380 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4381 4382 // Second finger up. 4383 x3 += 30; y3 -= 20; 4384 processSlot(mapper, 1); 4385 processId(mapper, -1); 4386 processSlot(mapper, 0); 4387 processPosition(mapper, x3, y3); 4388 processSync(mapper); 4389 4390 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4391 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4392 motionArgs.action); 4393 ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4394 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4395 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4396 ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4397 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4398 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4399 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4400 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4401 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4402 4403 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4404 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4405 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4406 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4407 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4408 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4409 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4410 4411 // Last finger up. 4412 processId(mapper, -1); 4413 processSync(mapper); 4414 4415 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4416 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4417 ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4418 ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4419 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4420 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4421 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4422 4423 // Should not have sent any more keys or motions. 4424 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 4425 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 4426 } 4427 4428 TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) { 4429 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4430 addConfigurationProperty("touch.deviceType", "touchScreen"); 4431 prepareDisplay(DISPLAY_ORIENTATION_0); 4432 prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE); 4433 addMapperAndConfigure(mapper); 4434 4435 // These calculations are based on the input device calibration documentation. 4436 int32_t rawX = 100; 4437 int32_t rawY = 200; 4438 int32_t rawTouchMajor = 7; 4439 int32_t rawTouchMinor = 6; 4440 int32_t rawToolMajor = 9; 4441 int32_t rawToolMinor = 8; 4442 int32_t rawPressure = 11; 4443 int32_t rawDistance = 0; 4444 int32_t rawOrientation = 3; 4445 int32_t id = 5; 4446 4447 float x = toDisplayX(rawX); 4448 float y = toDisplayY(rawY); 4449 float pressure = float(rawPressure) / RAW_PRESSURE_MAX; 4450 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX; 4451 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE; 4452 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE; 4453 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE; 4454 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE; 4455 float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2; 4456 float distance = float(rawDistance); 4457 4458 processPosition(mapper, rawX, rawY); 4459 processTouchMajor(mapper, rawTouchMajor); 4460 processTouchMinor(mapper, rawTouchMinor); 4461 processToolMajor(mapper, rawToolMajor); 4462 processToolMinor(mapper, rawToolMinor); 4463 processPressure(mapper, rawPressure); 4464 processOrientation(mapper, rawOrientation); 4465 processDistance(mapper, rawDistance); 4466 processId(mapper, id); 4467 processMTSync(mapper); 4468 processSync(mapper); 4469 4470 NotifyMotionArgs args; 4471 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4472 ASSERT_EQ(0, args.pointerProperties[0].id); 4473 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4474 x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor, 4475 orientation, distance)); 4476 } 4477 4478 TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) { 4479 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4480 addConfigurationProperty("touch.deviceType", "touchScreen"); 4481 prepareDisplay(DISPLAY_ORIENTATION_0); 4482 prepareAxes(POSITION | TOUCH | TOOL | MINOR); 4483 addConfigurationProperty("touch.size.calibration", "geometric"); 4484 addMapperAndConfigure(mapper); 4485 4486 // These calculations are based on the input device calibration documentation. 4487 int32_t rawX = 100; 4488 int32_t rawY = 200; 4489 int32_t rawTouchMajor = 140; 4490 int32_t rawTouchMinor = 120; 4491 int32_t rawToolMajor = 180; 4492 int32_t rawToolMinor = 160; 4493 4494 float x = toDisplayX(rawX); 4495 float y = toDisplayY(rawY); 4496 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX; 4497 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE; 4498 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE; 4499 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE; 4500 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE; 4501 4502 processPosition(mapper, rawX, rawY); 4503 processTouchMajor(mapper, rawTouchMajor); 4504 processTouchMinor(mapper, rawTouchMinor); 4505 processToolMajor(mapper, rawToolMajor); 4506 processToolMinor(mapper, rawToolMinor); 4507 processMTSync(mapper); 4508 processSync(mapper); 4509 4510 NotifyMotionArgs args; 4511 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4512 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4513 x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0)); 4514 } 4515 4516 TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) { 4517 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4518 addConfigurationProperty("touch.deviceType", "touchScreen"); 4519 prepareDisplay(DISPLAY_ORIENTATION_0); 4520 prepareAxes(POSITION | TOUCH | TOOL); 4521 addConfigurationProperty("touch.size.calibration", "diameter"); 4522 addConfigurationProperty("touch.size.scale", "10"); 4523 addConfigurationProperty("touch.size.bias", "160"); 4524 addConfigurationProperty("touch.size.isSummed", "1"); 4525 addMapperAndConfigure(mapper); 4526 4527 // These calculations are based on the input device calibration documentation. 4528 // Note: We only provide a single common touch/tool value because the device is assumed 4529 // not to emit separate values for each pointer (isSummed = 1). 4530 int32_t rawX = 100; 4531 int32_t rawY = 200; 4532 int32_t rawX2 = 150; 4533 int32_t rawY2 = 250; 4534 int32_t rawTouchMajor = 5; 4535 int32_t rawToolMajor = 8; 4536 4537 float x = toDisplayX(rawX); 4538 float y = toDisplayY(rawY); 4539 float x2 = toDisplayX(rawX2); 4540 float y2 = toDisplayY(rawY2); 4541 float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX; 4542 float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f; 4543 float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f; 4544 4545 processPosition(mapper, rawX, rawY); 4546 processTouchMajor(mapper, rawTouchMajor); 4547 processToolMajor(mapper, rawToolMajor); 4548 processMTSync(mapper); 4549 processPosition(mapper, rawX2, rawY2); 4550 processTouchMajor(mapper, rawTouchMajor); 4551 processToolMajor(mapper, rawToolMajor); 4552 processMTSync(mapper); 4553 processSync(mapper); 4554 4555 NotifyMotionArgs args; 4556 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4557 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 4558 4559 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4560 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4561 args.action); 4562 ASSERT_EQ(size_t(2), args.pointerCount); 4563 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4564 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0)); 4565 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1], 4566 x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0)); 4567 } 4568 4569 TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) { 4570 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4571 addConfigurationProperty("touch.deviceType", "touchScreen"); 4572 prepareDisplay(DISPLAY_ORIENTATION_0); 4573 prepareAxes(POSITION | TOUCH | TOOL); 4574 addConfigurationProperty("touch.size.calibration", "area"); 4575 addConfigurationProperty("touch.size.scale", "43"); 4576 addConfigurationProperty("touch.size.bias", "3"); 4577 addMapperAndConfigure(mapper); 4578 4579 // These calculations are based on the input device calibration documentation. 4580 int32_t rawX = 100; 4581 int32_t rawY = 200; 4582 int32_t rawTouchMajor = 5; 4583 int32_t rawToolMajor = 8; 4584 4585 float x = toDisplayX(rawX); 4586 float y = toDisplayY(rawY); 4587 float size = float(rawTouchMajor) / RAW_TOUCH_MAX; 4588 float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f; 4589 float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f; 4590 4591 processPosition(mapper, rawX, rawY); 4592 processTouchMajor(mapper, rawTouchMajor); 4593 processToolMajor(mapper, rawToolMajor); 4594 processMTSync(mapper); 4595 processSync(mapper); 4596 4597 NotifyMotionArgs args; 4598 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4599 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4600 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0)); 4601 } 4602 4603 TEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) { 4604 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4605 addConfigurationProperty("touch.deviceType", "touchScreen"); 4606 prepareDisplay(DISPLAY_ORIENTATION_0); 4607 prepareAxes(POSITION | PRESSURE); 4608 addConfigurationProperty("touch.pressure.calibration", "amplitude"); 4609 addConfigurationProperty("touch.pressure.scale", "0.01"); 4610 addMapperAndConfigure(mapper); 4611 4612 // These calculations are based on the input device calibration documentation. 4613 int32_t rawX = 100; 4614 int32_t rawY = 200; 4615 int32_t rawPressure = 60; 4616 4617 float x = toDisplayX(rawX); 4618 float y = toDisplayY(rawY); 4619 float pressure = float(rawPressure) * 0.01f; 4620 4621 processPosition(mapper, rawX, rawY); 4622 processPressure(mapper, rawPressure); 4623 processMTSync(mapper); 4624 processSync(mapper); 4625 4626 NotifyMotionArgs args; 4627 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4628 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4629 x, y, pressure, 0, 0, 0, 0, 0, 0, 0)); 4630 } 4631 4632 TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) { 4633 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4634 addConfigurationProperty("touch.deviceType", "touchScreen"); 4635 prepareDisplay(DISPLAY_ORIENTATION_0); 4636 prepareAxes(POSITION | ID | SLOT); 4637 addMapperAndConfigure(mapper); 4638 4639 NotifyMotionArgs motionArgs; 4640 NotifyKeyArgs keyArgs; 4641 4642 processId(mapper, 1); 4643 processPosition(mapper, 100, 200); 4644 processSync(mapper); 4645 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4646 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4647 ASSERT_EQ(0, motionArgs.buttonState); 4648 4649 // press BTN_LEFT, release BTN_LEFT 4650 processKey(mapper, BTN_LEFT, 1); 4651 processSync(mapper); 4652 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4653 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4654 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState); 4655 4656 processKey(mapper, BTN_LEFT, 0); 4657 processSync(mapper); 4658 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4659 ASSERT_EQ(0, motionArgs.buttonState); 4660 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4661 4662 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE 4663 processKey(mapper, BTN_RIGHT, 1); 4664 processKey(mapper, BTN_MIDDLE, 1); 4665 processSync(mapper); 4666 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4667 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4668 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 4669 motionArgs.buttonState); 4670 4671 processKey(mapper, BTN_RIGHT, 0); 4672 processSync(mapper); 4673 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4674 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 4675 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4676 4677 processKey(mapper, BTN_MIDDLE, 0); 4678 processSync(mapper); 4679 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4680 ASSERT_EQ(0, motionArgs.buttonState); 4681 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4682 4683 // press BTN_BACK, release BTN_BACK 4684 processKey(mapper, BTN_BACK, 1); 4685 processSync(mapper); 4686 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4687 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4688 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4689 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4690 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 4691 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4692 4693 processKey(mapper, BTN_BACK, 0); 4694 processSync(mapper); 4695 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4696 ASSERT_EQ(0, motionArgs.buttonState); 4697 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4698 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4699 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4700 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4701 4702 // press BTN_SIDE, release BTN_SIDE 4703 processKey(mapper, BTN_SIDE, 1); 4704 processSync(mapper); 4705 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4706 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4707 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4708 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4709 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 4710 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4711 4712 processKey(mapper, BTN_SIDE, 0); 4713 processSync(mapper); 4714 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4715 ASSERT_EQ(0, motionArgs.buttonState); 4716 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4717 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4718 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4719 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4720 4721 // press BTN_FORWARD, release BTN_FORWARD 4722 processKey(mapper, BTN_FORWARD, 1); 4723 processSync(mapper); 4724 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4725 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4726 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4727 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4728 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 4729 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4730 4731 processKey(mapper, BTN_FORWARD, 0); 4732 processSync(mapper); 4733 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4734 ASSERT_EQ(0, motionArgs.buttonState); 4735 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4736 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4737 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4738 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4739 4740 // press BTN_EXTRA, release BTN_EXTRA 4741 processKey(mapper, BTN_EXTRA, 1); 4742 processSync(mapper); 4743 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4744 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4745 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4746 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4747 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 4748 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4749 4750 processKey(mapper, BTN_EXTRA, 0); 4751 processSync(mapper); 4752 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4753 ASSERT_EQ(0, motionArgs.buttonState); 4754 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4755 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4756 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4757 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4758 4759 // press BTN_STYLUS, release BTN_STYLUS 4760 processKey(mapper, BTN_STYLUS, 1); 4761 processSync(mapper); 4762 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4763 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4764 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState); 4765 4766 processKey(mapper, BTN_STYLUS, 0); 4767 processSync(mapper); 4768 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4769 ASSERT_EQ(0, motionArgs.buttonState); 4770 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4771 4772 // press BTN_STYLUS2, release BTN_STYLUS2 4773 processKey(mapper, BTN_STYLUS2, 1); 4774 processSync(mapper); 4775 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4776 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4777 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 4778 4779 processKey(mapper, BTN_STYLUS2, 0); 4780 processSync(mapper); 4781 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4782 ASSERT_EQ(0, motionArgs.buttonState); 4783 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4784 4785 // release touch 4786 processId(mapper, -1); 4787 processSync(mapper); 4788 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4789 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4790 ASSERT_EQ(0, motionArgs.buttonState); 4791 } 4792 4793 TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) { 4794 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4795 addConfigurationProperty("touch.deviceType", "touchScreen"); 4796 prepareDisplay(DISPLAY_ORIENTATION_0); 4797 prepareAxes(POSITION | ID | SLOT | TOOL_TYPE); 4798 addMapperAndConfigure(mapper); 4799 4800 NotifyMotionArgs motionArgs; 4801 4802 // default tool type is finger 4803 processId(mapper, 1); 4804 processPosition(mapper, 100, 200); 4805 processSync(mapper); 4806 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4807 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4808 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4809 4810 // eraser 4811 processKey(mapper, BTN_TOOL_RUBBER, 1); 4812 processSync(mapper); 4813 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4814 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4815 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 4816 4817 // stylus 4818 processKey(mapper, BTN_TOOL_RUBBER, 0); 4819 processKey(mapper, BTN_TOOL_PEN, 1); 4820 processSync(mapper); 4821 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4822 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4823 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4824 4825 // brush 4826 processKey(mapper, BTN_TOOL_PEN, 0); 4827 processKey(mapper, BTN_TOOL_BRUSH, 1); 4828 processSync(mapper); 4829 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4830 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4831 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4832 4833 // pencil 4834 processKey(mapper, BTN_TOOL_BRUSH, 0); 4835 processKey(mapper, BTN_TOOL_PENCIL, 1); 4836 processSync(mapper); 4837 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4838 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4839 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4840 4841 // airbrush 4842 processKey(mapper, BTN_TOOL_PENCIL, 0); 4843 processKey(mapper, BTN_TOOL_AIRBRUSH, 1); 4844 processSync(mapper); 4845 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4846 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4847 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4848 4849 // mouse 4850 processKey(mapper, BTN_TOOL_AIRBRUSH, 0); 4851 processKey(mapper, BTN_TOOL_MOUSE, 1); 4852 processSync(mapper); 4853 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4854 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4855 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 4856 4857 // lens 4858 processKey(mapper, BTN_TOOL_MOUSE, 0); 4859 processKey(mapper, BTN_TOOL_LENS, 1); 4860 processSync(mapper); 4861 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4862 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4863 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 4864 4865 // double-tap 4866 processKey(mapper, BTN_TOOL_LENS, 0); 4867 processKey(mapper, BTN_TOOL_DOUBLETAP, 1); 4868 processSync(mapper); 4869 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4870 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4871 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4872 4873 // triple-tap 4874 processKey(mapper, BTN_TOOL_DOUBLETAP, 0); 4875 processKey(mapper, BTN_TOOL_TRIPLETAP, 1); 4876 processSync(mapper); 4877 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4878 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4879 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4880 4881 // quad-tap 4882 processKey(mapper, BTN_TOOL_TRIPLETAP, 0); 4883 processKey(mapper, BTN_TOOL_QUADTAP, 1); 4884 processSync(mapper); 4885 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4886 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4887 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4888 4889 // finger 4890 processKey(mapper, BTN_TOOL_QUADTAP, 0); 4891 processKey(mapper, BTN_TOOL_FINGER, 1); 4892 processSync(mapper); 4893 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4894 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4895 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4896 4897 // stylus trumps finger 4898 processKey(mapper, BTN_TOOL_PEN, 1); 4899 processSync(mapper); 4900 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4901 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4902 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4903 4904 // eraser trumps stylus 4905 processKey(mapper, BTN_TOOL_RUBBER, 1); 4906 processSync(mapper); 4907 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4908 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4909 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 4910 4911 // mouse trumps eraser 4912 processKey(mapper, BTN_TOOL_MOUSE, 1); 4913 processSync(mapper); 4914 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4915 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4916 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 4917 4918 // MT tool type trumps BTN tool types: MT_TOOL_FINGER 4919 processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE 4920 processSync(mapper); 4921 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4922 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4923 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4924 4925 // MT tool type trumps BTN tool types: MT_TOOL_PEN 4926 processToolType(mapper, MT_TOOL_PEN); 4927 processSync(mapper); 4928 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4929 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4930 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4931 4932 // back to default tool type 4933 processToolType(mapper, -1); // use a deliberately undefined tool type, for testing 4934 processKey(mapper, BTN_TOOL_MOUSE, 0); 4935 processKey(mapper, BTN_TOOL_RUBBER, 0); 4936 processKey(mapper, BTN_TOOL_PEN, 0); 4937 processKey(mapper, BTN_TOOL_FINGER, 0); 4938 processSync(mapper); 4939 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4940 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4941 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4942 } 4943 4944 TEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) { 4945 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4946 addConfigurationProperty("touch.deviceType", "touchScreen"); 4947 prepareDisplay(DISPLAY_ORIENTATION_0); 4948 prepareAxes(POSITION | ID | SLOT); 4949 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0); 4950 addMapperAndConfigure(mapper); 4951 4952 NotifyMotionArgs motionArgs; 4953 4954 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0 4955 processId(mapper, 1); 4956 processPosition(mapper, 100, 200); 4957 processSync(mapper); 4958 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4959 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 4960 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4961 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 4962 4963 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4964 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 4965 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4966 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 4967 4968 // move a little 4969 processPosition(mapper, 150, 250); 4970 processSync(mapper); 4971 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4972 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 4973 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4974 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 4975 4976 // down when BTN_TOUCH is pressed, pressure defaults to 1 4977 processKey(mapper, BTN_TOUCH, 1); 4978 processSync(mapper); 4979 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4980 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 4981 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4982 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 4983 4984 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4985 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4986 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4987 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 4988 4989 // up when BTN_TOUCH is released, hover restored 4990 processKey(mapper, BTN_TOUCH, 0); 4991 processSync(mapper); 4992 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4993 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4994 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4995 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 4996 4997 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4998 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 4999 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5000 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5001 5002 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5003 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5004 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5005 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5006 5007 // exit hover when pointer goes away 5008 processId(mapper, -1); 5009 processSync(mapper); 5010 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5011 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 5012 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5013 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5014 } 5015 5016 TEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) { 5017 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 5018 addConfigurationProperty("touch.deviceType", "touchScreen"); 5019 prepareDisplay(DISPLAY_ORIENTATION_0); 5020 prepareAxes(POSITION | ID | SLOT | PRESSURE); 5021 addMapperAndConfigure(mapper); 5022 5023 NotifyMotionArgs motionArgs; 5024 5025 // initially hovering because pressure is 0 5026 processId(mapper, 1); 5027 processPosition(mapper, 100, 200); 5028 processPressure(mapper, 0); 5029 processSync(mapper); 5030 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5031 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 5032 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5033 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 5034 5035 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5036 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5037 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5038 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 5039 5040 // move a little 5041 processPosition(mapper, 150, 250); 5042 processSync(mapper); 5043 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5044 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5045 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5046 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5047 5048 // down when pressure becomes non-zero 5049 processPressure(mapper, RAW_PRESSURE_MAX); 5050 processSync(mapper); 5051 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5052 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 5053 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5054 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5055 5056 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5057 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 5058 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5059 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 5060 5061 // up when pressure becomes 0, hover restored 5062 processPressure(mapper, 0); 5063 processSync(mapper); 5064 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5065 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 5066 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5067 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 5068 5069 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5070 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 5071 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5072 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5073 5074 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5075 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5076 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5077 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5078 5079 // exit hover when pointer goes away 5080 processId(mapper, -1); 5081 processSync(mapper); 5082 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5083 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 5084 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5085 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5086 } 5087 5088 5089 } // namespace android 5090