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 #ifndef _UI_INPUT_H 18 #define _UI_INPUT_H 19 20 /** 21 * Native input event structures. 22 */ 23 24 #include <android/input.h> 25 #include <utils/Vector.h> 26 #include <utils/KeyedVector.h> 27 #include <utils/Timers.h> 28 #include <utils/RefBase.h> 29 #include <utils/String8.h> 30 #include <utils/BitSet.h> 31 32 #ifdef HAVE_ANDROID_OS 33 class SkMatrix; 34 #endif 35 36 /* 37 * Additional private constants not defined in ndk/ui/input.h. 38 */ 39 enum { 40 /* Private control to determine when an app is tracking a key sequence. */ 41 AKEY_EVENT_FLAG_START_TRACKING = 0x40000000, 42 43 /* Key event is inconsistent with previously sent key events. */ 44 AKEY_EVENT_FLAG_TAINTED = 0x80000000, 45 }; 46 47 enum { 48 /* Motion event is inconsistent with previously sent motion events. */ 49 AMOTION_EVENT_FLAG_TAINTED = 0x80000000, 50 }; 51 52 enum { 53 /* 54 * Indicates that an input device has switches. 55 * This input source flag is hidden from the API because switches are only used by the system 56 * and applications have no way to interact with them. 57 */ 58 AINPUT_SOURCE_SWITCH = 0x80000000, 59 }; 60 61 /* 62 * SystemUiVisibility constants from View. 63 */ 64 enum { 65 ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE = 0, 66 ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN = 0x00000001, 67 }; 68 69 /* 70 * Maximum number of pointers supported per motion event. 71 * Smallest number of pointers is 1. 72 * (We want at least 10 but some touch controllers obstensibly configured for 10 pointers 73 * will occasionally emit 11. There is not much harm making this constant bigger.) 74 */ 75 #define MAX_POINTERS 16 76 77 /* 78 * Maximum pointer id value supported in a motion event. 79 * Smallest pointer id is 0. 80 * (This is limited by our use of BitSet32 to track pointer assignments.) 81 */ 82 #define MAX_POINTER_ID 31 83 84 /* 85 * Declare a concrete type for the NDK's input event forward declaration. 86 */ 87 struct AInputEvent { 88 virtual ~AInputEvent() { } 89 }; 90 91 /* 92 * Declare a concrete type for the NDK's input device forward declaration. 93 */ 94 struct AInputDevice { 95 virtual ~AInputDevice() { } 96 }; 97 98 99 namespace android { 100 101 #ifdef HAVE_ANDROID_OS 102 class Parcel; 103 #endif 104 105 /* 106 * Flags that flow alongside events in the input dispatch system to help with certain 107 * policy decisions such as waking from device sleep. 108 * 109 * These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java. 110 */ 111 enum { 112 /* These flags originate in RawEvents and are generally set in the key map. 113 * NOTE: If you edit these flags, also edit labels in KeycodeLabels.h. */ 114 115 POLICY_FLAG_WAKE = 0x00000001, 116 POLICY_FLAG_WAKE_DROPPED = 0x00000002, 117 POLICY_FLAG_SHIFT = 0x00000004, 118 POLICY_FLAG_CAPS_LOCK = 0x00000008, 119 POLICY_FLAG_ALT = 0x00000010, 120 POLICY_FLAG_ALT_GR = 0x00000020, 121 POLICY_FLAG_MENU = 0x00000040, 122 POLICY_FLAG_LAUNCHER = 0x00000080, 123 POLICY_FLAG_VIRTUAL = 0x00000100, 124 POLICY_FLAG_FUNCTION = 0x00000200, 125 126 POLICY_FLAG_RAW_MASK = 0x0000ffff, 127 128 /* These flags are set by the input dispatcher. */ 129 130 // Indicates that the input event was injected. 131 POLICY_FLAG_INJECTED = 0x01000000, 132 133 // Indicates that the input event is from a trusted source such as a directly attached 134 // input device or an application with system-wide event injection permission. 135 POLICY_FLAG_TRUSTED = 0x02000000, 136 137 // Indicates that the input event has passed through an input filter. 138 POLICY_FLAG_FILTERED = 0x04000000, 139 140 // Disables automatic key repeating behavior. 141 POLICY_FLAG_DISABLE_KEY_REPEAT = 0x08000000, 142 143 /* These flags are set by the input reader policy as it intercepts each event. */ 144 145 // Indicates that the screen was off when the event was received and the event 146 // should wake the device. 147 POLICY_FLAG_WOKE_HERE = 0x10000000, 148 149 // Indicates that the screen was dim when the event was received and the event 150 // should brighten the device. 151 POLICY_FLAG_BRIGHT_HERE = 0x20000000, 152 153 // Indicates that the event should be dispatched to applications. 154 // The input event should still be sent to the InputDispatcher so that it can see all 155 // input events received include those that it will not deliver. 156 POLICY_FLAG_PASS_TO_USER = 0x40000000, 157 }; 158 159 /* 160 * Describes the basic configuration of input devices that are present. 161 */ 162 struct InputConfiguration { 163 enum { 164 TOUCHSCREEN_UNDEFINED = 0, 165 TOUCHSCREEN_NOTOUCH = 1, 166 TOUCHSCREEN_STYLUS = 2, 167 TOUCHSCREEN_FINGER = 3 168 }; 169 170 enum { 171 KEYBOARD_UNDEFINED = 0, 172 KEYBOARD_NOKEYS = 1, 173 KEYBOARD_QWERTY = 2, 174 KEYBOARD_12KEY = 3 175 }; 176 177 enum { 178 NAVIGATION_UNDEFINED = 0, 179 NAVIGATION_NONAV = 1, 180 NAVIGATION_DPAD = 2, 181 NAVIGATION_TRACKBALL = 3, 182 NAVIGATION_WHEEL = 4 183 }; 184 185 int32_t touchScreen; 186 int32_t keyboard; 187 int32_t navigation; 188 }; 189 190 /* 191 * Pointer coordinate data. 192 */ 193 struct PointerCoords { 194 enum { MAX_AXES = 14 }; // 14 so that sizeof(PointerCoords) == 64 195 196 // Bitfield of axes that are present in this structure. 197 uint64_t bits; 198 199 // Values of axes that are stored in this structure packed in order by axis id 200 // for each axis that is present in the structure according to 'bits'. 201 float values[MAX_AXES]; 202 203 inline void clear() { 204 bits = 0; 205 } 206 207 float getAxisValue(int32_t axis) const; 208 status_t setAxisValue(int32_t axis, float value); 209 210 void scale(float scale); 211 212 inline float getX() const { 213 return getAxisValue(AMOTION_EVENT_AXIS_X); 214 } 215 216 inline float getY() const { 217 return getAxisValue(AMOTION_EVENT_AXIS_Y); 218 } 219 220 #ifdef HAVE_ANDROID_OS 221 status_t readFromParcel(Parcel* parcel); 222 status_t writeToParcel(Parcel* parcel) const; 223 #endif 224 225 bool operator==(const PointerCoords& other) const; 226 inline bool operator!=(const PointerCoords& other) const { 227 return !(*this == other); 228 } 229 230 void copyFrom(const PointerCoords& other); 231 232 private: 233 void tooManyAxes(int axis); 234 }; 235 236 /* 237 * Pointer property data. 238 */ 239 struct PointerProperties { 240 // The id of the pointer. 241 int32_t id; 242 243 // The pointer tool type. 244 int32_t toolType; 245 246 inline void clear() { 247 id = -1; 248 toolType = 0; 249 } 250 251 bool operator==(const PointerProperties& other) const; 252 inline bool operator!=(const PointerProperties& other) const { 253 return !(*this == other); 254 } 255 256 void copyFrom(const PointerProperties& other); 257 }; 258 259 /* 260 * Input events. 261 */ 262 class InputEvent : public AInputEvent { 263 public: 264 virtual ~InputEvent() { } 265 266 virtual int32_t getType() const = 0; 267 268 inline int32_t getDeviceId() const { return mDeviceId; } 269 270 inline int32_t getSource() const { return mSource; } 271 272 inline void setSource(int32_t source) { mSource = source; } 273 274 protected: 275 void initialize(int32_t deviceId, int32_t source); 276 void initialize(const InputEvent& from); 277 278 int32_t mDeviceId; 279 int32_t mSource; 280 }; 281 282 /* 283 * Key events. 284 */ 285 class KeyEvent : public InputEvent { 286 public: 287 virtual ~KeyEvent() { } 288 289 virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; } 290 291 inline int32_t getAction() const { return mAction; } 292 293 inline int32_t getFlags() const { return mFlags; } 294 295 inline int32_t getKeyCode() const { return mKeyCode; } 296 297 inline int32_t getScanCode() const { return mScanCode; } 298 299 inline int32_t getMetaState() const { return mMetaState; } 300 301 inline int32_t getRepeatCount() const { return mRepeatCount; } 302 303 inline nsecs_t getDownTime() const { return mDownTime; } 304 305 inline nsecs_t getEventTime() const { return mEventTime; } 306 307 // Return true if this event may have a default action implementation. 308 static bool hasDefaultAction(int32_t keyCode); 309 bool hasDefaultAction() const; 310 311 // Return true if this event represents a system key. 312 static bool isSystemKey(int32_t keyCode); 313 bool isSystemKey() const; 314 315 void initialize( 316 int32_t deviceId, 317 int32_t source, 318 int32_t action, 319 int32_t flags, 320 int32_t keyCode, 321 int32_t scanCode, 322 int32_t metaState, 323 int32_t repeatCount, 324 nsecs_t downTime, 325 nsecs_t eventTime); 326 void initialize(const KeyEvent& from); 327 328 protected: 329 int32_t mAction; 330 int32_t mFlags; 331 int32_t mKeyCode; 332 int32_t mScanCode; 333 int32_t mMetaState; 334 int32_t mRepeatCount; 335 nsecs_t mDownTime; 336 nsecs_t mEventTime; 337 }; 338 339 /* 340 * Motion events. 341 */ 342 class MotionEvent : public InputEvent { 343 public: 344 virtual ~MotionEvent() { } 345 346 virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; } 347 348 inline int32_t getAction() const { return mAction; } 349 350 inline int32_t getActionMasked() const { return mAction & AMOTION_EVENT_ACTION_MASK; } 351 352 inline int32_t getActionIndex() const { 353 return (mAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) 354 >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; 355 } 356 357 inline void setAction(int32_t action) { mAction = action; } 358 359 inline int32_t getFlags() const { return mFlags; } 360 361 inline void setFlags(int32_t flags) { mFlags = flags; } 362 363 inline int32_t getEdgeFlags() const { return mEdgeFlags; } 364 365 inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; } 366 367 inline int32_t getMetaState() const { return mMetaState; } 368 369 inline void setMetaState(int32_t metaState) { mMetaState = metaState; } 370 371 inline int32_t getButtonState() const { return mButtonState; } 372 373 inline float getXOffset() const { return mXOffset; } 374 375 inline float getYOffset() const { return mYOffset; } 376 377 inline float getXPrecision() const { return mXPrecision; } 378 379 inline float getYPrecision() const { return mYPrecision; } 380 381 inline nsecs_t getDownTime() const { return mDownTime; } 382 383 inline void setDownTime(nsecs_t downTime) { mDownTime = downTime; } 384 385 inline size_t getPointerCount() const { return mPointerProperties.size(); } 386 387 inline const PointerProperties* getPointerProperties(size_t pointerIndex) const { 388 return &mPointerProperties[pointerIndex]; 389 } 390 391 inline int32_t getPointerId(size_t pointerIndex) const { 392 return mPointerProperties[pointerIndex].id; 393 } 394 395 inline int32_t getToolType(size_t pointerIndex) const { 396 return mPointerProperties[pointerIndex].toolType; 397 } 398 399 inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; } 400 401 const PointerCoords* getRawPointerCoords(size_t pointerIndex) const; 402 403 float getRawAxisValue(int32_t axis, size_t pointerIndex) const; 404 405 inline float getRawX(size_t pointerIndex) const { 406 return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex); 407 } 408 409 inline float getRawY(size_t pointerIndex) const { 410 return getRawAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex); 411 } 412 413 float getAxisValue(int32_t axis, size_t pointerIndex) const; 414 415 inline float getX(size_t pointerIndex) const { 416 return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex); 417 } 418 419 inline float getY(size_t pointerIndex) const { 420 return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex); 421 } 422 423 inline float getPressure(size_t pointerIndex) const { 424 return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex); 425 } 426 427 inline float getSize(size_t pointerIndex) const { 428 return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex); 429 } 430 431 inline float getTouchMajor(size_t pointerIndex) const { 432 return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex); 433 } 434 435 inline float getTouchMinor(size_t pointerIndex) const { 436 return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex); 437 } 438 439 inline float getToolMajor(size_t pointerIndex) const { 440 return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex); 441 } 442 443 inline float getToolMinor(size_t pointerIndex) const { 444 return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex); 445 } 446 447 inline float getOrientation(size_t pointerIndex) const { 448 return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex); 449 } 450 451 inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; } 452 453 inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const { 454 return mSampleEventTimes[historicalIndex]; 455 } 456 457 const PointerCoords* getHistoricalRawPointerCoords( 458 size_t pointerIndex, size_t historicalIndex) const; 459 460 float getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex, 461 size_t historicalIndex) const; 462 463 inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const { 464 return getHistoricalRawAxisValue( 465 AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex); 466 } 467 468 inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const { 469 return getHistoricalRawAxisValue( 470 AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex); 471 } 472 473 float getHistoricalAxisValue(int32_t axis, size_t pointerIndex, size_t historicalIndex) const; 474 475 inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const { 476 return getHistoricalAxisValue( 477 AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex); 478 } 479 480 inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const { 481 return getHistoricalAxisValue( 482 AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex); 483 } 484 485 inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const { 486 return getHistoricalAxisValue( 487 AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex); 488 } 489 490 inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const { 491 return getHistoricalAxisValue( 492 AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex); 493 } 494 495 inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const { 496 return getHistoricalAxisValue( 497 AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex); 498 } 499 500 inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const { 501 return getHistoricalAxisValue( 502 AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex); 503 } 504 505 inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const { 506 return getHistoricalAxisValue( 507 AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex); 508 } 509 510 inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const { 511 return getHistoricalAxisValue( 512 AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex); 513 } 514 515 inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const { 516 return getHistoricalAxisValue( 517 AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex, historicalIndex); 518 } 519 520 ssize_t findPointerIndex(int32_t pointerId) const; 521 522 void initialize( 523 int32_t deviceId, 524 int32_t source, 525 int32_t action, 526 int32_t flags, 527 int32_t edgeFlags, 528 int32_t metaState, 529 int32_t buttonState, 530 float xOffset, 531 float yOffset, 532 float xPrecision, 533 float yPrecision, 534 nsecs_t downTime, 535 nsecs_t eventTime, 536 size_t pointerCount, 537 const PointerProperties* pointerProperties, 538 const PointerCoords* pointerCoords); 539 540 void copyFrom(const MotionEvent* other, bool keepHistory); 541 542 void addSample( 543 nsecs_t eventTime, 544 const PointerCoords* pointerCoords); 545 546 void offsetLocation(float xOffset, float yOffset); 547 548 void scale(float scaleFactor); 549 550 #ifdef HAVE_ANDROID_OS 551 void transform(const SkMatrix* matrix); 552 553 status_t readFromParcel(Parcel* parcel); 554 status_t writeToParcel(Parcel* parcel) const; 555 #endif 556 557 static bool isTouchEvent(int32_t source, int32_t action); 558 inline bool isTouchEvent() const { 559 return isTouchEvent(mSource, mAction); 560 } 561 562 // Low-level accessors. 563 inline const PointerProperties* getPointerProperties() const { 564 return mPointerProperties.array(); 565 } 566 inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); } 567 inline const PointerCoords* getSamplePointerCoords() const { 568 return mSamplePointerCoords.array(); 569 } 570 571 protected: 572 int32_t mAction; 573 int32_t mFlags; 574 int32_t mEdgeFlags; 575 int32_t mMetaState; 576 int32_t mButtonState; 577 float mXOffset; 578 float mYOffset; 579 float mXPrecision; 580 float mYPrecision; 581 nsecs_t mDownTime; 582 Vector<PointerProperties> mPointerProperties; 583 Vector<nsecs_t> mSampleEventTimes; 584 Vector<PointerCoords> mSamplePointerCoords; 585 }; 586 587 /* 588 * Input event factory. 589 */ 590 class InputEventFactoryInterface { 591 protected: 592 virtual ~InputEventFactoryInterface() { } 593 594 public: 595 InputEventFactoryInterface() { } 596 597 virtual KeyEvent* createKeyEvent() = 0; 598 virtual MotionEvent* createMotionEvent() = 0; 599 }; 600 601 /* 602 * A simple input event factory implementation that uses a single preallocated instance 603 * of each type of input event that are reused for each request. 604 */ 605 class PreallocatedInputEventFactory : public InputEventFactoryInterface { 606 public: 607 PreallocatedInputEventFactory() { } 608 virtual ~PreallocatedInputEventFactory() { } 609 610 virtual KeyEvent* createKeyEvent() { return & mKeyEvent; } 611 virtual MotionEvent* createMotionEvent() { return & mMotionEvent; } 612 613 private: 614 KeyEvent mKeyEvent; 615 MotionEvent mMotionEvent; 616 }; 617 618 /* 619 * Calculates the velocity of pointer movements over time. 620 */ 621 class VelocityTracker { 622 public: 623 // Default polynomial degree. (used by getVelocity) 624 static const uint32_t DEFAULT_DEGREE = 2; 625 626 // Default sample horizon. (used by getVelocity) 627 // We don't use too much history by default since we want to react to quick 628 // changes in direction. 629 static const nsecs_t DEFAULT_HORIZON = 100 * 1000000; // 100 ms 630 631 struct Position { 632 float x, y; 633 }; 634 635 struct Estimator { 636 static const size_t MAX_DEGREE = 2; 637 638 // Polynomial coefficients describing motion in X and Y. 639 float xCoeff[MAX_DEGREE + 1], yCoeff[MAX_DEGREE + 1]; 640 641 // Polynomial degree (number of coefficients), or zero if no information is 642 // available. 643 uint32_t degree; 644 645 // Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit). 646 float confidence; 647 648 inline void clear() { 649 degree = 0; 650 confidence = 0; 651 for (size_t i = 0; i <= MAX_DEGREE; i++) { 652 xCoeff[i] = 0; 653 yCoeff[i] = 0; 654 } 655 } 656 }; 657 658 VelocityTracker(); 659 660 // Resets the velocity tracker state. 661 void clear(); 662 663 // Resets the velocity tracker state for specific pointers. 664 // Call this method when some pointers have changed and may be reusing 665 // an id that was assigned to a different pointer earlier. 666 void clearPointers(BitSet32 idBits); 667 668 // Adds movement information for a set of pointers. 669 // The idBits bitfield specifies the pointer ids of the pointers whose positions 670 // are included in the movement. 671 // The positions array contains position information for each pointer in order by 672 // increasing id. Its size should be equal to the number of one bits in idBits. 673 void addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions); 674 675 // Adds movement information for all pointers in a MotionEvent, including historical samples. 676 void addMovement(const MotionEvent* event); 677 678 // Gets the velocity of the specified pointer id in position units per second. 679 // Returns false and sets the velocity components to zero if there is 680 // insufficient movement information for the pointer. 681 bool getVelocity(uint32_t id, float* outVx, float* outVy) const; 682 683 // Gets a quadratic estimator for the movements of the specified pointer id. 684 // Returns false and clears the estimator if there is no information available 685 // about the pointer. 686 bool getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon, 687 Estimator* outEstimator) const; 688 689 // Gets the active pointer id, or -1 if none. 690 inline int32_t getActivePointerId() const { return mActivePointerId; } 691 692 // Gets a bitset containing all pointer ids from the most recent movement. 693 inline BitSet32 getCurrentPointerIdBits() const { return mMovements[mIndex].idBits; } 694 695 private: 696 // Number of samples to keep. 697 static const uint32_t HISTORY_SIZE = 20; 698 699 struct Movement { 700 nsecs_t eventTime; 701 BitSet32 idBits; 702 Position positions[MAX_POINTERS]; 703 704 inline const Position& getPosition(uint32_t id) const { 705 return positions[idBits.getIndexOfBit(id)]; 706 } 707 }; 708 709 uint32_t mIndex; 710 Movement mMovements[HISTORY_SIZE]; 711 int32_t mActivePointerId; 712 }; 713 714 715 /* 716 * Specifies parameters that govern pointer or wheel acceleration. 717 */ 718 struct VelocityControlParameters { 719 // A scale factor that is multiplied with the raw velocity deltas 720 // prior to applying any other velocity control factors. The scale 721 // factor should be used to adapt the input device resolution 722 // (eg. counts per inch) to the output device resolution (eg. pixels per inch). 723 // 724 // Must be a positive value. 725 // Default is 1.0 (no scaling). 726 float scale; 727 728 // The scaled speed at which acceleration begins to be applied. 729 // This value establishes the upper bound of a low speed regime for 730 // small precise motions that are performed without any acceleration. 731 // 732 // Must be a non-negative value. 733 // Default is 0.0 (no low threshold). 734 float lowThreshold; 735 736 // The scaled speed at which maximum acceleration is applied. 737 // The difference between highThreshold and lowThreshold controls 738 // the range of speeds over which the acceleration factor is interpolated. 739 // The wider the range, the smoother the acceleration. 740 // 741 // Must be a non-negative value greater than or equal to lowThreshold. 742 // Default is 0.0 (no high threshold). 743 float highThreshold; 744 745 // The acceleration factor. 746 // When the speed is above the low speed threshold, the velocity will scaled 747 // by an interpolated value between 1.0 and this amount. 748 // 749 // Must be a positive greater than or equal to 1.0. 750 // Default is 1.0 (no acceleration). 751 float acceleration; 752 753 VelocityControlParameters() : 754 scale(1.0f), lowThreshold(0.0f), highThreshold(0.0f), acceleration(1.0f) { 755 } 756 757 VelocityControlParameters(float scale, float lowThreshold, 758 float highThreshold, float acceleration) : 759 scale(scale), lowThreshold(lowThreshold), 760 highThreshold(highThreshold), acceleration(acceleration) { 761 } 762 }; 763 764 /* 765 * Implements mouse pointer and wheel speed control and acceleration. 766 */ 767 class VelocityControl { 768 public: 769 VelocityControl(); 770 771 /* Sets the various parameters. */ 772 void setParameters(const VelocityControlParameters& parameters); 773 774 /* Resets the current movement counters to zero. 775 * This has the effect of nullifying any acceleration. */ 776 void reset(); 777 778 /* Translates a raw movement delta into an appropriately 779 * scaled / accelerated delta based on the current velocity. */ 780 void move(nsecs_t eventTime, float* deltaX, float* deltaY); 781 782 private: 783 // If no movements are received within this amount of time, 784 // we assume the movement has stopped and reset the movement counters. 785 static const nsecs_t STOP_TIME = 500 * 1000000; // 500 ms 786 787 VelocityControlParameters mParameters; 788 789 nsecs_t mLastMovementTime; 790 VelocityTracker::Position mRawPosition; 791 VelocityTracker mVelocityTracker; 792 }; 793 794 795 /* 796 * Describes the characteristics and capabilities of an input device. 797 */ 798 class InputDeviceInfo { 799 public: 800 InputDeviceInfo(); 801 InputDeviceInfo(const InputDeviceInfo& other); 802 ~InputDeviceInfo(); 803 804 struct MotionRange { 805 int32_t axis; 806 uint32_t source; 807 float min; 808 float max; 809 float flat; 810 float fuzz; 811 }; 812 813 void initialize(int32_t id, const String8& name); 814 815 inline int32_t getId() const { return mId; } 816 inline const String8 getName() const { return mName; } 817 inline uint32_t getSources() const { return mSources; } 818 819 const MotionRange* getMotionRange(int32_t axis, uint32_t source) const; 820 821 void addSource(uint32_t source); 822 void addMotionRange(int32_t axis, uint32_t source, 823 float min, float max, float flat, float fuzz); 824 void addMotionRange(const MotionRange& range); 825 826 inline void setKeyboardType(int32_t keyboardType) { mKeyboardType = keyboardType; } 827 inline int32_t getKeyboardType() const { return mKeyboardType; } 828 829 inline void setKeyCharacterMapFile(const String8& value) { mKeyCharacterMapFile = value; } 830 inline const String8& getKeyCharacterMapFile() const { return mKeyCharacterMapFile; } 831 832 inline const Vector<MotionRange>& getMotionRanges() const { 833 return mMotionRanges; 834 } 835 836 private: 837 int32_t mId; 838 String8 mName; 839 uint32_t mSources; 840 int32_t mKeyboardType; 841 String8 mKeyCharacterMapFile; 842 843 Vector<MotionRange> mMotionRanges; 844 }; 845 846 /* 847 * Identifies a device. 848 */ 849 struct InputDeviceIdentifier { 850 inline InputDeviceIdentifier() : 851 bus(0), vendor(0), product(0), version(0) { 852 } 853 854 String8 name; 855 String8 location; 856 String8 uniqueId; 857 uint16_t bus; 858 uint16_t vendor; 859 uint16_t product; 860 uint16_t version; 861 }; 862 863 /* Types of input device configuration files. */ 864 enum InputDeviceConfigurationFileType { 865 INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0, /* .idc file */ 866 INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT = 1, /* .kl file */ 867 INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP = 2, /* .kcm file */ 868 }; 869 870 /* 871 * Gets the path of an input device configuration file, if one is available. 872 * Considers both system provided and user installed configuration files. 873 * 874 * The device identifier is used to construct several default configuration file 875 * names to try based on the device name, vendor, product, and version. 876 * 877 * Returns an empty string if not found. 878 */ 879 extern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier( 880 const InputDeviceIdentifier& deviceIdentifier, 881 InputDeviceConfigurationFileType type); 882 883 /* 884 * Gets the path of an input device configuration file, if one is available. 885 * Considers both system provided and user installed configuration files. 886 * 887 * The name is case-sensitive and is used to construct the filename to resolve. 888 * All characters except 'a'-'z', 'A'-'Z', '0'-'9', '-', and '_' are replaced by underscores. 889 * 890 * Returns an empty string if not found. 891 */ 892 extern String8 getInputDeviceConfigurationFilePathByName( 893 const String8& name, InputDeviceConfigurationFileType type); 894 895 } // namespace android 896 897 #endif // _UI_INPUT_H 898