diff --git a/app/src/main/java/com/futo/platformplayer/states/StateSync.kt b/app/src/main/java/com/futo/platformplayer/states/StateSync.kt index ae72b57e..af4108fa 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateSync.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateSync.kt @@ -66,6 +66,7 @@ import java.time.OffsetDateTime import java.time.ZoneOffset import java.util.Base64 import java.util.Locale +import kotlin.math.min import kotlin.system.measureTimeMillis class StateSync { @@ -372,6 +373,9 @@ class StateSync { if (Settings.instance.synchronization.discoverThroughRelay) { _threadRelay = Thread { + var backoffs: Array = arrayOf(1000, 5000, 10000, 20000) + var backoffIndex = 0; + while (_started) { try { Log.i(TAG, "Starting relay session...") @@ -417,6 +421,8 @@ class StateSync { }, onClose = { socketClosed = true }, onHandshakeComplete = { relaySession -> + backoffIndex = 0 + Thread { try { while (_started && !socketClosed) { @@ -484,7 +490,7 @@ class StateSync { } finally { _relaySession?.stop() _relaySession = null - Thread.sleep(5000) + Thread.sleep(backoffs[min(backoffs.size - 1, backoffIndex++)]) } } }.apply { start() } diff --git a/app/src/main/java/com/futo/platformplayer/views/adapters/DeviceViewHolder.kt b/app/src/main/java/com/futo/platformplayer/views/adapters/DeviceViewHolder.kt index d5060fe5..133dd26b 100644 --- a/app/src/main/java/com/futo/platformplayer/views/adapters/DeviceViewHolder.kt +++ b/app/src/main/java/com/futo/platformplayer/views/adapters/DeviceViewHolder.kt @@ -18,6 +18,7 @@ import com.futo.platformplayer.casting.StateCasting import com.futo.platformplayer.constructs.Event1 import com.futo.platformplayer.constructs.Event2 import androidx.core.view.isVisible +import com.futo.platformplayer.UIDialogs class DeviceViewHolder : ViewHolder { private val _layoutDevice: FrameLayout; @@ -55,9 +56,17 @@ class DeviceViewHolder : ViewHolder { val connect = { device?.let { dev -> - StateCasting.instance.activeDevice?.stopCasting(); - StateCasting.instance.connectDevice(dev); - onConnect.emit(dev); + if (dev.isReady) { + StateCasting.instance.activeDevice?.stopCasting() + StateCasting.instance.connectDevice(dev) + onConnect.emit(dev) + } else { + try { + view.context?.let { UIDialogs.toast(it, "Device not ready, may be offline") } + } catch (e: Throwable) { + //Ignored + } + } } } @@ -84,7 +93,7 @@ class DeviceViewHolder : ViewHolder { } _textName.text = d.name; - _imageOnline.visibility = if (isOnlineDevice) View.VISIBLE else View.GONE + _imageOnline.visibility = if (isOnlineDevice && d.isReady) View.VISIBLE else View.GONE if (!d.isReady) { _imageLoader.visibility = View.GONE;