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