diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-08-23 22:20:14 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-08-29 11:14:51 +0000 |
| commit | f849104654bae0935f3f112cde6680ac979c9765 (patch) | |
| tree | 85bd4925b341ec43483f3eebad3991b45bcad30e /android | |
| parent | e1cc82bfd3a767f407c99624671f8fbfdf2af435 (diff) | |
| download | mullvadvpn-f849104654bae0935f3f112cde6680ac979c9765.tar.xz mullvadvpn-f849104654bae0935f3f112cde6680ac979c9765.zip | |
Defer `ConnectionProxy` availability
Diffstat (limited to 'android')
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 = { _ -> |
