From f289bbab97651692edaa8e76ace090a1d67a8b1e Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 6 Sep 2023 12:57:59 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/tap/DeviceFlipDetector.kt | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 app/src/main/java/com/tangem/tap/DeviceFlipDetector.kt diff --git a/app/src/main/java/com/tangem/tap/DeviceFlipDetector.kt b/app/src/main/java/com/tangem/tap/DeviceFlipDetector.kt new file mode 100644 index 0000000000..fe0dc2f8fc --- /dev/null +++ b/app/src/main/java/com/tangem/tap/DeviceFlipDetector.kt @@ -0,0 +1,56 @@ +package com.tangem.tap + +import android.content.Context +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager +import android.os.SystemClock +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow + +@ExperimentalCoroutinesApi +class DeviceFlipDetector(context: Context) { + + private val sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager + private var gravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) + + private val zAxisThreshold = -6 + private val throttleTimeMs = 3000 + private var lastTriggerTime = 0L + private var isScreenDown = false + + fun deviceFlipEvents(): Flow = callbackFlow { + val listener = object : SensorEventListener { + override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { + /* no-op */ + } + + override fun onSensorChanged(event: SensorEvent?) { + event?.let { + val currentTime = SystemClock.elapsedRealtime() + val zAxisValue = it.values[2] + + if (zAxisValue < zAxisThreshold && !isScreenDown) { + isScreenDown = true + lastTriggerTime = currentTime + } else if (zAxisValue >= zAxisThreshold) { + if (isScreenDown && currentTime - lastTriggerTime <= throttleTimeMs) { + lastTriggerTime = currentTime + trySend(Unit) + } + isScreenDown = false + } + } + } + } + + gravitySensor?.let { + sensorManager.registerListener(listener, it, SensorManager.SENSOR_DELAY_NORMAL) + } + + awaitClose { sensorManager.unregisterListener(listener) } + } +} \ No newline at end of file