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