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