diff options
| author | Albin <albin@mullvad.net> | 2022-06-14 13:54:23 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2022-06-14 13:54:23 +0200 |
| commit | 463042e83845efd09f61cd99feb65db58240bb32 (patch) | |
| tree | 584e62f71629e07214e83b97c1dcaf1abbbbca6c | |
| parent | f31b8681f13b1cb53a58d8fee06f1bd5637abba1 (diff) | |
| parent | 27a316782c3eab93358df1290e1630dc0f238714 (diff) | |
| download | mullvadvpn-463042e83845efd09f61cd99feb65db58240bb32.tar.xz mullvadvpn-463042e83845efd09f61cd99feb65db58240bb32.zip | |
Merge branch 'fix-missing-ipc-unregistration'
3 files changed, 22 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index e49f5da290..2310942811 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ Line wrap the file at 100 chars. Th #### Android - Fix unused dependencies loaded in the service/tile DI graph. +- Fix missing IPC message unregistration causing multiple copies of some messages to be received. ### Security #### Android 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 e430c2d81f..737e03d4e3 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 @@ -20,7 +20,7 @@ import org.koin.core.scope.get // the service and to get values received from events. @OptIn(KoinApiExtension::class) class ServiceConnectionContainer( - connection: Messenger, + val connection: Messenger, onServiceReady: (ServiceConnectionContainer) -> Unit, onVpnPermissionRequest: () -> Unit ) : KoinScopeComponent { @@ -39,6 +39,7 @@ class ServiceConnectionContainer( val deviceDataSource = ServiceConnectionDeviceDataSource(connection, dispatcher) val locationInfoCache = LocationInfoCache(dispatcher) val settingsListener = SettingsListener(connection, dispatcher) + // NOTE: `org.koin.core.scope.get` must be used here rather than `org.koin.core.component.get`. val splitTunneling = get<SplitTunneling>(parameters = { parametersOf(connection, dispatcher) }) val voucherRedeemer = VoucherRedeemer(connection, dispatcher) @@ -48,10 +49,13 @@ class ServiceConnectionContainer( val customDns = CustomDns(connection, settingsListener) var relayListListener = RelayListListener(connection, dispatcher, settingsListener) + private var listenerId: Int? = null + init { vpnPermission.onRequest = onVpnPermissionRequest - dispatcher.registerHandler(Event.ListenerReady::class) { _ -> + dispatcher.registerHandler(Event.ListenerReady::class) { event -> + listenerId = event.listenerId onServiceReady.invoke(this@ServiceConnectionContainer) } @@ -59,7 +63,9 @@ class ServiceConnectionContainer( } fun onDestroy() { + unregisterListener() closeScope() + dispatcher.onDestroy() authTokenCache.onDestroy() @@ -83,4 +89,14 @@ class ServiceConnectionContainer( Log.e("mullvad", "Failed to register listener for service events", exception) } } + + private fun unregisterListener() { + listenerId?.let { id -> + try { + connection.send(Request.UnregisterListener(id).message) + } catch (exception: RemoteException) { + Log.e("mullvad", "Failed to unregister listener for service events", exception) + } + } + } } 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 55270863e8..e1654476b8 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 @@ -42,6 +42,7 @@ class ServiceConnectionManager( override fun onServiceDisconnected(className: ComponentName) { Log.d("mullvad", "UI lost the connection to the service") + _connectionState.value.readyContainer()?.onDestroy() notify(ServiceConnectionState.Disconnected) } } @@ -54,12 +55,14 @@ class ServiceConnectionManager( } fun unbind() { + _connectionState.value.readyContainer()?.onDestroy() context.unbindService(serviceConnection) notify(ServiceConnectionState.Disconnected) vpnPermissionRequestHandler = null } fun onDestroy() { + _connectionState.value.readyContainer()?.onDestroy() serviceNotifier.unsubscribeAll() notify(ServiceConnectionState.Disconnected) vpnPermissionRequestHandler = null |
