summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-08-28 13:17:14 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-08-29 11:14:51 +0000
commit95842347cd94ab05c6e5d6baff68ec0a98f7b1f2 (patch)
tree093c04ced3c9db96d150babf2154f23767aaabe9 /android
parent786e0af192afa5ef6ce8159e6201602075c7cf49 (diff)
downloadmullvadvpn-95842347cd94ab05c6e5d6baff68ec0a98f7b1f2.tar.xz
mullvadvpn-95842347cd94ab05c6e5d6baff68ec0a98f7b1f2.zip
Update notification with tunnel state messages
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ForegroundNotificationManager.kt68
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt2
-rw-r--r--android/src/main/res/values/strings.xml7
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>