summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-12-23 17:11:37 +0100
committerDavid Göransson <david.goransson@mullvad.net>2025-01-07 16:46:39 +0100
commit66be95a4daa42df2fafea20ac89357893881b745 (patch)
treee1cd6bfd54a7b6cd9dcde2a57f3ab481b9f9238b /android
parentafd28a3be0ab8744c4429d396e15c8966c954e5b (diff)
downloadmullvadvpn-66be95a4daa42df2fafea20ac89357893881b745.tar.xz
mullvadvpn-66be95a4daa42df2fafea20ac89357893881b745.zip
Add support for blocking and disconnecting text in notification
Diffstat (limited to 'android')
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationTunnelState.kt4
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/tunnelstate/TunnelStateNotificationAction.kt4
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/tunnelstate/TunnelStateNotificationProvider.kt64
3 files changed, 22 insertions, 50 deletions
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationTunnelState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationTunnelState.kt
index 3ca573a839..4c24c87068 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationTunnelState.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationTunnelState.kt
@@ -7,14 +7,14 @@ sealed interface NotificationTunnelState {
data object Connected : NotificationTunnelState
- data object Reconnecting : NotificationTunnelState
+ data object Blocking : NotificationTunnelState
data object Disconnecting : NotificationTunnelState
sealed interface Error : NotificationTunnelState {
data object DeviceOffline : Error
- data object Blocking : Error
+ data object Blocked : Error
data object VpnPermissionDenied : Error
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/tunnelstate/TunnelStateNotificationAction.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/tunnelstate/TunnelStateNotificationAction.kt
index f836cbcd1b..2cb11744c1 100644
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/tunnelstate/TunnelStateNotificationAction.kt
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/tunnelstate/TunnelStateNotificationAction.kt
@@ -48,8 +48,8 @@ private fun NotificationTunnelState.contentTitleResourceId(context: Context): St
}
}
NotificationTunnelState.Disconnecting -> context.getString(R.string.disconnecting)
- NotificationTunnelState.Reconnecting -> context.getString(R.string.reconnecting)
- NotificationTunnelState.Error.Blocking -> context.getString(R.string.blocking_internet)
+ NotificationTunnelState.Blocking -> context.getString(R.string.blocking)
+ NotificationTunnelState.Error.Blocked -> context.getString(R.string.blocking_internet)
is NotificationTunnelState.Error.Critical -> context.getString(R.string.critical_error)
NotificationTunnelState.Error.DeviceOffline ->
context.getString(R.string.blocking_internet_device_offline)
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/tunnelstate/TunnelStateNotificationProvider.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/tunnelstate/TunnelStateNotificationProvider.kt
index cb589096d9..0f30f9ee78 100644
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/tunnelstate/TunnelStateNotificationProvider.kt
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/notifications/tunnelstate/TunnelStateNotificationProvider.kt
@@ -1,14 +1,9 @@
package net.mullvad.mullvadvpn.service.notifications.tunnelstate
import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.filterIsInstance
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
import net.mullvad.mullvadvpn.lib.model.ActionAfterDisconnect
import net.mullvad.mullvadvpn.lib.model.DeviceState
@@ -36,22 +31,16 @@ class TunnelStateNotificationProvider(
internal val notificationId = NotificationId(2)
override val notifications: StateFlow<NotificationUpdate<Notification.Tunnel>> =
- combine(
- connectionProxy.tunnelState,
- connectionProxy.tunnelState.actionAfterDisconnect().distinctUntilChanged(),
- deviceRepository.deviceState,
- ) { tunnelState, actionAfterDisconnect, deviceState ->
+ combine(connectionProxy.tunnelState, deviceRepository.deviceState) {
+ tunnelState,
+ deviceState ->
if (
deviceState is DeviceState.LoggedOut && tunnelState is TunnelState.Disconnected
) {
return@combine NotificationUpdate.Cancel(notificationId)
}
val notificationTunnelState =
- tunnelState(
- tunnelState,
- actionAfterDisconnect,
- vpnPermissionRepository.invoke().leftOrNull(),
- )
+ tunnelState(tunnelState, vpnPermissionRepository.invoke().leftOrNull())
return@combine NotificationUpdate.Notify(
notificationId,
@@ -67,36 +56,19 @@ class TunnelStateNotificationProvider(
private fun tunnelState(
tunnelState: TunnelState,
- actionAfterDisconnect: ActionAfterDisconnect?,
prepareError: PrepareError?,
- ): NotificationTunnelState =
- tunnelState.toNotificationTunnelState(actionAfterDisconnect, prepareError)
+ ): NotificationTunnelState = tunnelState.toNotificationTunnelState(prepareError)
- private fun Flow<TunnelState>.actionAfterDisconnect(): Flow<ActionAfterDisconnect?> =
- filterIsInstance<TunnelState.Disconnecting>()
- .map<TunnelState.Disconnecting, ActionAfterDisconnect?> { it.actionAfterDisconnect }
- .onStart { emit(null) }
-
- private fun TunnelState.toNotificationTunnelState(
- actionAfterDisconnect: ActionAfterDisconnect?,
- prepareError: PrepareError?,
- ) =
+ private fun TunnelState.toNotificationTunnelState(prepareError: PrepareError?) =
when (this) {
is TunnelState.Disconnected -> NotificationTunnelState.Disconnected(prepareError)
- is TunnelState.Connecting -> {
- if (actionAfterDisconnect == ActionAfterDisconnect.Reconnect) {
- NotificationTunnelState.Reconnecting
- } else {
- NotificationTunnelState.Connecting
- }
- }
- is TunnelState.Disconnecting -> {
- if (actionAfterDisconnect == ActionAfterDisconnect.Reconnect) {
- NotificationTunnelState.Reconnecting
- } else {
- NotificationTunnelState.Disconnecting
+ is TunnelState.Connecting -> NotificationTunnelState.Connecting
+ is TunnelState.Disconnecting ->
+ when (actionAfterDisconnect) {
+ ActionAfterDisconnect.Reconnect -> NotificationTunnelState.Connecting
+ ActionAfterDisconnect.Block -> NotificationTunnelState.Blocking
+ ActionAfterDisconnect.Nothing -> NotificationTunnelState.Disconnecting
}
- }
is TunnelState.Connected -> NotificationTunnelState.Connected
is TunnelState.Error -> toNotificationTunnelState()
}
@@ -106,14 +78,14 @@ class TunnelStateNotificationProvider(
return when {
cause is ErrorStateCause.IsOffline && errorState.isBlocking ->
NotificationTunnelState.Error.DeviceOffline
- cause is ErrorStateCause.InvalidDnsServers -> NotificationTunnelState.Error.Blocking
+ cause is ErrorStateCause.InvalidDnsServers -> NotificationTunnelState.Error.Blocked
cause is ErrorStateCause.OtherLegacyAlwaysOnApp ->
NotificationTunnelState.Error.LegacyLockdown
cause is ErrorStateCause.NotPrepared ->
NotificationTunnelState.Error.VpnPermissionDenied
cause is ErrorStateCause.OtherAlwaysOnApp ->
NotificationTunnelState.Error.AlwaysOnVpn(cause.appName)
- errorState.isBlocking -> NotificationTunnelState.Error.Blocking
+ errorState.isBlocking -> NotificationTunnelState.Error.Blocked
else -> NotificationTunnelState.Error.Critical
}
}
@@ -129,12 +101,12 @@ class TunnelStateNotificationProvider(
}
}
NotificationTunnelState.Disconnecting -> NotificationAction.Tunnel.Connect
- NotificationTunnelState.Connected,
- NotificationTunnelState.Error.Blocking -> NotificationAction.Tunnel.Disconnect
+ NotificationTunnelState.Error.Blocked,
+ NotificationTunnelState.Blocking,
+ NotificationTunnelState.Error.DeviceOffline,
+ NotificationTunnelState.Connected -> NotificationAction.Tunnel.Disconnect
NotificationTunnelState.Connecting -> NotificationAction.Tunnel.Cancel
- NotificationTunnelState.Reconnecting -> NotificationAction.Tunnel.Cancel
is NotificationTunnelState.Error.Critical,
- NotificationTunnelState.Error.DeviceOffline,
NotificationTunnelState.Error.VpnPermissionDenied,
is NotificationTunnelState.Error.AlwaysOnVpn,
NotificationTunnelState.Error.LegacyLockdown -> NotificationAction.Tunnel.Dismiss