Merge "Accept touches within sensor bounds during ellipse detection" into udc-dev am: 269e417a53 am: a719bf17da

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22773566

Change-Id: I460f72feeb826a8baa3fd1dc0242a733ec49e315
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2023-04-21 19:06:24 +00:00
committed by Automerger Merge Worker
2 changed files with 17 additions and 33 deletions

View File

@@ -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)
}
}

View File

@@ -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) }
}
}