From 0afc74e5676f9f9acf4a262628c71a5d5a6be989 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 29 Jul 2026 02:08:51 +0300 Subject: [PATCH] fix: stop/pause no longer fires onComplete from killed thread MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When stopPlayback/pausePlayback kills the playback thread, the thread's onComplete callback was still firing, resetting UI state (playing=false, elapsed=0). Added @Volatile 'stopped' flag — onComplete only fires on natural completion, not on external stop/pause. --- .../java/com/utun/chat/data/AudioRecorderManager.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 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 4ee14b23..38193669 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 @@ -185,6 +185,7 @@ class AudioRecorderManager { @Volatile var elapsedMs: Int = 0; private set var pausedElapsedMs: Int = 0; private set private var playThread: Thread? = null + @Volatile private var stopped = false fun playVoiceFile(filePath: String, onProgress: ((Float) -> Unit)? = null, onComplete: () -> Unit = {}) { playFromPosition(filePath, 0, onProgress, onComplete) @@ -245,19 +246,22 @@ class AudioRecorderManager { } catch (e: Exception) { LogManager.addLog("ERROR", "AudioPlayer", "play error: ${e.message}") } - playing = false; isPaused = false - onComplete() + if (!stopped) { + playing = false; isPaused = false; onComplete() + } }.apply { start() } } fun pausePlayback() { pausedElapsedMs = elapsedMs - isPaused = true; playing = false + stopped = true; isPaused = true; playing = false playThread?.join(500); playThread = null + stopped = false } fun stopPlayback() { - playing = false; isPaused = false; pausedElapsedMs = 0 + stopped = true; playing = false; isPaused = false; pausedElapsedMs = 0 playThread?.join(500); playThread = null + stopped = false } }