Preserve the latest route choice while endpoint confirmation is pending

This commit is contained in:
evgeny committed 2026-10-29 13:34:25 +01:00
1 parent 8d3cee4a56
commit 482e1658b0
1 file changed
+11 -13
@@ -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