diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-09-13 09:18:27 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-09-13 09:18:27 -0300 |
| commit | 2a0bb2b1f4666d52e30e135aadcd7d3180e1828f (patch) | |
| tree | 61215b92b27c4044f3640620c26299fc955423bd /android | |
| parent | f664e5e245804754b15a086d810c81a2f376da0d (diff) | |
| parent | dad616316c994f2cb8cddade2c779a6067deeaaa (diff) | |
| download | mullvadvpn-2a0bb2b1f4666d52e30e135aadcd7d3180e1828f.tar.xz mullvadvpn-2a0bb2b1f4666d52e30e135aadcd7d3180e1828f.zip | |
Merge branch 'refactor-quit-procedure'
Diffstat (limited to 'android')
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() + } } |
