summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-09-13 09:18:27 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-09-13 09:18:27 -0300
commit2a0bb2b1f4666d52e30e135aadcd7d3180e1828f (patch)
tree61215b92b27c4044f3640620c26299fc955423bd /android
parentf664e5e245804754b15a086d810c81a2f376da0d (diff)
parentdad616316c994f2cb8cddade2c779a6067deeaaa (diff)
downloadmullvadvpn-2a0bb2b1f4666d52e30e135aadcd7d3180e1828f.tar.xz
mullvadvpn-2a0bb2b1f4666d52e30e135aadcd7d3180e1828f.zip
Merge branch 'refactor-quit-procedure'
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ForegroundNotificationManager.kt19
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt24
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt66
3 files changed, 72 insertions, 37 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ForegroundNotificationManager.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ForegroundNotificationManager.kt
index 22f685daa1..f607b0cf2f 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ForegroundNotificationManager.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ForegroundNotificationManager.kt
@@ -18,12 +18,16 @@ val CHANNEL_ID = "vpn_tunnel_status"
val FOREGROUND_NOTIFICATION_ID: Int = 1
class ForegroundNotificationManager(val service: Service, val connectionProxy: ConnectionProxy) {
- private var listenerId: Int? = null
+ private val notificationManager =
+ service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+
+ private val listenerId = connectionProxy.onUiStateChange.subscribe { uiState ->
+ tunnelState = uiState
+ }
+
private var reconnecting = false
private var showingReconnecting = false
- private lateinit var notificationManager: NotificationManager
-
private var tunnelState: TunnelState = TunnelState.Disconnected()
set(value) {
field = value
@@ -60,14 +64,7 @@ class ForegroundNotificationManager(val service: Service, val connectionProxy: C
}
}
- fun onCreate() {
- notificationManager =
- service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
-
- listenerId = connectionProxy.onUiStateChange.subscribe { uiState ->
- tunnelState = uiState
- }
-
+ init {
if (Build.VERSION.SDK_INT >= 26) {
initChannel()
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
index fff27be8b5..0b954c23b9 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
@@ -49,21 +49,25 @@ class MainActivity : FragmentActivity() {
val locationInfoCache = LocationInfoCache(daemon, relayListListener)
val accountCache = AccountCache(settingsListener, daemon)
- private var shouldStopService = false
+ private var quitJob: Job? = null
+ private var serviceToStop: MullvadVpnService.LocalBinder? = null
private var waitForDaemonJob: Job? = null
private val serviceConnection = object : ServiceConnection {
override fun onServiceConnected(className: ComponentName, binder: IBinder) {
val localBinder = binder as MullvadVpnService.LocalBinder
- service.complete(localBinder)
-
waitForDaemonJob = GlobalScope.launch(Dispatchers.Default) {
+ localBinder.resetComplete?.await()
+ service.complete(localBinder)
daemon.complete(localBinder.daemon.await())
}
}
override fun onServiceDisconnected(className: ComponentName) {
+ waitForDaemonJob?.cancel()
+ waitForDaemonJob = null
+
service.cancel()
daemon.cancel()
@@ -101,10 +105,9 @@ class MainActivity : FragmentActivity() {
}
override fun onStop() {
- if (shouldStopService) {
- runBlocking { service.await().stop() }
- }
+ quitJob?.cancel()
+ serviceToStop?.apply { stop() }
unbindService(serviceConnection)
super.onStop()
@@ -143,9 +146,12 @@ class MainActivity : FragmentActivity() {
startActivityForResult(intent, 0)
}
- fun quit() {
- shouldStopService = true
- finishAndRemoveTask()
+ fun quit() {
+ quitJob?.cancel()
+ quitJob = GlobalScope.launch(Dispatchers.Main) {
+ serviceToStop = service.await()
+ finishAndRemoveTask()
+ }
}
private fun addInitialFragment() {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt
index 6ecfdb3535..8167d9e395 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt
@@ -5,6 +5,7 @@ import java.net.InetAddress
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
@@ -18,18 +19,18 @@ import net.mullvad.mullvadvpn.dataproxy.ConnectionProxy
import net.mullvad.mullvadvpn.model.TunConfig
class MullvadVpnService : VpnService() {
- private val created = CompletableDeferred<Unit>()
private val binder = LocalBinder()
+ private val created = CompletableDeferred<Unit>()
- private lateinit var versionInfoFetcher: AppVersionInfoFetcher
+ private var resetComplete: CompletableDeferred<Unit>? = null
- val daemon = startDaemon()
- val connectionProxy = ConnectionProxy(this, daemon)
- val notificationManager = ForegroundNotificationManager(this, connectionProxy)
+ private lateinit var daemon: Deferred<MullvadDaemon>
+ private lateinit var connectionProxy: ConnectionProxy
+ private lateinit var notificationManager: ForegroundNotificationManager
+ private lateinit var versionInfoFetcher: AppVersionInfoFetcher
override fun onCreate() {
- versionInfoFetcher = AppVersionInfoFetcher(daemon, this)
- notificationManager.onCreate()
+ setUp()
created.complete(Unit)
}
@@ -37,10 +38,20 @@ class MullvadVpnService : VpnService() {
return super.onBind(intent) ?: binder
}
+ override fun onRebind(intent: Intent) {
+ resetComplete?.let { reset ->
+ tearDown()
+ setUp()
+ reset.complete(Unit)
+ }
+ }
+
+ override fun onUnbind(intent: Intent): Boolean {
+ return true
+ }
+
override fun onDestroy() {
- connectionProxy.onDestroy()
- notificationManager.onDestroy()
- versionInfoFetcher.stop()
+ tearDown()
daemon.cancel()
created.cancel()
}
@@ -76,21 +87,42 @@ class MullvadVpnService : VpnService() {
get() = this@MullvadVpnService.daemon
val connectionProxy
get() = this@MullvadVpnService.connectionProxy
+ val resetComplete
+ get() = this@MullvadVpnService.resetComplete
fun stop() {
- if (daemon.isCompleted) {
- runBlocking { daemon.await().shutdown() }
- } else {
- daemon.cancel()
- }
-
- stopSelf()
+ this@MullvadVpnService.stop()
}
}
+ private fun setUp() {
+ daemon = startDaemon()
+ connectionProxy = ConnectionProxy(this, daemon)
+ notificationManager = ForegroundNotificationManager(this, connectionProxy)
+ versionInfoFetcher = AppVersionInfoFetcher(daemon, this)
+ }
+
private fun startDaemon() = GlobalScope.async(Dispatchers.Default) {
created.await()
ApiRootCaFile().extract(application)
MullvadDaemon(this@MullvadVpnService)
}
+
+ private fun stop() {
+ this@MullvadVpnService.resetComplete = CompletableDeferred()
+
+ if (daemon.isCompleted) {
+ runBlocking { daemon.await().shutdown() }
+ } else {
+ daemon.cancel()
+ }
+
+ stopSelf()
+ }
+
+ private fun tearDown() {
+ connectionProxy.onDestroy()
+ notificationManager.onDestroy()
+ versionInfoFetcher.stop()
+ }
}