diff options
| author | Albin <albin@mullvad.net> | 2023-10-03 15:49:11 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2023-10-16 17:09:22 +0200 |
| commit | 05a0a17332fe09ccea78eefcb323773732160ae0 (patch) | |
| tree | 1a07755a52b925a4726ea5aabb729b9cbee17891 /android/app/src | |
| parent | dc70ef89771a89d1b978516e3415ddf5d50cc033 (diff) | |
| download | mullvadvpn-05a0a17332fe09ccea78eefcb323773732160ae0.tar.xz mullvadvpn-05a0a17332fe09ccea78eefcb323773732160ae0.zip | |
Expose flexible ipc message handling
Diffstat (limited to 'android/app/src')
3 files changed, 44 insertions, 1 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/MessageHandler.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/MessageHandler.kt new file mode 100644 index 0000000000..3bbcae9361 --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/MessageHandler.kt @@ -0,0 +1,16 @@ +package net.mullvad.mullvadvpn.ui.serviceconnection + +import kotlin.reflect.KClass +import kotlinx.coroutines.flow.Flow +import net.mullvad.mullvadvpn.lib.ipc.Event +import net.mullvad.mullvadvpn.lib.ipc.Request + +interface MessageHandler { + fun <R : Event> events(klass: KClass<R>): Flow<R> + + fun trySendRequest(request: Request): Boolean +} + +inline fun <reified R : Event> MessageHandler.events(): Flow<R> { + return this.events(R::class) +} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnectionContainer.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnectionContainer.kt index 6dbea7a517..93dcd75359 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnectionContainer.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnectionContainer.kt @@ -4,9 +4,11 @@ import android.os.Looper import android.os.Messenger import android.os.RemoteException import android.util.Log +import kotlinx.coroutines.flow.filterIsInstance import net.mullvad.mullvadvpn.lib.ipc.DispatchingHandler import net.mullvad.mullvadvpn.lib.ipc.Event import net.mullvad.mullvadvpn.lib.ipc.Request +import net.mullvad.mullvadvpn.lib.ipc.extensions.trySendRequest import org.koin.core.component.KoinComponent // Container of classes that communicate with the service through an active connection @@ -21,6 +23,8 @@ class ServiceConnectionContainer( private val dispatcher = DispatchingHandler(Looper.getMainLooper()) { message -> Event.fromMessage(message) } + val events = dispatcher.parsedMessages.filterIsInstance<Event>() + val accountDataSource = ServiceConnectionAccountDataSource(connection, dispatcher) val authTokenCache = AuthTokenCache(connection, dispatcher) val connectionProxy = ConnectionProxy(connection, dispatcher) @@ -49,6 +53,10 @@ class ServiceConnectionContainer( registerListener(connection) } + fun trySendRequest(request: Request, logErrors: Boolean): Boolean { + return connection.trySendRequest(request, logErrors = logErrors) + } + fun onDestroy() { unregisterListener() diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnectionManager.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnectionManager.kt index 0bbc4e71d4..d840b93491 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnectionManager.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnectionManager.kt @@ -6,15 +6,22 @@ import android.content.Intent import android.os.IBinder import android.os.Messenger import android.util.Log +import kotlin.reflect.KClass +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.flow.filterIsInstance import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointConfiguration import net.mullvad.mullvadvpn.lib.endpoint.BuildConfig import net.mullvad.mullvadvpn.lib.endpoint.putApiEndpointConfigurationExtra +import net.mullvad.mullvadvpn.lib.ipc.Event +import net.mullvad.mullvadvpn.lib.ipc.Request import net.mullvad.mullvadvpn.service.MullvadVpnService +import net.mullvad.mullvadvpn.util.flatMapReadyConnectionOrDefault import net.mullvad.talpid.util.EventNotifier -class ServiceConnectionManager(private val context: Context) { +class ServiceConnectionManager(private val context: Context) : MessageHandler { private val _connectionState = MutableStateFlow<ServiceConnectionState>(ServiceConnectionState.Disconnected) @@ -27,6 +34,9 @@ class ServiceConnectionManager(private val context: Context) { var isBound = false private var vpnPermissionRequestHandler: (() -> Unit)? = null + private val events = + connectionState.flatMapReadyConnectionOrDefault(emptyFlow()) { it.container.events } + private val serviceConnection = object : android.content.ServiceConnection { override fun onServiceConnected(className: ComponentName, binder: IBinder) { @@ -82,6 +92,15 @@ class ServiceConnectionManager(private val context: Context) { } } + override fun <E : Event> events(klass: KClass<E>): Flow<E> { + return events.filterIsInstance(klass) + } + + override fun trySendRequest(request: Request): Boolean { + return connectionState.value.readyContainer()?.trySendRequest(request, logErrors = false) + ?: false + } + fun onDestroy() { _connectionState.value.readyContainer()?.onDestroy() serviceNotifier.unsubscribeAll() |
