diff options
| author | 2011-04-19 15:37:32 -0700 | |
|---|---|---|
| committer | 2011-04-19 15:37:32 -0700 | |
| commit | 96dfedc55cab10922c677e3c8da11dc51e80b30c (patch) | |
| tree | c8a0bed434cc7e334a857e543223587adc388da0 | |
| parent | 3426853d2c2f71a3bc2e3b59290dbef24c10cc7c (diff) | |
| parent | 4815f2a6ada7941680b29581d5cf5a5ed168f618 (diff) | |
Merge "Initial checkin of spot presentation for touchpad gestures."
| -rw-r--r-- | include/ui/Input.h | 5 | ||||
| -rw-r--r-- | libs/ui/Input.cpp | 9 | ||||
| -rw-r--r-- | libs/utils/Looper.cpp | 3 | 
3 files changed, 16 insertions, 1 deletions
diff --git a/include/ui/Input.h b/include/ui/Input.h index 0dc29c8e0b..9b92c73c42 100644 --- a/include/ui/Input.h +++ b/include/ui/Input.h @@ -620,6 +620,11 @@ private:      // Oldest sample to consider when calculating the velocity.      static const nsecs_t MAX_AGE = 200 * 1000000; // 200 ms +    // When the total duration of the window of samples being averaged is less +    // than the window size, the resulting velocity is scaled to reduce the impact +    // of overestimation in short traces. +    static const nsecs_t MIN_WINDOW = 100 * 1000000; // 100 ms +      // The minimum duration between samples when estimating velocity.      static const nsecs_t MIN_DURATION = 10 * 1000000; // 10 ms diff --git a/libs/ui/Input.cpp b/libs/ui/Input.cpp index bbe579ea83..a95f432619 100644 --- a/libs/ui/Input.cpp +++ b/libs/ui/Input.cpp @@ -832,6 +832,7 @@ bool VelocityTracker::getVelocity(uint32_t id, float* outVx, float* outVy) const          const Position& oldestPosition =                  oldestMovement.positions[oldestMovement.idBits.getIndexOfBit(id)];          nsecs_t lastDuration = 0; +          while (numTouches-- > 1) {              if (++index == HISTORY_SIZE) {                  index = 0; @@ -858,6 +859,14 @@ bool VelocityTracker::getVelocity(uint32_t id, float* outVx, float* outVy) const          // Make sure we used at least one sample.          if (samplesUsed != 0) { +            // Scale the velocity linearly if the window of samples is small. +            nsecs_t totalDuration = newestMovement.eventTime - oldestMovement.eventTime; +            if (totalDuration < MIN_WINDOW) { +                float scale = float(totalDuration) / float(MIN_WINDOW); +                accumVx *= scale; +                accumVy *= scale; +            } +              *outVx = accumVx;              *outVy = accumVy;              return true; diff --git a/libs/utils/Looper.cpp b/libs/utils/Looper.cpp index d5dd126065..b54fb9dd73 100644 --- a/libs/utils/Looper.cpp +++ b/libs/utils/Looper.cpp @@ -662,7 +662,8 @@ void Looper::wakeAndLock() {  #endif  void Looper::sendMessage(const sp<MessageHandler>& handler, const Message& message) { -    sendMessageAtTime(LLONG_MIN, handler, message); +    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); +    sendMessageAtTime(now, handler, message);  }  void Looper::sendMessageDelayed(nsecs_t uptimeDelay, const sp<MessageHandler>& handler,  |