summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-20 11:00:39 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-20 11:00:39 -0300
commit2d790f88002f64bed60eee5eef41e584c7a4b075 (patch)
treeeb9bb36a22a7bc23b9ddfbad4477ab07ed645917
parentbd084dffaabc4c8fd99e5575680c23f66282f188 (diff)
parent5c73ab2c17fab713eb050c6654c69709d8620c12 (diff)
downloadmullvadvpn-2d790f88002f64bed60eee5eef41e584c7a4b075.tar.xz
mullvadvpn-2d790f88002f64bed60eee5eef41e584c7a4b075.zip
Merge branch 'fix-dropped-key-events'
-rw-r--r--CHANGELOG.md1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/KeyStatusListener.kt20
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt8
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt8
4 files changed, 18 insertions, 19 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5741f2b9f0..d7f8f82bcd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -28,6 +28,7 @@ Line wrap the file at 100 chars. Th
- Fix crash when that happened sometimes when the app tried to start the daemon service on recent
Android versions.
- Fix quitting the app sometimes failing.
+- Fix WireGuard key status events being lost by the UI, causing stale information to be shown.
## [2020.5-beta1] - 2020-05-18
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/KeyStatusListener.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/KeyStatusListener.kt
index bee9244fe2..d6271f0a23 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/KeyStatusListener.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/KeyStatusListener.kt
@@ -5,28 +5,17 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.model.KeygenEvent
import net.mullvad.mullvadvpn.service.MullvadDaemon
+import net.mullvad.talpid.util.EventNotifier
class KeyStatusListener(val daemon: MullvadDaemon) {
private val setUpJob = setUp()
+ val onKeyStatusChange = EventNotifier<KeygenEvent?>(null)
+
var keyStatus: KeygenEvent? = null
private set(value) {
- synchronized(this) {
- field = value
-
- if (value != null) {
- onKeyStatusChange?.invoke(value)
- }
- }
- }
-
- var onKeyStatusChange: ((KeygenEvent) -> Unit)? = null
- set(value) {
field = value
-
- synchronized(this) {
- keyStatus?.let { status -> value?.invoke(status) }
- }
+ value?.let { newKeyStatus -> onKeyStatusChange.notify(newKeyStatus) }
}
private fun setUp() = GlobalScope.launch(Dispatchers.Default) {
@@ -67,6 +56,7 @@ class KeyStatusListener(val daemon: MullvadDaemon) {
fun onDestroy() {
setUpJob.cancel()
daemon.onKeygenEvent = null
+ onKeyStatusChange.unsubscribeAll()
}
private fun retryKeyGeneration() = GlobalScope.launch(Dispatchers.Default) {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
index 22960d5e73..1d71909d69 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
@@ -33,6 +33,7 @@ class ConnectFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
private var updateTunnelStateJob: Job? = null
private var isTunnelInfoExpanded = false
+ private var keyStatusListenerId: Int? = null
private var tunnelStateListener: Int? = null
override fun onCreate(savedInstanceState: Bundle?) {
@@ -82,7 +83,7 @@ class ConnectFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
notificationBanner.onResume()
- keyStatusListener.onKeyStatusChange = { keyStatus ->
+ keyStatusListenerId = keyStatusListener.onKeyStatusChange.subscribe { keyStatus ->
updateKeyStatusJob.cancel()
updateKeyStatusJob = updateKeyStatus(keyStatus)
}
@@ -115,10 +116,13 @@ class ConnectFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
override fun onSafelyPause() {
accountCache.onAccountDataChange = null
- keyStatusListener.onKeyStatusChange = null
locationInfoCache.onNewLocation = null
relayListListener.onRelayListChange = null
+ keyStatusListenerId?.let { listener ->
+ keyStatusListener.onKeyStatusChange.unsubscribe(listener)
+ }
+
tunnelStateListener?.let { listener ->
connectionProxy.onUiStateChange.unsubscribe(listener)
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt
index e72a4c495c..68e381d948 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt
@@ -39,6 +39,7 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre
private var greenColor: Int = 0
private var redColor: Int = 0
+ private var keyStatusListenerId: Int? = null
private var tunnelStateListener: Int? = null
private var tunnelState: TunnelState = TunnelState.Disconnected()
@@ -161,7 +162,7 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre
}
}
- keyStatusListener.onKeyStatusChange = { newKeyStatus ->
+ keyStatusListenerId = keyStatusListener.onKeyStatusChange.subscribe { newKeyStatus ->
jobTracker.newUiJob("keyStatusUpdate") {
keyStatus = newKeyStatus
}
@@ -175,11 +176,14 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre
connectionProxy.onUiStateChange.unsubscribe(listener)
}
+ keyStatusListenerId?.let { listener ->
+ keyStatusListener.onKeyStatusChange.unsubscribe(listener)
+ }
+
if (!(actionState is ActionState.Idle)) {
actionState = ActionState.Idle(false)
}
- keyStatusListener.onKeyStatusChange = null
jobTracker.cancelAllJobs()
}