diff options
| author | 2023-04-20 14:07:08 -0700 | |
|---|---|---|
| committer | 2023-04-20 14:11:57 -0700 | |
| commit | 9140a682d4e952daa729221ccc1b3dfd838d1657 (patch) | |
| tree | 7c959a8eb0eeddd5463d8145a7c2334002d7faa9 | |
| parent | f2ec83ae6d71a4468a8bbebb33a25f48e49d7be4 (diff) | |
Accept touches within sensor bounds during ellipse detection
Skip checking for valid ellipse overlap if touch is within the sensor.
Bug: 272200648
Test: atest SystemUITests:com.android.systemui.biometrics
Change-Id: Ice038530bc48b8722d7e8cbf223b86c85fc6b84c
2 files changed, 17 insertions, 33 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/udfps/EllipseOverlapDetector.kt b/packages/SystemUI/src/com/android/systemui/biometrics/udfps/EllipseOverlapDetector.kt index 9847c10abd5c..baf8d743938d 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/udfps/EllipseOverlapDetector.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/udfps/EllipseOverlapDetector.kt @@ -22,9 +22,7 @@ import android.util.Log import com.android.systemui.biometrics.EllipseOverlapDetectorParams import com.android.systemui.dagger.SysUISingleton import kotlin.math.cos -import kotlin.math.pow import kotlin.math.sin -import kotlin.math.sqrt private enum class SensorPixelPosition { OUTSIDE, // Pixel that falls outside of sensor circle @@ -42,8 +40,8 @@ private val TAG = "EllipseOverlapDetector" @SysUISingleton class EllipseOverlapDetector(private val params: EllipseOverlapDetectorParams) : OverlapDetector { override fun isGoodOverlap(touchData: NormalizedTouchData, nativeSensorBounds: Rect): Boolean { - // First, check if entire ellipse is within the sensor - if (isEllipseWithinSensor(touchData, nativeSensorBounds)) { + // First, check if touch is within bounding box, + if (nativeSensorBounds.contains(touchData.x.toInt(), touchData.y.toInt())) { return true } @@ -119,28 +117,4 @@ class EllipseOverlapDetector(private val params: EllipseOverlapDetectorParams) : return result <= 1 } - - /** Returns whether the entire ellipse is contained within the sensor area */ - private fun isEllipseWithinSensor( - touchData: NormalizedTouchData, - nativeSensorBounds: Rect - ): Boolean { - val a2 = (touchData.minor / 2.0).pow(2.0) - val b2 = (touchData.major / 2.0).pow(2.0) - - val sin2a = sin(touchData.orientation.toDouble()).pow(2.0) - val cos2a = cos(touchData.orientation.toDouble()).pow(2.0) - - val cx = sqrt(a2 * cos2a + b2 * sin2a) - val cy = sqrt(a2 * sin2a + b2 * cos2a) - - val ellipseRect = - Rect( - (-cx + touchData.x).toInt(), - (-cy + touchData.y).toInt(), - (cx + touchData.x).toInt(), - (cy + touchData.y).toInt() - ) - return nativeSensorBounds.contains(ellipseRect) - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/udfps/EllipseOverlapDetectorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/udfps/EllipseOverlapDetectorTest.kt index 4b41537208da..fb3c1854e996 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/udfps/EllipseOverlapDetectorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/udfps/EllipseOverlapDetectorTest.kt @@ -61,7 +61,7 @@ class EllipseOverlapDetectorTest(val testCase: TestCase) : SysuiTestCase() { @JvmStatic fun data(): List<TestCase> = listOf( - genTestCases( + genPositiveTestCases( innerXs = listOf(SENSOR.left, SENSOR.right, SENSOR.centerX()), innerYs = listOf(SENSOR.top, SENSOR.bottom, SENSOR.centerY()), outerXs = listOf(SENSOR.left - 1, SENSOR.right + 1), @@ -70,9 +70,7 @@ class EllipseOverlapDetectorTest(val testCase: TestCase) : SysuiTestCase() { major = 300f, expected = true ), - genTestCases( - innerXs = listOf(SENSOR.left, SENSOR.right), - innerYs = listOf(SENSOR.top, SENSOR.bottom), + genNegativeTestCase( outerXs = listOf(SENSOR.left - 1, SENSOR.right + 1), outerYs = listOf(SENSOR.top - 1, SENSOR.bottom + 1), minor = 100f, @@ -107,7 +105,7 @@ private val TOUCH_DATA = private val SENSOR = Rect(100 /* left */, 200 /* top */, 300 /* right */, 400 /* bottom */) -private fun genTestCases( +private fun genPositiveTestCases( innerXs: List<Int>, innerYs: List<Int>, outerXs: List<Int>, @@ -122,3 +120,15 @@ private fun genTestCases( } } } + +private fun genNegativeTestCase( + outerXs: List<Int>, + outerYs: List<Int>, + minor: Float, + major: Float, + expected: Boolean +): List<EllipseOverlapDetectorTest.TestCase> { + return outerXs.flatMap { x -> + outerYs.map { y -> EllipseOverlapDetectorTest.TestCase(x, y, minor, major, expected) } + } +} |