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 },