From 7aea41eedef93e5a3502a5cfe44415f5b880c390 Mon Sep 17 00:00:00 2001 From: Aleksandras Kostarevas Date: Mon, 22 Jan 2024 08:21:27 +0200 Subject: [PATCH] Add decomposeTapPosition fallback for nonintersecting cases --- .../src/suggest/core/layout/proximity_info.h | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/native/jni/src/suggest/core/layout/proximity_info.h b/native/jni/src/suggest/core/layout/proximity_info.h index 9bd5ba156..bbf818681 100644 --- a/native/jni/src/suggest/core/layout/proximity_info.h +++ b/native/jni/src/suggest/core/layout/proximity_info.h @@ -147,6 +147,7 @@ class ProximityInfo { float tapRadius = MOST_COMMON_KEY_WIDTH / 1.33f; float totalArea = M_PI * ((float)(tapRadius * tapRadius)); + bool anySet = false; for(int key = 0; key < KEY_COUNT; key++) { const int left = mKeyXCoordinates[key]; const int top = mKeyYCoordinates[key]; @@ -154,6 +155,33 @@ class ProximityInfo { const int bottom = top + mKeyHeights[key]; percentages[key] = insmat::area(left, right, bottom, top, tapX, tapY, tapRadius) / totalArea; + + if(percentages[key] > 0.05f) { + anySet = true; + } + } + + if(!anySet) { + // Fallback - have to pick the closest key + AKLOGE("FALLBACK - Have to pick closest key"); + int closestKey = -1; + int minDistance = 1000000; + for(int key = 0; key < KEY_COUNT; key++) { + const int keyX = mKeyXCoordinates[key]; + const int keyY = mKeyYCoordinates[key]; + + const int distance = (keyX - tapX) * (keyX - tapX) + (keyY - tapY) * (keyY - tapY); + if(distance < minDistance) { + minDistance = distance; + closestKey = key; + } + } + + if(closestKey != -1) { + percentages[closestKey] = 1.0f; + } else { + AKLOGE("Failed to find even the closest key!"); + } } return percentages;