Preserve the latest route choice while endpoint confirmation is pending
This commit is contained in:
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
|
||||
|
||||
Reference in new issue
Block a user