This patch prevents the unexpected click after the scrolling event
A finger that was previously recognized as thumb could change and
become a non-thumb finger. This CL stops this transition from
sending a click event.
A regression test is also added CL:284736
BUG=chromium:508139
TEST=Passed the regression tests and fixed link/ttc_with_palm
Change-Id: I0cfc9d82a6c00510e6f4dac4d247851714ad1cce
Reviewed-on: https://chromium-review.googlesource.com/284873
Reviewed-by: Andrew de los Reyes <adlr@chromium.org>
Commit-Queue: Amirhossein Simjour <asimjour@chromium.org>
Tested-by: Amirhossein Simjour <asimjour@chromium.org>
diff --git a/include/immediate_interpreter.h b/include/immediate_interpreter.h
index 8730db7..315e159 100644
--- a/include/immediate_interpreter.h
+++ b/include/immediate_interpreter.h
@@ -748,6 +748,9 @@
// This much time after fingers change, stop allowing contacts classified
// as thumb to be classified as non-thumb.
DoubleProperty thumb_eval_timeout_;
+ // If a finger is recognized as thumb, it has only this much time to change
+ // its status and perform a click
+ DoubleProperty thumb_click_prevention_timeout_;
// Consider scroll vs pointing if finger moves at least this distance [mm]
DoubleProperty two_finger_scroll_distance_thresh_;
// Maximum distance [mm] between the outermost fingers while performing a
diff --git a/src/immediate_interpreter.cc b/src/immediate_interpreter.cc
index ed1649d..fb9573f 100644
--- a/src/immediate_interpreter.cc
+++ b/src/immediate_interpreter.cc
@@ -1037,6 +1037,8 @@
thumb_movement_factor_(prop_reg, "Thumb Movement Factor", 0.5),
thumb_speed_factor_(prop_reg, "Thumb Speed Factor", 0.5),
thumb_eval_timeout_(prop_reg, "Thumb Evaluation Timeout", 0.06),
+ thumb_click_prevention_timeout_(prop_reg,
+ "Thumb Click Prevention Timeout", 0.2),
two_finger_scroll_distance_thresh_(prop_reg,
"Two Finger Scroll Distance Thresh",
2.0),
@@ -2149,7 +2151,12 @@
if (hwstate && (!same_fingers || prev_tap_gs_fingers_ != tap_gs_fingers)) {
// See if fingers were added
for (FingerMap::const_iterator it =
- tap_gs_fingers.begin(), e = tap_gs_fingers.end(); it != e; ++it)
+ tap_gs_fingers.begin(), e = tap_gs_fingers.end(); it != e; ++it) {
+ // If the finger was marked as a thumb before, it is not new.
+ if (hwstate->timestamp - finger_origin_timestamp(*it) >
+ thumb_click_prevention_timeout_.val_)
+ continue;
+
if (!SetContainsValue(prev_tap_gs_fingers_, *it)) {
// Gesturing finger wasn't in prev state. It's new.
const FingerState* fs = hwstate->GetFingerState(*it);
@@ -2160,6 +2167,7 @@
added_fingers.insert(*it);
Log("TTC: Added %d", *it);
}
+ }
// See if fingers were removed or are now non-gesturing (dead)
for (FingerMap::const_iterator it =
diff --git a/src/immediate_interpreter_unittest.cc b/src/immediate_interpreter_unittest.cc
index b18f3a0..cb6f39e 100644
--- a/src/immediate_interpreter_unittest.cc
+++ b/src/immediate_interpreter_unittest.cc
@@ -1917,7 +1917,7 @@
{C,{1.02,0,0,0,NULL,0,0,0,0},-1,MkSet(),0,0,kIdl,false},
// 1-finger marked as palm for a long time then unmarked - shouldn't tap
{S,{0.00,0,1,1,&fs[34],0,0,0,0},-1,MkSet(),0,0,kIdl,false},
- {C,{1.50,0,1,1,&fs[0],0,0,0,0},-1,MkSet(91),0,0,kFTB,false},
+ {C,{1.50,0,1,1,&fs[0],0,0,0,0},-1,MkSet(91),0,0,kIdl,false},
{C,{1.51,0,0,0,NULL,0,0,0,0},-1,MkSet(),0,0,kIdl,false},
//{C,{ 0.08, 0, 0, 0, NULL, 0, 0, 0, 0 }, .07, MkSet(), 0, 0, kIdl, false },