Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fe0994a7 authored by Austin Delgado's avatar Austin Delgado
Browse files

Add check for whether entire ellipse touch is within sensor

Bug: 268672580
Test: atest SystemUITests: com.android.systemui.biometrics
Change-Id: Ib36d969e7a245412f68d4fd9b5213225098dbc68
parent 28ad0bee
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -22,7 +22,9 @@ 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
@@ -40,6 +42,11 @@ 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)) {
            return true
        }

        var isTargetTouched = false
        var sensorPixels = 0
        var coveredPixels = 0
@@ -112,4 +119,28 @@ 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)
    }
}