summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-12-13 15:03:38 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-12-13 15:03:38 -0300
commit6868537a5b81a194e261d4c57a45a87974640e32 (patch)
treee46a5e86589bd58e8eb98dd8f66d8591242c6db4 /android/src
parentbd31ed8db6be066dc39011e8d5089bf024c12dc7 (diff)
parent17e1a8df77b8e971cfdfec82d1e38fdc2b140f8d (diff)
downloadmullvadvpn-6868537a5b81a194e261d4c57a45a87974640e32.tar.xz
mullvadvpn-6868537a5b81a194e261d4c57a45a87974640e32.zip
Merge branch 'create-service-connection'
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt8
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt15
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/SettingsListener.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt13
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt10
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt26
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt81
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SelectLocationFragment.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt51
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt22
10 files changed, 144 insertions, 93 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt
index 032dfe9eb9..ac01929b1b 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt
@@ -1,18 +1,18 @@
package net.mullvad.mullvadvpn.dataproxy
import android.content.Context
+import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.model.AppVersionInfo
-import net.mullvad.mullvadvpn.ui.MainActivity
+import net.mullvad.mullvadvpn.service.MullvadDaemon
-class AppVersionInfoCache(val parentActivity: MainActivity) {
+class AppVersionInfoCache(val context: Context, val daemon: Deferred<MullvadDaemon>) {
companion object {
val LEGACY_SHARED_PREFERENCES = "app_version_info_cache"
}
- private val daemon = parentActivity.daemon
private val setUpJob = setUp()
private var appVersionInfo: AppVersionInfo? = null
@@ -61,7 +61,7 @@ class AppVersionInfoCache(val parentActivity: MainActivity) {
private set
fun onCreate() {
- parentActivity.getSharedPreferences(LEGACY_SHARED_PREFERENCES, Context.MODE_PRIVATE)
+ context.getSharedPreferences(LEGACY_SHARED_PREFERENCES, Context.MODE_PRIVATE)
.edit()
.clear()
.commit()
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt
index df743a7e58..056331d223 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt
@@ -1,6 +1,6 @@
package net.mullvad.mullvadvpn.dataproxy
-import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
@@ -10,10 +10,11 @@ import net.mullvad.mullvadvpn.model.RelaySettings
import net.mullvad.mullvadvpn.relaylist.RelayItem
import net.mullvad.mullvadvpn.relaylist.RelayList
import net.mullvad.mullvadvpn.service.MullvadDaemon
-import net.mullvad.mullvadvpn.ui.MainActivity
-class RelayListListener(val parentActivity: MainActivity) {
- private val daemon = CompletableDeferred<MullvadDaemon>()
+class RelayListListener(
+ val daemon: Deferred<MullvadDaemon>,
+ val settingsListener: SettingsListener
+) {
private val setUpJob = setUp()
private var relayList: RelayList? = null
@@ -36,14 +37,14 @@ class RelayListListener(val parentActivity: MainActivity) {
}
init {
- parentActivity.settingsListener.onRelaySettingsChange = { newRelaySettings ->
+ settingsListener.onRelaySettingsChange = { newRelaySettings ->
relaySettingsChanged(newRelaySettings)
}
}
fun onDestroy() {
setUpJob.cancel()
- parentActivity.settingsListener.onRelaySettingsChange = null
+ settingsListener.onRelaySettingsChange = null
if (daemon.isActive) {
daemon.cancel()
@@ -53,8 +54,6 @@ class RelayListListener(val parentActivity: MainActivity) {
}
private fun setUp() = GlobalScope.launch(Dispatchers.Default) {
- daemon.complete(parentActivity.daemon.await())
-
setUpListener()
fetchInitialRelayList()
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/SettingsListener.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/SettingsListener.kt
index 9917acc606..a1c87442ba 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/SettingsListener.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/SettingsListener.kt
@@ -1,14 +1,14 @@
package net.mullvad.mullvadvpn.dataproxy
+import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.model.RelaySettings
import net.mullvad.mullvadvpn.model.Settings
import net.mullvad.mullvadvpn.service.MullvadDaemon
-import net.mullvad.mullvadvpn.ui.MainActivity
-class SettingsListener(val parentActivity: MainActivity) {
+class SettingsListener(val asyncDaemon: Deferred<MullvadDaemon>) {
private lateinit var daemon: MullvadDaemon
private val setUpJob = setUp()
@@ -41,7 +41,7 @@ class SettingsListener(val parentActivity: MainActivity) {
}
private fun setUp() = GlobalScope.launch(Dispatchers.Default) {
- daemon = parentActivity.daemon.await()
+ daemon = asyncDaemon.await()
listenerId = daemon.onSettingsChange.subscribe { maybeSettings ->
maybeSettings?.let { settings -> handleNewSettings(settings) }
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
index 7b3bfaea8e..7423b91586 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
@@ -11,6 +11,7 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import net.mullvad.mullvadvpn.dataproxy.ConnectionProxy
import net.mullvad.talpid.TalpidVpnService
+import net.mullvad.talpid.util.EventNotifier
class MullvadVpnService : TalpidVpnService() {
private val binder = LocalBinder()
@@ -21,6 +22,8 @@ class MullvadVpnService : TalpidVpnService() {
private lateinit var connectionProxy: ConnectionProxy
private lateinit var notificationManager: ForegroundNotificationManager
+ private var serviceNotifier = EventNotifier<ServiceInstance?>(null)
+
override fun onCreate() {
super.onCreate()
setUp()
@@ -51,6 +54,8 @@ class MullvadVpnService : TalpidVpnService() {
inner class LocalBinder : Binder() {
val daemon
get() = this@MullvadVpnService.daemon
+ val serviceNotifier
+ get() = this@MullvadVpnService.serviceNotifier
val connectionProxy
get() = this@MullvadVpnService.connectionProxy
val connectivityListener
@@ -72,11 +77,15 @@ class MullvadVpnService : TalpidVpnService() {
private fun startDaemon() = GlobalScope.async(Dispatchers.Default) {
ApiRootCaFile().extract(application)
- MullvadDaemon(this@MullvadVpnService).apply {
+ val daemon = MullvadDaemon(this@MullvadVpnService).apply {
onSettingsChange.subscribe { settings ->
notificationManager.loggedIn = settings?.accountToken != null
}
}
+
+ serviceNotifier.notify(ServiceInstance(daemon, connectionProxy, connectivityListener))
+
+ daemon
}
private fun startNotificationManager(): ForegroundNotificationManager {
@@ -89,6 +98,8 @@ class MullvadVpnService : TalpidVpnService() {
private fun stop() {
resetComplete = CompletableDeferred()
+ serviceNotifier.notify(null)
+
if (daemon.isCompleted) {
runBlocking { daemon.await().shutdown() }
} else {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt
new file mode 100644
index 0000000000..070ab1c9bf
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.service
+
+import net.mullvad.mullvadvpn.dataproxy.ConnectionProxy
+import net.mullvad.talpid.ConnectivityListener
+
+data class ServiceInstance(
+ val daemon: MullvadDaemon,
+ val connectionProxy: ConnectionProxy,
+ val connectivityListener: ConnectivityListener
+)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
index d7f1704e9a..336f3507aa 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
@@ -19,7 +19,6 @@ import net.mullvad.mullvadvpn.dataproxy.LocationInfoCache
import net.mullvad.mullvadvpn.dataproxy.RelayListListener
import net.mullvad.mullvadvpn.model.KeygenEvent
import net.mullvad.mullvadvpn.model.TunnelState
-import net.mullvad.mullvadvpn.util.SmartDeferred
val KEY_IS_TUNNEL_INFO_EXPANDED = "is_tunnel_info_expanded"
@@ -32,7 +31,7 @@ class ConnectFragment : Fragment() {
private lateinit var locationInfo: LocationInfo
private lateinit var parentActivity: MainActivity
- private lateinit var connectionProxy: SmartDeferred<ConnectionProxy>
+ private lateinit var connectionProxy: ConnectionProxy
private lateinit var keyStatusListener: KeyStatusListener
private lateinit var locationInfoCache: LocationInfoCache
private lateinit var relayListListener: RelayListListener
@@ -40,7 +39,6 @@ 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
@@ -87,9 +85,9 @@ class ConnectFragment : Fragment() {
actionButton = ConnectActionButton(view)
actionButton.apply {
- onConnect = { connectionProxy.awaitThen { connect() } }
- onCancel = { connectionProxy.awaitThen { disconnect() } }
- onDisconnect = { connectionProxy.awaitThen { disconnect() } }
+ onConnect = { connectionProxy.connect() }
+ onCancel = { connectionProxy.disconnect() }
+ onDisconnect = { connectionProxy.disconnect() }
}
switchLocationButton = SwitchLocationButton(view, resources)
@@ -120,11 +118,9 @@ class ConnectFragment : Fragment() {
switchLocationButton.location = selectedRelayItem
}
- tunnelStateSubscriptionJob = connectionProxy.awaitThen {
- tunnelStateListener = onUiStateChange.subscribe { uiState ->
- updateTunnelStateJob?.cancel()
- updateTunnelStateJob = updateTunnelState(uiState, state)
- }
+ tunnelStateListener = connectionProxy.onUiStateChange.subscribe { uiState ->
+ updateTunnelStateJob?.cancel()
+ updateTunnelStateJob = updateTunnelState(uiState, connectionProxy.state)
}
}
@@ -133,14 +129,8 @@ class ConnectFragment : Fragment() {
locationInfoCache.onNewLocation = null
relayListListener.onRelayListChange = null
- tunnelStateSubscriptionJob?.let { jobId ->
- connectionProxy.cancelJob(jobId)
- }
-
tunnelStateListener?.let { listener ->
- connectionProxy.awaitThen {
- onUiStateChange.unsubscribe(listener)
- }
+ connectionProxy.onUiStateChange.unsubscribe(listener)
}
updateTunnelStateJob?.cancel()
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
index 7660e240bb..914188a8ab 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
@@ -3,7 +3,6 @@ package net.mullvad.mullvadvpn.ui
import android.app.Activity
import android.content.ComponentName
import android.content.Intent
-import android.content.ServiceConnection
import android.os.Bundle
import android.os.IBinder
import android.support.v4.app.FragmentActivity
@@ -11,57 +10,70 @@ import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
-import kotlinx.coroutines.async
import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
import net.mullvad.mullvadvpn.R
import net.mullvad.mullvadvpn.dataproxy.AccountCache
import net.mullvad.mullvadvpn.dataproxy.AppVersionInfoCache
+import net.mullvad.mullvadvpn.dataproxy.ConnectionProxy
import net.mullvad.mullvadvpn.dataproxy.KeyStatusListener
import net.mullvad.mullvadvpn.dataproxy.LocationInfoCache
import net.mullvad.mullvadvpn.dataproxy.MullvadProblemReport
import net.mullvad.mullvadvpn.dataproxy.RelayListListener
-import net.mullvad.mullvadvpn.dataproxy.SettingsListener
import net.mullvad.mullvadvpn.dataproxy.WwwAuthTokenRetriever
import net.mullvad.mullvadvpn.service.MullvadDaemon
import net.mullvad.mullvadvpn.service.MullvadVpnService
-import net.mullvad.mullvadvpn.util.SmartDeferred
-import net.mullvad.talpid.ConnectivityListener
class MainActivity : FragmentActivity() {
companion object {
val KEY_SHOULD_CONNECT = "should_connect"
}
- var connectivityListener = CompletableDeferred<ConnectivityListener>()
- private set
+ var serviceConnection: ServiceConnection? = null
+ private var serviceConnectionSubscription: Int? = null
+
var daemon = CompletableDeferred<MullvadDaemon>()
private set
var service = CompletableDeferred<MullvadVpnService.LocalBinder>()
private set
- var appVersionInfoCache = AppVersionInfoCache(this)
- val connectionProxy = SmartDeferred(configureConnectionProxy())
- val keyStatusListener = KeyStatusListener(daemon)
val problemReport = MullvadProblemReport()
- var settingsListener = SettingsListener(this)
- var relayListListener = RelayListListener(this)
- val locationInfoCache = LocationInfoCache(daemon, connectivityListener, relayListListener)
- val accountCache = AccountCache(settingsListener, daemon)
- val wwwAuthTokenRetriever = WwwAuthTokenRetriever(daemon)
+
+ val appVersionInfoCache: AppVersionInfoCache
+ get() = serviceConnection!!.appVersionInfoCache
+ val connectionProxy: ConnectionProxy
+ get() = serviceConnection!!.connectionProxy
+ val keyStatusListener: KeyStatusListener
+ get() = serviceConnection!!.keyStatusListener
+ val relayListListener: RelayListListener
+ get() = serviceConnection!!.relayListListener
+ val locationInfoCache: LocationInfoCache
+ get() = serviceConnection!!.locationInfoCache
+ val accountCache: AccountCache
+ get() = serviceConnection!!.accountCache
+ val wwwAuthTokenRetriever: WwwAuthTokenRetriever
+ get() = serviceConnection!!.wwwAuthTokenRetriever
private var quitJob: Job? = null
private var serviceToStop: MullvadVpnService.LocalBinder? = null
private var waitForDaemonJob: Job? = null
- private val serviceConnection = object : ServiceConnection {
+ private val serviceConnectionManager = object : android.content.ServiceConnection {
override fun onServiceConnected(className: ComponentName, binder: IBinder) {
val localBinder = binder as MullvadVpnService.LocalBinder
+ serviceConnectionSubscription = localBinder.serviceNotifier.subscribe { service ->
+ serviceConnection?.onDestroy()
+
+ serviceConnection = service?.let { service ->
+ ServiceConnection(service, this@MainActivity)
+ }
+ }
+
waitForDaemonJob = GlobalScope.launch(Dispatchers.Default) {
localBinder.resetComplete?.await()
service.complete(localBinder)
daemon.complete(localBinder.daemon.await())
- connectivityListener.complete(localBinder.connectivityListener)
}
}
@@ -69,12 +81,18 @@ class MainActivity : FragmentActivity() {
waitForDaemonJob?.cancel()
waitForDaemonJob = null
+ serviceConnectionSubscription?.let { subscription ->
+ runBlocking {
+ service.await().serviceNotifier.unsubscribe(subscription)
+ }
+ serviceConnection = null
+ }
+
service.cancel()
daemon.cancel()
service = CompletableDeferred<MullvadVpnService.LocalBinder>()
daemon = CompletableDeferred<MullvadDaemon>()
- connectivityListener = CompletableDeferred<ConnectivityListener>()
}
}
@@ -86,10 +104,8 @@ class MainActivity : FragmentActivity() {
addInitialFragment()
}
- appVersionInfoCache.onCreate()
-
if (intent.getBooleanExtra(KEY_SHOULD_CONNECT, false)) {
- connectionProxy.awaitThen { connect() }
+ connectionProxy.connect()
}
}
@@ -99,7 +115,7 @@ class MainActivity : FragmentActivity() {
val intent = Intent(this, MullvadVpnService::class.java)
startService(intent)
- bindService(intent, serviceConnection, 0)
+ bindService(intent, serviceConnectionManager, 0)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
@@ -110,20 +126,13 @@ class MainActivity : FragmentActivity() {
quitJob?.cancel()
serviceToStop?.apply { stop() }
- unbindService(serviceConnection)
+ unbindService(serviceConnectionManager)
super.onStop()
}
override fun onDestroy() {
- connectionProxy.cancel()
-
- accountCache.onDestroy()
- appVersionInfoCache.onDestroy()
- keyStatusListener.onDestroy()
- locationInfoCache.onDestroy()
- relayListListener.onDestroy()
- settingsListener.onDestroy()
+ serviceConnection?.onDestroy()
waitForDaemonJob?.cancel()
daemon.cancel()
@@ -164,15 +173,7 @@ class MainActivity : FragmentActivity() {
}
}
- private fun configureConnectionProxy() = GlobalScope.async(Dispatchers.Default) {
- service.await().connectionProxy.apply {
- mainActivity = this@MainActivity
- }
- }
-
private fun setVpnPermission(allow: Boolean) = GlobalScope.launch(Dispatchers.Default) {
- connectionProxy.awaitThen {
- vpnPermission.complete(allow)
- }
+ connectionProxy.vpnPermission.complete(allow)
}
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SelectLocationFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SelectLocationFragment.kt
index 9a885dd13d..fdb50715e9 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SelectLocationFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SelectLocationFragment.kt
@@ -25,11 +25,10 @@ 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: SmartDeferred<ConnectionProxy>
+ private lateinit var connectionProxy: ConnectionProxy
private lateinit var relayListListener: RelayListListener
private lateinit var relayListContainer: ViewSwitcher
@@ -129,7 +128,7 @@ class SelectLocationFragment : Fragment() {
val keyStatus = parentActivity.keyStatusListener.keyStatus
if (keyStatus == null || keyStatus is KeygenEvent.NewKey) {
- connectionProxy.awaitThen { connect() }
+ connectionProxy.connect()
}
}
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt
new file mode 100644
index 0000000000..831d52274f
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt
@@ -0,0 +1,51 @@
+package net.mullvad.mullvadvpn.ui
+
+import kotlinx.coroutines.CompletableDeferred
+import net.mullvad.mullvadvpn.dataproxy.AccountCache
+import net.mullvad.mullvadvpn.dataproxy.AppVersionInfoCache
+import net.mullvad.mullvadvpn.dataproxy.KeyStatusListener
+import net.mullvad.mullvadvpn.dataproxy.LocationInfoCache
+import net.mullvad.mullvadvpn.dataproxy.RelayListListener
+import net.mullvad.mullvadvpn.dataproxy.SettingsListener
+import net.mullvad.mullvadvpn.dataproxy.WwwAuthTokenRetriever
+import net.mullvad.mullvadvpn.service.MullvadDaemon
+import net.mullvad.mullvadvpn.service.ServiceInstance
+import net.mullvad.talpid.ConnectivityListener
+
+class ServiceConnection(private val service: ServiceInstance, val mainActivity: MainActivity) {
+ private val asyncDaemon = CompletableDeferred<MullvadDaemon>()
+ private val asyncConnectivityListener = CompletableDeferred<ConnectivityListener>()
+
+ val daemon = service.daemon
+ val connectionProxy = service.connectionProxy
+ val connectivityListener = service.connectivityListener
+
+ val appVersionInfoCache = AppVersionInfoCache(mainActivity, asyncDaemon)
+ val keyStatusListener = KeyStatusListener(asyncDaemon)
+ val settingsListener = SettingsListener(asyncDaemon)
+ val accountCache = AccountCache(settingsListener, asyncDaemon)
+ var relayListListener = RelayListListener(asyncDaemon, settingsListener)
+ val locationInfoCache =
+ LocationInfoCache(asyncDaemon, asyncConnectivityListener, relayListListener)
+ val wwwAuthTokenRetriever = WwwAuthTokenRetriever(asyncDaemon)
+
+ init {
+ asyncDaemon.complete(daemon)
+ asyncConnectivityListener.complete(connectivityListener)
+ appVersionInfoCache.onCreate()
+
+ connectionProxy.mainActivity = mainActivity
+ }
+
+ fun onDestroy() {
+ asyncDaemon.cancel()
+ asyncConnectivityListener.cancel()
+
+ accountCache.onDestroy()
+ appVersionInfoCache.onDestroy()
+ keyStatusListener.onDestroy()
+ locationInfoCache.onDestroy()
+ relayListListener.onDestroy()
+ settingsListener.onDestroy()
+ }
+}
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 c27c9b0133..49537c7d75 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt
@@ -27,7 +27,6 @@ import net.mullvad.mullvadvpn.dataproxy.WwwAuthTokenRetriever
import net.mullvad.mullvadvpn.model.KeygenEvent
import net.mullvad.mullvadvpn.model.KeygenFailure
import net.mullvad.mullvadvpn.model.TunnelState
-import net.mullvad.mullvadvpn.util.SmartDeferred
import org.joda.time.DateTime
import org.joda.time.DateTimeZone
import org.joda.time.format.DateTimeFormat
@@ -39,9 +38,8 @@ class WireguardKeyFragment : Fragment() {
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 connectionProxy: SmartDeferred<ConnectionProxy>
+ private lateinit var connectionProxy: ConnectionProxy
private lateinit var keyStatusListener: KeyStatusListener
private lateinit var parentActivity: MainActivity
private lateinit var wwwTokenRetriever: WwwAuthTokenRetriever
@@ -299,14 +297,8 @@ class WireguardKeyFragment : Fragment() {
}
override fun onPause() {
- tunnelStateSubscriptionJob?.let { jobId ->
- connectionProxy.cancelJob(jobId)
- }
-
tunnelStateListener?.let { listener ->
- connectionProxy.awaitThen {
- onUiStateChange.unsubscribe(listener)
- }
+ connectionProxy.onUiStateChange.unsubscribe(listener)
}
keyStatusListener.onKeyStatusChange = null
@@ -321,12 +313,10 @@ class WireguardKeyFragment : Fragment() {
override fun onResume() {
super.onResume()
- tunnelStateSubscriptionJob = connectionProxy.awaitThen {
- tunnelStateListener = onUiStateChange.subscribe { uiState ->
- tunnelState = uiState
- updateViewsJob?.cancel()
- updateViewsJob = updateViewJob()
- }
+ tunnelStateListener = connectionProxy.onUiStateChange.subscribe { uiState ->
+ tunnelState = uiState
+ updateViewsJob?.cancel()
+ updateViewsJob = updateViewJob()
}
keyStatusListener.onKeyStatusChange = { _ ->