summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-02-04 16:36:03 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-02-04 19:42:11 +0000
commit89cb001d2482c65333aa0b9668c756687ed8fefb (patch)
tree3bc2666c0466c9d32157c943a114ba4fb00c74d6 /android/src
parent3d01515720ac94c26cbd903ec88bfb2c3084c2b0 (diff)
downloadmullvadvpn-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.kt58
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()
}