summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeff Brown <jeffbrown@google.com> 2011-05-25 14:46:53 -0700
committer Android Git Automerger <android-git-automerger@android.com> 2011-05-25 14:46:53 -0700
commit98d1f99704b78cd17c7cdaa5d4898d3547428a28 (patch)
tree2ee963463c3506b8788200904160b078e5e5a51d
parent6f5893ff6c1e8402d4470c5ada07c39ebc4dc3a7 (diff)
parent01fdb1bb41dbdfa8366f4d957ef09ba1a8c4a8bb (diff)
am 8148cc3e: am 86ea1f5f: Initial checkin of spot presentation for touchpad gestures. (DO NOT MERGE)
* commit '8148cc3e47e50c916066e2fed562618b5827188f': Initial checkin of spot presentation for touchpad gestures. (DO NOT MERGE)
-rw-r--r--include/ui/Input.h5
-rw-r--r--libs/ui/Input.cpp9
-rw-r--r--libs/utils/Looper.cpp3
3 files changed, 16 insertions, 1 deletions
diff --git a/include/ui/Input.h b/include/ui/Input.h
index 1ef36d0079..fb6152e9f3 100644
--- a/include/ui/Input.h
+++ b/include/ui/Input.h
@@ -608,6 +608,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 0a53d69bef..684c332d11 100644
--- a/libs/ui/Input.cpp
+++ b/libs/ui/Input.cpp
@@ -831,6 +831,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;
@@ -857,6 +858,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,