diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-02-04 16:36:03 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-02-04 19:42:11 +0000 |
| commit | 89cb001d2482c65333aa0b9668c756687ed8fefb (patch) | |
| tree | 3bc2666c0466c9d32157c943a114ba4fb00c74d6 /android/src | |
| parent | 3d01515720ac94c26cbd903ec88bfb2c3084c2b0 (diff) | |
| download | mullvadvpn-89cb001d2482c65333aa0b9668c756687ed8fefb.tar.xz mullvadvpn-89cb001d2482c65333aa0b9668c756687ed8fefb.zip | |
Gracefully handle when reconnection is expected
Diffstat (limited to 'android/src')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt | 58 |
1 files changed, 50 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 9228bcf268..a44da07d27 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt @@ -18,6 +18,7 @@ import java.util.TimeZone import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.model.KeygenEvent @@ -39,6 +40,18 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre private var generatingKey = false private var validatingKey = false + private var resetReconnectionExpectedJob: Job? = null + private var reconnectionExpected = false + set(value) { + field = value + + resetReconnectionExpectedJob?.cancel() + + if (value == true) { + resetReconnectionExpected() + } + } + private lateinit var publicKey: TextView private lateinit var publicKeyAge: TextView private lateinit var statusMessage: TextView @@ -48,6 +61,17 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre private lateinit var verifyButton: Button private lateinit var verifySpinner: ProgressBar + private fun resetReconnectionExpected() { + resetReconnectionExpectedJob = GlobalScope.launch(Dispatchers.Main) { + delay(20_000) + + if (reconnectionExpected) { + reconnectionExpected = false + updateViews() + } + } + } + override fun onSafelyCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -227,11 +251,13 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre when (tunnelState) { is TunnelState.Connecting, is TunnelState.Disconnecting -> { - setStatusMessage(R.string.wireguard_key_connectivity, R.color.red) - generateButton.visibility = View.GONE - generateSpinner.visibility = View.VISIBLE - verifyButton.visibility = View.GONE - verifySpinner.visibility = View.VISIBLE + if (!reconnectionExpected) { + setStatusMessage(R.string.wireguard_key_connectivity, R.color.red) + generateButton.visibility = View.GONE + generateSpinner.visibility = View.VISIBLE + verifyButton.visibility = View.GONE + verifySpinner.visibility = View.VISIBLE + } } is TunnelState.Error -> { setStatusMessage(R.string.wireguard_key_blocked_state_message, R.color.red) @@ -247,9 +273,15 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre private fun onGenerateKeyPress() { currentJob?.cancel() - generatingKey = true - validatingKey = false + + synchronized(this) { + generatingKey = true + validatingKey = false + reconnectionExpected = !(tunnelState is TunnelState.Disconnected) + } + updateViews() + currentJob = GlobalScope.launch(Dispatchers.Main) { keyStatusListener.generateKey().join() generatingKey = false @@ -286,6 +318,7 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre keyStatusListener.onKeyStatusChange = null currentJob?.cancel() updateViewsJob?.cancel() + resetReconnectionExpectedJob?.cancel() validatingKey = false generatingKey = false urlController.onPause() @@ -293,7 +326,16 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre override fun onSafelyResume() { tunnelStateListener = connectionProxy.onUiStateChange.subscribe { uiState -> - tunnelState = uiState + synchronized(this@WireguardKeyFragment) { + tunnelState = uiState + + if (generatingKey) { + reconnectionExpected = !(tunnelState is TunnelState.Disconnected) + } else if (tunnelState is TunnelState.Connected) { + reconnectionExpected = false + } + } + updateViewsJob?.cancel() updateViewsJob = updateViewJob() } |
