Allow touch if some pointers are MT_TOOL_PALM

We would cancel all touch when we recevied MT_TOOL_PALM because it
becomes accidental touch, and that would break user gesture when
another non-palm pointer is still active.

- Send ACTION_POINTER_UP with AKEY_EVENT_FLAG_CANCELED when recevie
  MT_TOOL_PALM if at least 2 pointers are active.
- Send ACTION_CANEL when receive MT_TOOL_PALM if only one pointer.
- Add test caseis for touch cancel scenarios, to test it would keep
  dispatching non-palm event.

Test: atest inputflinger_tests
Bug: 137221719
Change-Id: Ife35a692c71e45159bfcc771317dff47fa764dda
diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.h b/services/inputflinger/reader/mapper/TouchInputMapper.h
index d437e01..94486a6 100644
--- a/services/inputflinger/reader/mapper/TouchInputMapper.h
+++ b/services/inputflinger/reader/mapper/TouchInputMapper.h
@@ -71,7 +71,7 @@
 
     uint32_t pointerCount;
     Pointer pointers[MAX_POINTERS];
-    BitSet32 hoveringIdBits, touchingIdBits;
+    BitSet32 hoveringIdBits, touchingIdBits, canceledIdBits;
     uint32_t idToIndex[MAX_POINTER_ID + 1];
 
     RawPointerData();
@@ -90,6 +90,7 @@
     inline void clearIdBits() {
         hoveringIdBits.clear();
         touchingIdBits.clear();
+        canceledIdBits.clear();
     }
 
     inline const Pointer& pointerForId(uint32_t id) const { return pointers[idToIndex[id]]; }
@@ -102,7 +103,7 @@
     uint32_t pointerCount;
     PointerProperties pointerProperties[MAX_POINTERS];
     PointerCoords pointerCoords[MAX_POINTERS];
-    BitSet32 hoveringIdBits, touchingIdBits;
+    BitSet32 hoveringIdBits, touchingIdBits, canceledIdBits;
     uint32_t idToIndex[MAX_POINTER_ID + 1];
 
     CookedPointerData();