diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-08-28 13:17:14 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-08-29 11:14:51 +0000 |
| commit | 95842347cd94ab05c6e5d6baff68ec0a98f7b1f2 (patch) | |
| tree | 093c04ced3c9db96d150babf2154f23767aaabe9 /android | |
| parent | 786e0af192afa5ef6ce8159e6201602075c7cf49 (diff) | |
| download | mullvadvpn-95842347cd94ab05c6e5d6baff68ec0a98f7b1f2.tar.xz mullvadvpn-95842347cd94ab05c6e5d6baff68ec0a98f7b1f2.zip | |
Update notification with tunnel state messages
Diffstat (limited to 'android')
3 files changed, 75 insertions, 2 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ForegroundNotificationManager.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ForegroundNotificationManager.kt index 3047b7d4b7..7bfc7b55a4 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ForegroundNotificationManager.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ForegroundNotificationManager.kt @@ -1,22 +1,87 @@ package net.mullvad.mullvadvpn import android.app.Notification +import android.app.NotificationManager import android.app.PendingIntent import android.app.Service +import android.content.Context import android.content.Intent import android.support.v4.app.NotificationCompat +import net.mullvad.mullvadvpn.dataproxy.ConnectionProxy +import net.mullvad.mullvadvpn.model.ActionAfterDisconnect +import net.mullvad.mullvadvpn.model.TunnelState + val FOREGROUND_NOTIFICATION_ID: Int = 1 -class ForegroundNotificationManager(val service: Service) { +class ForegroundNotificationManager(val service: Service, val connectionProxy: ConnectionProxy) { + private var listenerId: Int? = null + private var reconnecting = false + private var showingReconnecting = false + + private lateinit var notificationManager: NotificationManager + + private var tunnelState: TunnelState = TunnelState.Disconnected() + set(value) { + field = value + + reconnecting = + (value is TunnelState.Disconnecting + && value.actionAfterDisconnect is ActionAfterDisconnect.Reconnect) + || (value is TunnelState.Connecting && reconnecting) + + updateNotification() + } + + private val notificationText: Int + get() { + val state = tunnelState + + return when (state) { + is TunnelState.Disconnected -> R.string.unsecured + is TunnelState.Connecting -> { + if (reconnecting) { + R.string.reconnecting + } else { + R.string.connecting + } + } + is TunnelState.Connected -> R.string.secured + is TunnelState.Disconnecting -> { + when (state.actionAfterDisconnect) { + is ActionAfterDisconnect.Reconnect -> R.string.reconnecting + else -> R.string.disconnecting + } + } + is TunnelState.Blocked -> R.string.blocking_all_connections + } + } + fun onCreate() { + notificationManager = + service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + + listenerId = connectionProxy.onUiStateChange.subscribe { uiState -> + tunnelState = uiState + } + service.startForeground(FOREGROUND_NOTIFICATION_ID, buildNotification()) } fun onDestroy() { + listenerId?.let { listener -> + connectionProxy.onUiStateChange.unsubscribe(listener) + } + service.stopForeground(FOREGROUND_NOTIFICATION_ID) } + private fun updateNotification() { + if (!reconnecting || !showingReconnecting) { + notificationManager.notify(FOREGROUND_NOTIFICATION_ID, buildNotification()) + } + } + private fun buildNotification(): Notification { val intent = Intent(service, MainActivity::class.java) .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) @@ -27,6 +92,7 @@ class ForegroundNotificationManager(val service: Service) { return NotificationCompat.Builder(service) .setSmallIcon(R.drawable.notification) + .setContentTitle(service.getString(notificationText)) .setContentIntent(pendingIntent) .build() } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt index 02466aec37..6ecfdb3535 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt @@ -25,7 +25,7 @@ class MullvadVpnService : VpnService() { val daemon = startDaemon() val connectionProxy = ConnectionProxy(this, daemon) - val notificationManager = ForegroundNotificationManager(this) + val notificationManager = ForegroundNotificationManager(this, connectionProxy) override fun onCreate() { versionInfoFetcher = AppVersionInfoFetcher(daemon, this) diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml index 50e4d43c79..986e0fc623 100644 --- a/android/src/main/res/values/strings.xml +++ b/android/src/main/res/values/strings.xml @@ -1,6 +1,13 @@ <resources> <string name="app_name">Mullvad VPN</string> + <string name="connecting">Connecting</string> + <string name="reconnecting">Reconnecting</string> + <string name="disconnecting">Disconnecting</string> + <string name="secured">Secured</string> + <string name="unsecured">Unsecured</string> + <string name="blocking_all_connections">Blocking all connections</string> + <string name="connecting_to_daemon">Connecting to Mullvad system service...</string> <string name="login_title">Login</string> |
