summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2022-06-14 13:54:23 +0200
committerAlbin <albin@mullvad.net>2022-06-14 13:54:23 +0200
commit463042e83845efd09f61cd99feb65db58240bb32 (patch)
tree584e62f71629e07214e83b97c1dcaf1abbbbca6c
parentf31b8681f13b1cb53a58d8fee06f1bd5637abba1 (diff)
parent27a316782c3eab93358df1290e1630dc0f238714 (diff)
downloadmullvadvpn-463042e83845efd09f61cd99feb65db58240bb32.tar.xz
mullvadvpn-463042e83845efd09f61cd99feb65db58240bb32.zip
Merge branch 'fix-missing-ipc-unregistration'
-rw-r--r--CHANGELOG.md1
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnectionContainer.kt20
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnectionManager.kt3
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