summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-01 14:49:41 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-01 14:49:41 -0300
commitcc5ca668dc2f8fc4c17a506fc69846351a5e4ebb (patch)
tree8d45b41f92cc7b07bca9bf133cf49aab00ab3f70
parent990624960bbd7a70e1195f2a5eab9f9d6f2a3944 (diff)
parent70828ed50fbeae67d286cb7d75732f46737a49fd (diff)
downloadmullvadvpn-cc5ca668dc2f8fc4c17a506fc69846351a5e4ebb.tar.xz
mullvadvpn-cc5ca668dc2f8fc4c17a506fc69846351a5e4ebb.zip
Merge branch 'fix-settings-crash'
-rw-r--r--CHANGELOG.md1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AccountCache.kt1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt72
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt11
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt (renamed from android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/SettingsListener.kt)7
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LaunchFragment.kt21
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt3
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt2
11 files changed, 62 insertions, 60 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 02206d06c9..2a0f54716d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -41,6 +41,7 @@ Line wrap the file at 100 chars. Th
### Fixed
#### Android
- Fix crash when leaving WireGuard Key screen while key is still verifying.
+- Fix crash that sometimes happens right after some other unrelated crash.
## [2020.4-beta3] - 2020-04-29
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AccountCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AccountCache.kt
index 35abe6d53a..6b4ad64a72 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AccountCache.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AccountCache.kt
@@ -6,6 +6,7 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.model.GetAccountDataResult
import net.mullvad.mullvadvpn.service.MullvadDaemon
+import net.mullvad.mullvadvpn.service.SettingsListener
import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat
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 40a87ac4b6..a658760206 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt
@@ -6,6 +6,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.model.AppVersionInfo
import net.mullvad.mullvadvpn.service.MullvadDaemon
+import net.mullvad.mullvadvpn.service.SettingsListener
class AppVersionInfoCache(
val context: Context,
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 2012947ed8..af60840cc9 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt
@@ -9,6 +9,7 @@ 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.service.SettingsListener
class RelayListListener(val daemon: MullvadDaemon, val settingsListener: SettingsListener) {
private val setUpJob = setUp()
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
index 75b3e35177..593139a8a9 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
@@ -69,7 +69,7 @@ class MullvadDaemon(val vpnService: MullvadVpnService) {
return getRelayLocations(daemonInterfaceAddress)
}
- fun getSettings(): Settings {
+ fun getSettings(): Settings? {
return getSettings(daemonInterfaceAddress)
}
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 aba89e9e8a..99c391dedb 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
@@ -9,6 +9,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
+import net.mullvad.mullvadvpn.model.Settings
import net.mullvad.mullvadvpn.service.tunnelstate.TunnelStateUpdater
import net.mullvad.mullvadvpn.ui.MainActivity
import net.mullvad.talpid.TalpidVpnService
@@ -28,11 +29,17 @@ class MullvadVpnService : TalpidVpnService() {
private var isStopping = false
- private var connectionProxy: ConnectionProxy? = null
- private var daemon: MullvadDaemon? = null
- private var locationInfoCache: LocationInfoCache? = null
private var startDaemonJob: Job? = null
+ private var instance: ServiceInstance? = null
+ set(value) {
+ if (field != value) {
+ field?.onDestroy()
+ field = value
+ serviceNotifier.notify(value)
+ }
+ }
+
private lateinit var notificationManager: ForegroundNotificationManager
private lateinit var tunnelStateUpdater: TunnelStateUpdater
@@ -40,7 +47,7 @@ class MullvadVpnService : TalpidVpnService() {
set(value) {
field = value
- connectionProxy?.let { activeConnectionProxy ->
+ instance?.connectionProxy?.let { activeConnectionProxy ->
when (value) {
PendingAction.Connect -> activeConnectionProxy.connect()
PendingAction.Disconnect -> activeConnectionProxy.disconnect()
@@ -144,15 +151,13 @@ class MullvadVpnService : TalpidVpnService() {
private fun startDaemon() = GlobalScope.launch(Dispatchers.Default) {
prepareFiles()
- val newDaemon = MullvadDaemon(this@MullvadVpnService).apply {
+ val daemon = MullvadDaemon(this@MullvadVpnService).apply {
onSettingsChange.subscribe { settings ->
loggedIn = settings?.accountToken != null
}
onDaemonStopped = {
- locationInfoCache?.onDestroy()
- connectionProxy?.onDestroy()
- serviceNotifier.notify(null)
+ instance = null
if (!isStopping) {
restart()
@@ -160,29 +165,13 @@ class MullvadVpnService : TalpidVpnService() {
}
}
- val newConnectionProxy = ConnectionProxy(this@MullvadVpnService, newDaemon).apply {
- when (pendingAction) {
- PendingAction.Connect -> connect()
- PendingAction.Disconnect -> disconnect()
- null -> {}
- }
+ val settings = daemon.getSettings()
- pendingAction = null
+ if (settings != null) {
+ setUpInstance(daemon, settings)
+ } else {
+ restart()
}
-
- val newLocationInfoCache =
- LocationInfoCache(newDaemon, newConnectionProxy, connectivityListener)
-
- daemon = newDaemon
- connectionProxy = newConnectionProxy
- locationInfoCache = newLocationInfoCache
-
- serviceNotifier.notify(ServiceInstance(
- newDaemon,
- newConnectionProxy,
- connectivityListener,
- newLocationInfoCache
- ))
}
private fun prepareFiles() {
@@ -202,6 +191,29 @@ class MullvadVpnService : TalpidVpnService() {
}
}
+ private fun setUpInstance(daemon: MullvadDaemon, settings: Settings) {
+ val connectionProxy = ConnectionProxy(this@MullvadVpnService, daemon).apply {
+ when (pendingAction) {
+ PendingAction.Connect -> connect()
+ PendingAction.Disconnect -> disconnect()
+ null -> {}
+ }
+
+ pendingAction = null
+ }
+
+ val locationInfoCache = LocationInfoCache(daemon, connectionProxy, connectivityListener)
+ val settingsListener = SettingsListener(daemon, settings)
+
+ instance = ServiceInstance(
+ daemon,
+ connectionProxy,
+ connectivityListener,
+ locationInfoCache,
+ settingsListener
+ )
+ }
+
private fun stop() {
isStopping = true
stopDaemon()
@@ -210,7 +222,7 @@ class MullvadVpnService : TalpidVpnService() {
private fun stopDaemon() {
startDaemonJob?.cancel()
- daemon?.shutdown()
+ instance?.daemon?.shutdown()
}
private fun tearDown() {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt
index 8e3e3fbf70..09f30ffa9f 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt
@@ -6,5 +6,12 @@ data class ServiceInstance(
val daemon: MullvadDaemon,
val connectionProxy: ConnectionProxy,
val connectivityListener: ConnectivityListener,
- val locationInfoCache: LocationInfoCache
-)
+ val locationInfoCache: LocationInfoCache,
+ val settingsListener: SettingsListener
+) {
+ fun onDestroy() {
+ connectionProxy.onDestroy()
+ locationInfoCache.onDestroy()
+ settingsListener.onDestroy()
+ }
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/SettingsListener.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt
index c988f966a0..2441e9f2cc 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/SettingsListener.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt
@@ -1,12 +1,11 @@
-package net.mullvad.mullvadvpn.dataproxy
+package net.mullvad.mullvadvpn.service
import net.mullvad.mullvadvpn.model.RelaySettings
import net.mullvad.mullvadvpn.model.Settings
-import net.mullvad.mullvadvpn.service.MullvadDaemon
import net.mullvad.talpid.util.EventNotifier
-class SettingsListener(val daemon: MullvadDaemon) {
- var settings: Settings = daemon.getSettings()
+class SettingsListener(val daemon: MullvadDaemon, val initialSettings: Settings) {
+ var settings: Settings = initialSettings
private set(value) {
settingsNotifier.notify(value)
field = value
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LaunchFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LaunchFragment.kt
index 2c40bfa4af..d4c73795c5 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LaunchFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LaunchFragment.kt
@@ -8,23 +8,16 @@ 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 net.mullvad.mullvadvpn.R
-import net.mullvad.mullvadvpn.service.MullvadDaemon
class LaunchFragment : ServiceAwareFragment() {
private val hasAccountToken = CompletableDeferred<Boolean>()
- private var accountTokenCheckJob: Job? = null
private lateinit var advanceToNextScreenJob: Job
override fun onNewServiceConnection(serviceConnection: ServiceConnection) {
- accountTokenCheckJob = checkForAccountToken(serviceConnection.daemon)
- }
-
- override fun onNoServiceConnection() {
- accountTokenCheckJob?.cancel()
+ hasAccountToken.complete(serviceConnection.settingsListener.settings.accountToken != null)
}
override fun onCreateView(
@@ -51,18 +44,6 @@ class LaunchFragment : ServiceAwareFragment() {
super.onPause()
}
- override fun onDestroy() {
- accountTokenCheckJob?.cancel()
- super.onDestroy()
- }
-
- private fun checkForAccountToken(daemon: MullvadDaemon) =
- GlobalScope.async(Dispatchers.Default) {
- val settings = daemon.getSettings()
-
- hasAccountToken.complete(settings.accountToken != null)
- }
-
private fun advanceToNextScreen() = GlobalScope.launch(Dispatchers.Main) {
if (hasAccountToken.await()) {
advanceToConnectScreen()
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt
index 116d581c0e..5e7272ebcf 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt
@@ -4,7 +4,6 @@ import net.mullvad.mullvadvpn.dataproxy.AccountCache
import net.mullvad.mullvadvpn.dataproxy.AppVersionInfoCache
import net.mullvad.mullvadvpn.dataproxy.KeyStatusListener
import net.mullvad.mullvadvpn.dataproxy.RelayListListener
-import net.mullvad.mullvadvpn.dataproxy.SettingsListener
import net.mullvad.mullvadvpn.service.ServiceInstance
class ServiceConnection(private val service: ServiceInstance, val mainActivity: MainActivity) {
@@ -12,9 +11,9 @@ class ServiceConnection(private val service: ServiceInstance, val mainActivity:
val connectionProxy = service.connectionProxy
val connectivityListener = service.connectivityListener
val locationInfoCache = service.locationInfoCache
+ val settingsListener = service.settingsListener
val keyStatusListener = KeyStatusListener(daemon)
- val settingsListener = SettingsListener(daemon)
val appVersionInfoCache = AppVersionInfoCache(mainActivity, daemon, settingsListener)
val accountCache = AccountCache(settingsListener, daemon)
var relayListListener = RelayListListener(daemon, settingsListener)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt
index 96b8500820..5408d7e825 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt
@@ -12,10 +12,10 @@ import net.mullvad.mullvadvpn.dataproxy.AccountCache
import net.mullvad.mullvadvpn.dataproxy.AppVersionInfoCache
import net.mullvad.mullvadvpn.dataproxy.KeyStatusListener
import net.mullvad.mullvadvpn.dataproxy.RelayListListener
-import net.mullvad.mullvadvpn.dataproxy.SettingsListener
import net.mullvad.mullvadvpn.service.ConnectionProxy
import net.mullvad.mullvadvpn.service.LocationInfoCache
import net.mullvad.mullvadvpn.service.MullvadDaemon
+import net.mullvad.mullvadvpn.service.SettingsListener
import net.mullvad.talpid.ConnectivityListener
abstract class ServiceDependentFragment(val onNoService: OnNoService) : ServiceAwareFragment() {