summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-08-23 22:20:14 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-08-29 11:14:51 +0000
commitf849104654bae0935f3f112cde6680ac979c9765 (patch)
tree85bd4925b341ec43483f3eebad3991b45bcad30e /android
parente1cc82bfd3a767f407c99624671f8fbfdf2af435 (diff)
downloadmullvadvpn-f849104654bae0935f3f112cde6680ac979c9765.tar.xz
mullvadvpn-f849104654bae0935f3f112cde6680ac979c9765.zip
Defer `ConnectionProxy` availability
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt32
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt28
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/WireguardKeyFragment.kt22
4 files changed, 58 insertions, 29 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
index fcf3788971..7e74c53066 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
@@ -18,6 +18,7 @@ import net.mullvad.mullvadvpn.dataproxy.ConnectionProxy
import net.mullvad.mullvadvpn.dataproxy.KeyStatusListener
import net.mullvad.mullvadvpn.dataproxy.LocationInfoCache
import net.mullvad.mullvadvpn.dataproxy.RelayListListener
+import net.mullvad.mullvadvpn.util.SmartDeferred
import net.mullvad.mullvadvpn.model.KeygenEvent
import net.mullvad.mullvadvpn.model.TunnelState
@@ -32,7 +33,7 @@ class ConnectFragment : Fragment() {
private lateinit var locationInfo: LocationInfo
private lateinit var parentActivity: MainActivity
- private lateinit var connectionProxy: ConnectionProxy
+ private lateinit var connectionProxy: SmartDeferred<ConnectionProxy>
private lateinit var keyStatusListener: KeyStatusListener
private lateinit var locationInfoCache: LocationInfoCache
private lateinit var relayListListener: RelayListListener
@@ -40,6 +41,7 @@ class ConnectFragment : Fragment() {
private lateinit var updateKeyStatusJob: Job
private var updateTunnelStateJob: Job? = null
+ private var tunnelStateSubscriptionJob: Long? = null
private var isTunnelInfoExpanded = false
private var tunnelStateListener: Int? = null
@@ -82,9 +84,9 @@ class ConnectFragment : Fragment() {
actionButton = ConnectActionButton(view)
actionButton.apply {
- onConnect = { connectionProxy.connect() }
- onCancel = { connectionProxy.disconnect() }
- onDisconnect = { connectionProxy.disconnect() }
+ onConnect = { connectionProxy.awaitThen { connect() } }
+ onCancel = { connectionProxy.awaitThen { disconnect() } }
+ onDisconnect = { connectionProxy.awaitThen { disconnect() } }
}
switchLocationButton = SwitchLocationButton(view, resources)
@@ -115,9 +117,11 @@ class ConnectFragment : Fragment() {
switchLocationButton.location = selectedRelayItem
}
- tunnelStateListener = connectionProxy.onUiStateChange.subscribe { uiState ->
- updateTunnelStateJob?.cancel()
- updateTunnelStateJob = updateTunnelState(uiState)
+ tunnelStateSubscriptionJob = connectionProxy.awaitThen {
+ tunnelStateListener = onUiStateChange.subscribe { uiState ->
+ updateTunnelStateJob?.cancel()
+ updateTunnelStateJob = updateTunnelState(uiState, state)
+ }
}
}
@@ -126,8 +130,14 @@ class ConnectFragment : Fragment() {
locationInfoCache.onNewLocation = null
relayListListener.onRelayListChange = null
+ tunnelStateSubscriptionJob?.let { jobId ->
+ connectionProxy.cancelJob(jobId)
+ }
+
tunnelStateListener?.let { listener ->
- connectionProxy.onUiStateChange.unsubscribe(listener)
+ connectionProxy.awaitThen {
+ onUiStateChange.unsubscribe(listener)
+ }
}
updateTunnelStateJob?.cancel()
@@ -149,9 +159,9 @@ class ConnectFragment : Fragment() {
state.putBoolean(KEY_IS_TUNNEL_INFO_EXPANDED, isTunnelInfoExpanded)
}
- private fun updateTunnelState(uiState: TunnelState) = GlobalScope.launch(Dispatchers.Main) {
- val realState = connectionProxy.state
-
+ private fun updateTunnelState(uiState: TunnelState, realState: TunnelState) =
+ GlobalScope.launch(Dispatchers.Main)
+ {
locationInfoCache.state = realState
locationInfo.state = realState
headerBar.setState(realState)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
index 9aa1f066e6..958b4aedc0 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
@@ -29,6 +29,7 @@ import net.mullvad.mullvadvpn.model.RelaySettings
import net.mullvad.mullvadvpn.model.Settings
import net.mullvad.mullvadvpn.relaylist.RelayItem
import net.mullvad.mullvadvpn.relaylist.RelayList
+import net.mullvad.mullvadvpn.util.SmartDeferred
class MainActivity : FragmentActivity() {
companion object {
@@ -41,7 +42,7 @@ class MainActivity : FragmentActivity() {
private set
var appVersionInfoCache = AppVersionInfoCache(this)
- val connectionProxy = ConnectionProxy(this, daemon)
+ val connectionProxy = SmartDeferred(configureConnectionProxy())
val keyStatusListener = KeyStatusListener(daemon)
val problemReport = MullvadProblemReport()
var settingsListener = SettingsListener(this)
@@ -81,10 +82,9 @@ class MainActivity : FragmentActivity() {
}
appVersionInfoCache.onCreate()
- connectionProxy.mainActivity = this
- if (intent.getBooleanExtra(KEY_SHOULD_CONNECT, false)) {
- connectionProxy.connect()
+ if (intent.getBooleanExtra(KEY_SHOULD_CONNECT, false) ?: false) {
+ connectionProxy.awaitThen { connect() }
}
}
@@ -98,11 +98,7 @@ class MainActivity : FragmentActivity() {
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
- if (resultCode == Activity.RESULT_OK) {
- connectionProxy.vpnPermission.complete(true)
- } else {
- connectionProxy.vpnPermission.complete(false)
- }
+ setVpnPermission(resultCode == Activity.RESULT_OK)
}
override fun onStop() {
@@ -116,7 +112,7 @@ class MainActivity : FragmentActivity() {
}
override fun onDestroy() {
- connectionProxy.mainActivity = null
+ connectionProxy.cancel()
accountCache.onDestroy()
appVersionInfoCache.onDestroy()
@@ -160,6 +156,18 @@ class MainActivity : FragmentActivity() {
}
}
+ private fun configureConnectionProxy() = GlobalScope.async(Dispatchers.Default) {
+ ConnectionProxy(this@MainActivity, daemon).apply {
+ mainActivity = this@MainActivity
+ }
+ }
+
+ private fun setVpnPermission(allow: Boolean) = GlobalScope.launch(Dispatchers.Default) {
+ connectionProxy.awaitThen {
+ vpnPermission.complete(allow)
+ }
+ }
+
private fun fetchSettings() = GlobalScope.async(Dispatchers.Default) {
daemon.await().getSettings()
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
index 4a1849318c..f59387baa4 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
@@ -26,10 +26,11 @@ import net.mullvad.mullvadvpn.relaylist.RelayItem
import net.mullvad.mullvadvpn.relaylist.RelayItemDividerDecoration
import net.mullvad.mullvadvpn.relaylist.RelayList
import net.mullvad.mullvadvpn.relaylist.RelayListAdapter
+import net.mullvad.mullvadvpn.util.SmartDeferred
class SelectLocationFragment : Fragment() {
private lateinit var parentActivity: MainActivity
- private lateinit var connectionProxy: ConnectionProxy
+ private lateinit var connectionProxy: SmartDeferred<ConnectionProxy>
private lateinit var relayListListener: RelayListListener
private lateinit var relayListContainer: ViewSwitcher
@@ -129,7 +130,7 @@ class SelectLocationFragment : Fragment() {
val keyStatus = parentActivity.keyStatusListener.keyStatus
if (keyStatus == null || keyStatus is KeygenEvent.NewKey) {
- connectionProxy.connect()
+ connectionProxy.awaitThen { connect() }
}
}
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/WireguardKeyFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/WireguardKeyFragment.kt
index d746f8e8e4..47e79fb74c 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/WireguardKeyFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/WireguardKeyFragment.kt
@@ -23,15 +23,17 @@ import net.mullvad.mullvadvpn.dataproxy.ConnectionProxy
import net.mullvad.mullvadvpn.dataproxy.KeyStatusListener
import net.mullvad.mullvadvpn.model.KeygenEvent
import net.mullvad.mullvadvpn.model.TunnelState
+import net.mullvad.mullvadvpn.util.SmartDeferred
class WireguardKeyFragment : Fragment() {
private var keyState: KeygenEvent? = null
private var currentJob: Job? = null
private var updateViewsJob: Job? = null
private var tunnelStateListener: Int? = null
+ private var tunnelStateSubscriptionJob: Long? = null
private var tunnelState: TunnelState = TunnelState.Disconnected()
private lateinit var parentActivity: MainActivity
- private lateinit var connectionProxy: ConnectionProxy
+ private lateinit var connectionProxy: SmartDeferred<ConnectionProxy>
private lateinit var keyStatusListener: KeyStatusListener
private var generatingKey = false
private var validatingKey = false
@@ -207,8 +209,14 @@ class WireguardKeyFragment : Fragment() {
}
override fun onPause() {
+ tunnelStateSubscriptionJob?.let { jobId ->
+ connectionProxy.cancelJob(jobId)
+ }
+
tunnelStateListener?.let { listener ->
- connectionProxy.onUiStateChange.unsubscribe(listener)
+ connectionProxy.awaitThen {
+ onUiStateChange.unsubscribe(listener)
+ }
}
keyStatusListener.onKeyStatusChange = null
@@ -222,10 +230,12 @@ class WireguardKeyFragment : Fragment() {
override fun onResume() {
super.onResume()
- tunnelStateListener = connectionProxy.onUiStateChange.subscribe { uiState ->
- tunnelState = uiState
- updateViewsJob?.cancel()
- updateViewsJob = updateViewJob()
+ tunnelStateSubscriptionJob = connectionProxy.awaitThen {
+ tunnelStateListener = onUiStateChange.subscribe { uiState ->
+ tunnelState = uiState
+ updateViewsJob?.cancel()
+ updateViewsJob = updateViewJob()
+ }
}
keyStatusListener.onKeyStatusChange = { _ ->