diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/connectivity/ConnectivityManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/connectivity/ConnectivityManager.kt index b03a03fafd..91f6517ad7 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/connectivity/ConnectivityManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/connectivity/ConnectivityManager.kt @@ -47,7 +47,7 @@ class ConnectivityManager( val isMobileOrNull: StateFlow = status .map { - (status.value as? ConnectivityStatus.Active)?.isMobile + (it as? ConnectivityStatus.Active)?.isMobile }.stateIn( scope, SharingStarted.WhileSubscribed(2000), @@ -57,7 +57,7 @@ class ConnectivityManager( val isMobileOrFalse: StateFlow = status .map { - (status.value as? ConnectivityStatus.Active)?.isMobile ?: false + (it as? ConnectivityStatus.Active)?.isMobile ?: false }.stateIn( scope, SharingStarted.WhileSubscribed(2000), diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/tor/TorManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/tor/TorManager.kt index 7c17155565..3781515ff1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/tor/TorManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/tor/TorManager.kt @@ -81,7 +81,7 @@ class TorManager( val activePortOrNull: StateFlow = status .map { - (status.value as? TorServiceStatus.Active)?.port + (it as? TorServiceStatus.Active)?.port }.stateIn( scope, SharingStarted.WhileSubscribed(2000), diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/tor/TorService.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/tor/TorService.kt index d8c81f5648..ccdea4a0ff 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/tor/TorService.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/tor/TorService.kt @@ -31,12 +31,13 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.delay import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch import org.torproject.jni.TorService import org.torproject.jni.TorService.LocalBinder +private const val SOCKS_PORT_POLL_INTERVAL_MS = 100L + class TorService( val context: Context, ) { @@ -46,9 +47,7 @@ class TorService( trySend(TorServiceStatus.Connecting) val currentIntent = Intent(context, TorService::class.java) - - context.bindService( - currentIntent, + val serviceConnection: ServiceConnection = object : ServiceConnection { override fun onServiceConnected( name: ComponentName, @@ -59,7 +58,7 @@ class TorService( val torService = (service as LocalBinder).service while (torService.socksPort < 0) { - delay(100) + delay(SOCKS_PORT_POLL_INTERVAL_MS) } val active = TorServiceStatus.Active(torService.socksPort) @@ -74,16 +73,25 @@ class TorService( Log.d("TorService", "Tor Service Disconnected") trySend(TorServiceStatus.Off) } - }, + } + + context.bindService( + currentIntent, + serviceConnection, BIND_AUTO_CREATE, ) awaitClose { Log.d("TorService", "Stopping Tor Service") + try { + context.unbindService(serviceConnection) + } catch (e: Exception) { + Log.d("TorService", "Failed to unbind Tor Service: ${e.message}") + } launch { context.stopService(currentIntent) } trySend(TorServiceStatus.Off) } - }.distinctUntilChanged().flowOn(Dispatchers.IO) + }.flowOn(Dispatchers.IO) }