diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/UtunConnection.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/UtunConnection.kt index b7f6dea4..6bec62c6 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/UtunConnection.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/UtunConnection.kt @@ -45,6 +45,7 @@ class UtunConnection( private var requestedEndpoint: android.os.ParcelUuid? = null private var requestSerial = 0L private var requestedLegacyRoute = 0 + private var lastRequestedRoute: AudioRoute? = null // SDK result может опередить callback фактического маршрута. private var ended = false init { @@ -144,7 +145,7 @@ class UtunConnection( /** Завершение с причиной (коды приложения: 0 — отбой, 2 — отклонено, 7 — ошибка). */ fun markDisconnected(reason: Int) { ended = true; availableEndpoints.clear() - wantedRoute = null; requestedEndpoint = null; requestedLegacyRoute = 0; ++requestSerial + wantedRoute = null; requestedEndpoint = null; requestedLegacyRoute = 0; lastRequestedRoute = null; ++requestSerial onRouteChanged = null; onEndpointsChanged = null val code = when (reason) { 2 -> DisconnectCause.REJECTED @@ -159,7 +160,8 @@ class UtunConnection( fun routeTo(route: AudioRoute) { if (ended) { LogManager.addLog("WARN", "UtunConn", "route after disconnect ignored id=$callId route=$route"); return } wantedRoute = route - if (confirmedRoute == route && requestedEndpoint == null && requestedLegacyRoute == 0) { wantedRoute = null; return } + if (confirmedRoute == route && requestedEndpoint == null && requestedLegacyRoute == 0 && + (lastRequestedRoute == null || lastRequestedRoute == route)) { wantedRoute = null; return } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { if (requestedEndpoint != null) return // До ответа сохраняем только последнее желание пользователя. val ep = when (route) { @@ -170,7 +172,7 @@ class UtunConnection( } if (ep != null) { if (requestedEndpoint == ep.identifier) return - requestedEndpoint = ep.identifier + requestedEndpoint = ep.identifier; lastRequestedRoute = route val serial = ++requestSerial try { val executor = ContextCompat.getMainExecutor(ChatApplication.instance) @@ -178,20 +180,16 @@ class UtunConnection( override fun onResult(result: Void?) { if (requestSerial != serial || ended) { LogManager.addLog("DEBUG", "UtunConn", "stale endpoint result id=$callId serial=$serial"); return } LogManager.addLog("INFO", "UtunConn", "endpoint request completed id=$callId type=${ep.endpointType} confirmed=$confirmedRoute") - if (requestSerial == serial) { - requestedEndpoint = null - wantedRoute?.takeIf { it != route }?.let { routeTo(it) } - } + requestedEndpoint = null + wantedRoute?.takeIf { it != route }?.let { routeTo(it) } } override fun onError(error: CallEndpointException) { if (requestSerial != serial || ended) { LogManager.addLog("DEBUG", "UtunConn", "stale endpoint error id=$callId serial=$serial"); return } LogManager.addLog("WARN", "UtunConn", "endpoint request failed id=$callId type=${ep.endpointType}: $error") - if (requestSerial == serial) { - requestedEndpoint = null - val next = wantedRoute?.takeIf { it != route } - wantedRoute = null - next?.let { routeTo(it) } - } + requestedEndpoint = null; lastRequestedRoute = null + val next = wantedRoute?.takeIf { it != route } + wantedRoute = null + next?.let { routeTo(it) } } }) return