From d0d63c1d4b7aa395e35fcaf5cca1de45355f88d0 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 29 Oct 2026 10:26:12 +0100 Subject: [PATCH] Keep voice cleanup independent of caller cancellation and stop playback promptly --- .../src/main/java/com/utun/chat/data/AudioRecorderManager.kt | 4 ++-- .../kotlin/com/utun/chat/data/AudioRecorderManagerTest.kt | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AudioRecorderManager.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AudioRecorderManager.kt index c41d0898..2888ce62 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AudioRecorderManager.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AudioRecorderManager.kt @@ -241,10 +241,10 @@ class AudioRecorderManager { while (true) { val previous = closing.get() if (previous != null && !previous.isDone) return previous - val next = CompletableFuture() + val next = object : CompletableFuture() { override fun cancel(mayInterruptIfRunning: Boolean): Boolean = false } if (closing.compareAndSet(previous, next)) { result = next; break } } - captureRunning = false; recordingThread?.interrupt() + captureRunning = false; recordingThread?.interrupt(); stopPlayback() try { Thread({ var retryMs = 250L diff --git a/tools/chatgui-android/capture-tests/src/test/kotlin/com/utun/chat/data/AudioRecorderManagerTest.kt b/tools/chatgui-android/capture-tests/src/test/kotlin/com/utun/chat/data/AudioRecorderManagerTest.kt index 09b1f09e..a825bbfd 100644 --- a/tools/chatgui-android/capture-tests/src/test/kotlin/com/utun/chat/data/AudioRecorderManagerTest.kt +++ b/tools/chatgui-android/capture-tests/src/test/kotlin/com/utun/chat/data/AudioRecorderManagerTest.kt @@ -185,6 +185,7 @@ class AudioRecorderManagerTest { val device = plan(); assertTrue(manager.startRecording("7")); device.failures = setOf("release") val closed = manager.requestClose() waitUntil { NativeLib.cancels.get() == 1 } + assertFalse(closed.cancel(true)) assertFalse(closed.isDone); assertFalse(NativeLib.active) assertThrows(IllegalStateException::class.java) { AudioRecorderManager.requireReleasedForCore() } device.failures = emptySet(); closed.get(2, TimeUnit.SECONDS)