From 1b3d9ff8ee41f6d7cbe3db8821286db854609df4 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 15 Oct 2026 01:42:17 +0200 Subject: [PATCH] Distinguish unknown proximity from confirmed far before speaker changes --- .../java/com/utun/chat/data/CallAudioRouter.kt | 6 +++--- .../java/com/utun/chat/data/ProximityManager.kt | 14 ++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallAudioRouter.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallAudioRouter.kt index 740aecf4..036f5a5d 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallAudioRouter.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallAudioRouter.kt @@ -141,19 +141,19 @@ class CallAudioRouter { LogManager.addLog("INFO", "CallAudioRouter", "stopped") } - fun setRoute(r: AudioRoute, preferWired: Boolean = false) { + fun setRoute(r: AudioRoute, preferWired: Boolean = false, automatic: Boolean = false) { if (r == AudioRoute.HEADSET && !headsetAvailable) { LogManager.addLog("WARN", "CallAudioRouter", "setRoute HEADSET rejected: no headset available") return } - autoHeadset = false + if (!automatic) autoHeadset = false val preferenceChanged = preferWiredHeadset != preferWired preferWiredHeadset = preferWired if (route == r && !preferenceChanged) return route = r preferredRoute = r applyRoute(r) - LogManager.addLog("INFO", "CallAudioRouter", "route -> $r (headsetAvailable=$headsetAvailable)") + LogManager.addLog("INFO", "CallAudioRouter", "route -> $r (headsetAvailable=$headsetAvailable automatic=$automatic)") onChanged?.invoke(route, headsetAvailable) } diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/ProximityManager.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/ProximityManager.kt index 90a1c3eb..e4086e9d 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/ProximityManager.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/ProximityManager.kt @@ -21,8 +21,9 @@ class ProximityManager(private val context: Context) { context.getSystemService(Context.SENSOR_SERVICE) as SensorManager private val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY) - private val _near = MutableStateFlow(false) - val near: StateFlow = _near + // null — первое показание ещё не получено; это не подтверждённое FAR. + private val _near = MutableStateFlow(null) + val near: StateFlow = _near private var listener: SensorEventListener? = null private var started = false @@ -37,6 +38,7 @@ class ProximityManager(private val context: Context) { val s = sensor if (s == null) { LogManager.addLog("WARN", "Proximity", "no proximity sensor on this device") + _near.value = false return } val l = object : SensorEventListener { @@ -52,16 +54,20 @@ class ProximityManager(private val context: Context) { override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {} } listener = l - sensorManager.registerListener(l, s, SensorManager.SENSOR_DELAY_NORMAL) + if (!sensorManager.registerListener(l, s, SensorManager.SENSOR_DELAY_NORMAL)) { + listener = null; started = false + LogManager.addLog("WARN", "Proximity", "sensor registration failed; proximity remains unknown") + return + } LogManager.addLog("INFO", "Proximity", "started (maxRange=${s.maximumRange})") } fun stop() { + _near.value = null if (!started) return started = false listener?.let { sensorManager.unregisterListener(it) } listener = null - _near.value = false LogManager.addLog("INFO", "Proximity", "stopped") } }