diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallVideoEngine.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallVideoEngine.kt index b61b6aa6..7816bc7f 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallVideoEngine.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallVideoEngine.kt @@ -70,6 +70,7 @@ class CallVideoEngine(private val context: Context, private val id: Long) { private var sessionSerial = 0L private val sessions = mutableMapOf Unit>>() @Volatile private var stopped = false + private var stopCleanupPosted = false // Main: RX join/native close и постановка финального camera cleanup подтверждены. private var encoders = emptyMap() private var caps = ByteArray(64) private var wanted = CallVideoSettings() @@ -580,9 +581,9 @@ class CallVideoEngine(private val context: Context, private val id: Long) { } fun stop() { - if (stopped) return + if (stopCleanupPosted) return stopped = true; player.stop(); CallVideoNative.close(id) - handler.post { + check(handler.post { observeOrientation(false) mutable.value = mutable.value.copy(transmitting = false, activeCodec = 0) closeCamera(); encoder?.close(); encoder = null; pendingFrames.clear() @@ -590,6 +591,10 @@ class CallVideoEngine(private val context: Context, private val id: Long) { if (camera == null && !opening) thread.quitSafely() else handler.postDelayed({ thread.quitSafely() }, 3000) LogManager.addLog("INFO", "call", "video workers stopped id=$id") + }) { + LogManager.addLog("ERROR", "call", "video stop cleanup rejected id=$id; stop remains retryable") + "Video cleanup worker rejected stop" } + stopCleanupPosted = true } } diff --git a/tools/chatgui-android/call-service-tests/src/test/kotlin/com/utun/chat/data/CallServiceLifecycleTest.kt b/tools/chatgui-android/call-service-tests/src/test/kotlin/com/utun/chat/data/CallServiceLifecycleTest.kt index d9d2279a..0460efe4 100644 --- a/tools/chatgui-android/call-service-tests/src/test/kotlin/com/utun/chat/data/CallServiceLifecycleTest.kt +++ b/tools/chatgui-android/call-service-tests/src/test/kotlin/com/utun/chat/data/CallServiceLifecycleTest.kt @@ -48,6 +48,7 @@ class CallServiceLifecycleTest { } @After fun release() { + NativeLib.failActivityRequest = false Handler.rejectImmediate = false; Handler.rejectDelayed = false AppLanguage.failText = false; NotificationCompat.failBuild = false; CallVideoEngine.failCreate = false power.failures = emptySet(); power.locks.forEach { it.failures = emptySet() }