diff options
| author | 2023-04-21 18:09:20 +0000 | |
|---|---|---|
| committer | 2023-04-21 18:09:20 +0000 | |
| commit | 269e417a53621c0457d01c58015878d9853ce946 (patch) | |
| tree | 98d02531f5c827b7572f16b28b37253947cb4019 | |
| parent | aa3a23f82338dfba3b2d4f3b04508216334a2a99 (diff) | |
| parent | 9140a682d4e952daa729221ccc1b3dfd838d1657 (diff) | |
Merge "Accept touches within sensor bounds during ellipse detection" into udc-dev
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) } + } +} |