From 576647202c9d398d09c42eb80a00d754c2a0dd9b Mon Sep 17 00:00:00 2001 From: Janito Vaqueiro Ferreira Filho Date: Thu, 30 Apr 2020 13:22:58 +0000 Subject: [PATCH 1/4] Separate actual jobs from reaper jobs Make sure the actual job is cancelled instead of only the reaper job. --- .../kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt index 7be0668f6131..51109e6f2d51 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.launch class JobTracker { private val jobs = HashMap() + private val reaperJobs = HashMap() private val namedJobs = HashMap() private var jobIdCounter = 0L @@ -18,7 +19,9 @@ class JobTracker { jobIdCounter += 1 - jobs.put(jobId, GlobalScope.launch(Dispatchers.Default) { + jobs.put(jobId, job) + + reaperJobs.put(jobId, GlobalScope.launch(Dispatchers.Default) { job.join() synchronized(jobs) { @@ -69,6 +72,7 @@ class JobTracker { fun cancelJob(jobId: Long) { synchronized(jobs) { jobs.remove(jobId)?.cancel() + reaperJobs.remove(jobId)?.cancel() } } @@ -78,7 +82,12 @@ class JobTracker { job.cancel() } + for (job in reaperJobs.values) { + job.cancel() + } + jobs.clear() + reaperJobs.clear() } } } From 28cf35fc29147b5fc4134ecd47d5d4ad9e07aa50 Mon Sep 17 00:00:00 2001 From: Janito Vaqueiro Ferreira Filho Date: Thu, 30 Apr 2020 13:23:33 +0000 Subject: [PATCH 2/4] Clear named jobs map --- .../src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt index 51109e6f2d51..6e279452dad9 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt @@ -88,6 +88,7 @@ class JobTracker { jobs.clear() reaperJobs.clear() + namedJobs.clear() } } } From a5d591918a000847c95ec0592397de0ff40eb99f Mon Sep 17 00:00:00 2001 From: Janito Vaqueiro Ferreira Filho Date: Thu, 30 Apr 2020 13:27:14 +0000 Subject: [PATCH 3/4] Cache text color value --- .../mullvadvpn/ui/WireguardKeyFragment.kt | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) 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 94abcf2ee5cb..e72a4c495c04 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt @@ -36,6 +36,9 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre private lateinit var timeAgoFormatter: TimeAgoFormatter + private var greenColor: Int = 0 + private var redColor: Int = 0 + private var tunnelStateListener: Int? = null private var tunnelState: TunnelState = TunnelState.Disconnected() @@ -96,7 +99,11 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre override fun onAttach(context: Context) { super.onAttach(context) - timeAgoFormatter = TimeAgoFormatter(context.resources) + val resources = context.resources + + redColor = resources.getColor(R.color.red) + greenColor = resources.getColor(R.color.green) + timeAgoFormatter = TimeAgoFormatter(resources) } override fun onSafelyCreateView( @@ -230,9 +237,9 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre private fun updateOfflineStatus() { if (reconnectionExpected) { - setStatusMessage(R.string.wireguard_key_reconnecting, R.color.green) + setStatusMessage(R.string.wireguard_key_reconnecting, greenColor) } else { - setStatusMessage(R.string.wireguard_key_blocked_state_message, R.color.red) + setStatusMessage(R.string.wireguard_key_blocked_state_message, redColor) } } @@ -241,7 +248,7 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre val replacementFailure = keyStatus.replacementFailure if (replacementFailure != null) { - setStatusMessage(failureMessage(replacementFailure), R.color.red) + setStatusMessage(failureMessage(replacementFailure), redColor) } else { updateKeyIsValid(verificationWasDone, keyStatus.verified) } @@ -252,11 +259,11 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre private fun updateKeyIsValid(verificationWasDone: Boolean, verified: Boolean?) { when (verified) { - true -> setStatusMessage(R.string.wireguard_key_valid, R.color.green) - false -> setStatusMessage(R.string.wireguard_key_invalid, R.color.red) + true -> setStatusMessage(R.string.wireguard_key_valid, greenColor) + false -> setStatusMessage(R.string.wireguard_key_invalid, redColor) null -> { if (verificationWasDone) { - setStatusMessage(R.string.wireguard_key_verification_failure, R.color.red) + setStatusMessage(R.string.wireguard_key_verification_failure, redColor) } else { statusMessage.visibility = View.GONE } @@ -296,7 +303,7 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre private fun setStatusMessage(message: Int, color: Int) { statusMessage.setText(message) - statusMessage.setTextColor(resources.getColor(color)) + statusMessage.setTextColor(color) statusMessage.visibility = View.VISIBLE } From f02ebb517ca8434e1326668aa562b4bb32dff2a5 Mon Sep 17 00:00:00 2001 From: Janito Vaqueiro Ferreira Filho Date: Thu, 30 Apr 2020 13:32:14 +0000 Subject: [PATCH 4/4] Describe crash fix in changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f560207ccca4..1ddb39bd0b9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,10 @@ Line wrap the file at 100 chars. Th - Fixed bogus or absent update notifications on the desktop app due to incorrect deserialization of a struct sent from the daemon. +### Fixed +#### Android +- Fix crash when leaving WireGuard Key screen while key is still verifying. + ## [2020.4-beta3] - 2020-04-29 ### Added