summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorKalle Lindström <karl.lindstrom@mullvad.net>2025-10-28 16:04:24 +0100
committerKalle Lindström <karl.lindstrom@mullvad.net>2025-10-28 16:04:24 +0100
commitfb074cdf7fbf9e5e2d900811f51089cdd27ff439 (patch)
tree587f7269e4e1876e41dba862458ae09e416a0db4 /android/lib
parent721496daaab896dd29980fd4b7a234fc7dfd5607 (diff)
parent46c51c9bb52b1ece67d08697c63d9a75ed852317 (diff)
downloadmullvadvpn-fb074cdf7fbf9e5e2d900811f51089cdd27ff439.tar.xz
mullvadvpn-fb074cdf7fbf9e5e2d900811f51089cdd27ff439.zip
Merge branch 'implement-server-in-connected-notification-droid-1235'
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationTunnelState.kt4
-rw-r--r--android/lib/repository/build.gradle.kts (renamed from android/lib/shared/build.gradle.kts)18
-rw-r--r--android/lib/repository/src/main/AndroidManifest.xml (renamed from android/lib/shared/src/main/AndroidManifest.xml)0
-rw-r--r--android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/AccountRepository.kt (renamed from android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/AccountRepository.kt)2
-rw-r--r--android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/ConnectionProxy.kt (renamed from android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/ConnectionProxy.kt)2
-rw-r--r--android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/DeviceRepository.kt (renamed from android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/DeviceRepository.kt)2
-rw-r--r--android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/LocaleRepository.kt (renamed from android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/LocaleRepository.kt)2
-rw-r--r--android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/PrepareVpnUseCase.kt (renamed from android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/PrepareVpnUseCase.kt)2
-rw-r--r--android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/RelayLocationTranslationRepository.kt (renamed from android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/RelayLocationTranslationRepository.kt)2
-rw-r--r--android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/UserPreferencesRepository.kt63
-rw-r--r--android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/VoucherRepository.kt (renamed from android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/VoucherRepository.kt)2
-rw-r--r--android/lib/repository/src/main/proto/user_prefs.proto12
-rw-r--r--android/lib/repository/src/test/kotlin/net/mullvad/mullvadvpn/lib/repository/AccountRepositoryTest.kt (renamed from android/lib/shared/src/test/kotlin/net/mullvad/mullvadvpn/lib/shared/AccountRepositoryTest.kt)2
-rw-r--r--android/lib/repository/src/test/kotlin/net/mullvad/mullvadvpn/lib/repository/ConnectionProxyTest.kt (renamed from android/lib/shared/src/test/kotlin/net/mullvad/mullvadvpn/lib/shared/ConnectionProxyTest.kt)2
-rw-r--r--android/lib/resource/src/main/res/values-da/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-de/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-es/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-fi/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-fr/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-it/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-ja/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-ko/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-my/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-nb/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-nl/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-pl/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-pt/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-ru/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-sv/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-th/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-tr/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-zh-rCN/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-zh-rTW/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values/strings.xml2
-rw-r--r--android/lib/tv/build.gradle.kts2
35 files changed, 125 insertions, 13 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 4c24c87068..252c3f2452 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
@@ -3,9 +3,9 @@ package net.mullvad.mullvadvpn.lib.model
sealed interface NotificationTunnelState {
data class Disconnected(val prepareError: PrepareError?) : NotificationTunnelState
- data object Connecting : NotificationTunnelState
+ data class Connecting(val location: GeoIpLocation?) : NotificationTunnelState
- data object Connected : NotificationTunnelState
+ data class Connected(val location: GeoIpLocation?) : NotificationTunnelState
data object Blocking : NotificationTunnelState
diff --git a/android/lib/shared/build.gradle.kts b/android/lib/repository/build.gradle.kts
index 04ed8c8901..023c7ee22f 100644
--- a/android/lib/shared/build.gradle.kts
+++ b/android/lib/repository/build.gradle.kts
@@ -5,10 +5,11 @@ plugins {
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.parcelize)
alias(libs.plugins.junit5.android)
+ alias(libs.plugins.protobuf.core)
}
android {
- namespace = "net.mullvad.mullvadvpn.lib.shared"
+ namespace = "net.mullvad.mullvadvpn.lib.repository"
compileSdk = libs.versions.compile.sdk.get().toInt()
buildToolsVersion = libs.versions.build.tools.get()
@@ -34,6 +35,19 @@ android {
buildFeatures { buildConfig = true }
}
+protobuf {
+ protoc { artifact = libs.plugins.protobuf.protoc.get().toString() }
+ plugins {
+ create("java") { artifact = libs.plugins.grpc.protoc.gen.grpc.java.get().toString() }
+ }
+ generateProtoTasks {
+ all().forEach {
+ it.plugins { create("java") { option("lite") } }
+ it.builtins { create("kotlin") { option("lite") } }
+ }
+ }
+}
+
dependencies {
implementation(projects.lib.resource)
implementation(projects.lib.common)
@@ -44,6 +58,8 @@ dependencies {
implementation(libs.kermit)
implementation(libs.kotlin.stdlib)
implementation(libs.kotlinx.coroutines.android)
+ implementation(libs.androidx.datastore)
+ implementation(libs.protobuf.kotlin.lite)
testImplementation(libs.kotlin.test)
testImplementation(libs.kotlinx.coroutines.test)
diff --git a/android/lib/shared/src/main/AndroidManifest.xml b/android/lib/repository/src/main/AndroidManifest.xml
index cc947c5679..cc947c5679 100644
--- a/android/lib/shared/src/main/AndroidManifest.xml
+++ b/android/lib/repository/src/main/AndroidManifest.xml
diff --git a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/AccountRepository.kt b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/AccountRepository.kt
index bfb1918875..d144098093 100644
--- a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/AccountRepository.kt
+++ b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/AccountRepository.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.lib.shared
+package net.mullvad.mullvadvpn.lib.repository
import arrow.core.Either
import java.time.ZonedDateTime
diff --git a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/ConnectionProxy.kt b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/ConnectionProxy.kt
index baf404d89c..2a023d3177 100644
--- a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/ConnectionProxy.kt
+++ b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/ConnectionProxy.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.lib.shared
+package net.mullvad.mullvadvpn.lib.repository
import arrow.core.Either
import arrow.core.raise.either
diff --git a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/DeviceRepository.kt b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/DeviceRepository.kt
index 258f918788..876f76c252 100644
--- a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/DeviceRepository.kt
+++ b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/DeviceRepository.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.lib.shared
+package net.mullvad.mullvadvpn.lib.repository
import arrow.core.Either
import co.touchlab.kermit.Logger
diff --git a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/LocaleRepository.kt b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/LocaleRepository.kt
index 4e5628d214..ced41294bb 100644
--- a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/LocaleRepository.kt
+++ b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/LocaleRepository.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.lib.shared
+package net.mullvad.mullvadvpn.lib.repository
import android.content.res.Resources
import co.touchlab.kermit.Logger
diff --git a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/PrepareVpnUseCase.kt b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/PrepareVpnUseCase.kt
index 7f7ec88120..11d360f83c 100644
--- a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/PrepareVpnUseCase.kt
+++ b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/PrepareVpnUseCase.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.lib.shared
+package net.mullvad.mullvadvpn.lib.repository
import android.content.Context
import arrow.core.Either
diff --git a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/RelayLocationTranslationRepository.kt b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/RelayLocationTranslationRepository.kt
index b2685abaf2..5ba024e617 100644
--- a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/RelayLocationTranslationRepository.kt
+++ b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/RelayLocationTranslationRepository.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.lib.shared
+package net.mullvad.mullvadvpn.lib.repository
import android.content.Context
import android.content.res.XmlResourceParser
diff --git a/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/UserPreferencesRepository.kt b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/UserPreferencesRepository.kt
new file mode 100644
index 0000000000..1ad635cf24
--- /dev/null
+++ b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/UserPreferencesRepository.kt
@@ -0,0 +1,63 @@
+package net.mullvad.mullvadvpn.lib.repository
+
+import androidx.datastore.core.DataStore
+import java.time.Instant
+import java.time.ZoneId
+import java.time.ZonedDateTime
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.first
+import net.mullvad.mullvadvpn.lib.model.BuildVersion
+import net.mullvad.mullvadvpn.repository.UserPreferences
+
+class UserPreferencesRepository(
+ private val userPreferencesStore: DataStore<UserPreferences>,
+ private val buildVersion: BuildVersion,
+) {
+ fun preferencesFlow(): Flow<UserPreferences> = userPreferencesStore.data
+
+ suspend fun preferences(): UserPreferences = userPreferencesStore.data.first()
+
+ suspend fun setPrivacyDisclosureAccepted() {
+ userPreferencesStore.updateData { prefs ->
+ prefs.toBuilder().setIsPrivacyDisclosureAccepted(true).build()
+ }
+ }
+
+ suspend fun setHasDisplayedChangelogNotification() {
+ userPreferencesStore.updateData { prefs ->
+ prefs.toBuilder().setLastShownChangelogVersionCode(buildVersion.code).build()
+ }
+ }
+
+ suspend fun setAccountExpiry(expiry: ZonedDateTime) {
+ userPreferencesStore.updateData { prefs ->
+ prefs.toBuilder().setAccountExpiryUnixTimeSeconds(expiry.toEpochSecond()).build()
+ }
+ }
+
+ suspend fun setLocationInNotificationEnabled(enable: Boolean) {
+ userPreferencesStore.updateData { prefs ->
+ prefs.toBuilder().setShowLocationInSystemNotification(enable).build()
+ }
+ }
+
+ suspend fun clearAccountExpiry() {
+ userPreferencesStore.updateData { prefs ->
+ prefs.toBuilder().setAccountExpiryUnixTimeSeconds(0).build()
+ }
+ }
+
+ // Returns the account expiry time or null if there is no account expiry (e.g. the user
+ // is not logged in on an account).
+ suspend fun accountExpiry(): ZonedDateTime? =
+ preferences().let { prefs ->
+ val expiryTime = prefs.accountExpiryUnixTimeSeconds
+ if (expiryTime == 0L) return null
+ Instant.ofEpochSecond(expiryTime).atZone(ZoneId.systemDefault())
+ }
+
+ suspend fun setShowAndroid16ConnectWarning(show: Boolean) =
+ userPreferencesStore.updateData { prefs ->
+ prefs.toBuilder().setShowAndroid16ConnectWarning(show).build()
+ }
+}
diff --git a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/VoucherRepository.kt b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/VoucherRepository.kt
index 9b08181ee3..b221966c28 100644
--- a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/VoucherRepository.kt
+++ b/android/lib/repository/src/main/kotlin/net/mullvad/mullvadvpn/lib/repository/VoucherRepository.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.lib.shared
+package net.mullvad.mullvadvpn.lib.repository
import net.mullvad.mullvadvpn.lib.daemon.grpc.ManagementService
import net.mullvad.mullvadvpn.lib.model.VoucherCode
diff --git a/android/lib/repository/src/main/proto/user_prefs.proto b/android/lib/repository/src/main/proto/user_prefs.proto
new file mode 100644
index 0000000000..36db3f2ad3
--- /dev/null
+++ b/android/lib/repository/src/main/proto/user_prefs.proto
@@ -0,0 +1,12 @@
+syntax = "proto3";
+
+option java_package = "net.mullvad.mullvadvpn.repository";
+option java_multiple_files = true;
+
+message UserPreferences {
+ bool is_privacy_disclosure_accepted = 1;
+ int32 last_shown_changelog_version_code = 2;
+ int64 account_expiry_unix_time_seconds = 3;
+ bool show_android_16_connect_warning = 4;
+ bool show_location_in_system_notification = 5;
+}
diff --git a/android/lib/shared/src/test/kotlin/net/mullvad/mullvadvpn/lib/shared/AccountRepositoryTest.kt b/android/lib/repository/src/test/kotlin/net/mullvad/mullvadvpn/lib/repository/AccountRepositoryTest.kt
index ff2ecb88b2..be4a0ab7ab 100644
--- a/android/lib/shared/src/test/kotlin/net/mullvad/mullvadvpn/lib/shared/AccountRepositoryTest.kt
+++ b/android/lib/repository/src/test/kotlin/net/mullvad/mullvadvpn/lib/repository/AccountRepositoryTest.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.lib.shared
+package net.mullvad.mullvadvpn.lib.repository
import arrow.core.right
import io.mockk.coEvery
diff --git a/android/lib/shared/src/test/kotlin/net/mullvad/mullvadvpn/lib/shared/ConnectionProxyTest.kt b/android/lib/repository/src/test/kotlin/net/mullvad/mullvadvpn/lib/repository/ConnectionProxyTest.kt
index b9d276c34b..949d5c7890 100644
--- a/android/lib/shared/src/test/kotlin/net/mullvad/mullvadvpn/lib/shared/ConnectionProxyTest.kt
+++ b/android/lib/repository/src/test/kotlin/net/mullvad/mullvadvpn/lib/repository/ConnectionProxyTest.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.lib.shared
+package net.mullvad.mullvadvpn.lib.repository
import android.content.Intent
import arrow.core.left
diff --git a/android/lib/resource/src/main/res/values-da/strings.xml b/android/lib/resource/src/main/res/values-da/strings.xml
index 2d30a818c8..4a9a442c92 100644
--- a/android/lib/resource/src/main/res/values-da/strings.xml
+++ b/android/lib/resource/src/main/res/values-da/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">API-adgang</string>
<string name="settings_changes_effect_warning_content_blocker">Ændringer af DNS-relaterede indstillinger træder muligvis ikke i kraft med det samme på grund af cachelagrede resultater.</string>
<string name="settings_changes_effect_warning_short">DNS-indstillinger træder muligvis ikke i kraft med det samme</string>
+ <string name="settings_notifications">Meddelelser</string>
<string name="settings_patch_error_failed_to_apply_patch">Det lykkedes ikke at anvende patch</string>
<string name="settings_patch_error_invalid_or_missing_value">Ugyldig eller manglende værdi \"%1$s\"</string>
<string name="settings_patch_error_recursion_limit">Rekursionsgrænse</string>
diff --git a/android/lib/resource/src/main/res/values-de/strings.xml b/android/lib/resource/src/main/res/values-de/strings.xml
index 2b8c018ab7..b9a4a52cdc 100644
--- a/android/lib/resource/src/main/res/values-de/strings.xml
+++ b/android/lib/resource/src/main/res/values-de/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">API-Zugriff</string>
<string name="settings_changes_effect_warning_content_blocker">Änderungen an DNS-Einstellungen werden aufgrund von zwischengespeicherten Daten möglicherweise nicht sofort wirksam.</string>
<string name="settings_changes_effect_warning_short">Die DNS-Einstellungen werden möglicherweise nicht sofort wirksam</string>
+ <string name="settings_notifications">Benachrichtigungen</string>
<string name="settings_patch_error_failed_to_apply_patch">Patch konnte nicht angewendet werden</string>
<string name="settings_patch_error_invalid_or_missing_value">Ungültiger oder fehlender Wert „%1$s“</string>
<string name="settings_patch_error_recursion_limit">Rekursionslimit</string>
diff --git a/android/lib/resource/src/main/res/values-es/strings.xml b/android/lib/resource/src/main/res/values-es/strings.xml
index e6abf7ee1f..205b826a73 100644
--- a/android/lib/resource/src/main/res/values-es/strings.xml
+++ b/android/lib/resource/src/main/res/values-es/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">Acceso a API</string>
<string name="settings_changes_effect_warning_content_blocker">Los cambios en la configuración relacionada con el DNS no surtirán efecto inmediatamente debido a los resultados en caché.</string>
<string name="settings_changes_effect_warning_short">La configuración de DNS podría no surtir efecto inmediatamente</string>
+ <string name="settings_notifications">Notificaciones</string>
<string name="settings_patch_error_failed_to_apply_patch">Error al aplicar el parche</string>
<string name="settings_patch_error_invalid_or_missing_value">El valor «%1$s» falta o no es válido</string>
<string name="settings_patch_error_recursion_limit">Límite de recursión</string>
diff --git a/android/lib/resource/src/main/res/values-fi/strings.xml b/android/lib/resource/src/main/res/values-fi/strings.xml
index d5e392cb88..ab3101fc57 100644
--- a/android/lib/resource/src/main/res/values-fi/strings.xml
+++ b/android/lib/resource/src/main/res/values-fi/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">Ohjelmointirajapinnan käyttö</string>
<string name="settings_changes_effect_warning_content_blocker">DNS-asetuksiin tehdyt muutokset eivät välttämättä astu voimaan välittömästi välimuistissa olevien tulosten vuoksi.</string>
<string name="settings_changes_effect_warning_short">Uudet DNS-asetukset eivät välttämättä astu voimaan välittömästi</string>
+ <string name="settings_notifications">Ilmoitukset</string>
<string name="settings_patch_error_failed_to_apply_patch">Muutostiedoston käyttöönotto ei onnistunut</string>
<string name="settings_patch_error_invalid_or_missing_value">Arvo \"%1$s\" puuttuu tai on virheellinen</string>
<string name="settings_patch_error_recursion_limit">Toistorajoitus</string>
diff --git a/android/lib/resource/src/main/res/values-fr/strings.xml b/android/lib/resource/src/main/res/values-fr/strings.xml
index 8e523f49e3..52ff3dddb1 100644
--- a/android/lib/resource/src/main/res/values-fr/strings.xml
+++ b/android/lib/resource/src/main/res/values-fr/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">Accès à l\'API</string>
<string name="settings_changes_effect_warning_content_blocker">Les modifications apportées aux paramètres liés au DNS peuvent ne pas prendre effet immédiatement en raison de la mise en cache des résultats.</string>
<string name="settings_changes_effect_warning_short">Les paramètres DNS peuvent ne pas être immédiatement pris en compte</string>
+ <string name="settings_notifications">Notifications</string>
<string name="settings_patch_error_failed_to_apply_patch">Impossible d\'appliquer le correctif</string>
<string name="settings_patch_error_invalid_or_missing_value">Valeur « %1$s » non valide ou manquante</string>
<string name="settings_patch_error_recursion_limit">Limite de récursion</string>
diff --git a/android/lib/resource/src/main/res/values-it/strings.xml b/android/lib/resource/src/main/res/values-it/strings.xml
index 12f4d1cacb..03bfe3500a 100644
--- a/android/lib/resource/src/main/res/values-it/strings.xml
+++ b/android/lib/resource/src/main/res/values-it/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">Accesso API</string>
<string name="settings_changes_effect_warning_content_blocker">Le modifiche alle impostazioni relative al DNS potrebbero non avere effetto immediato a causa dei risultati memorizzati nella cache.</string>
<string name="settings_changes_effect_warning_short">Le impostazioni DNS potrebbero non avere effetto immediato</string>
+ <string name="settings_notifications">Notifiche</string>
<string name="settings_patch_error_failed_to_apply_patch">Impossibile applicare la patch</string>
<string name="settings_patch_error_invalid_or_missing_value">Valore \"%1$s\" non valido o mancante</string>
<string name="settings_patch_error_recursion_limit">Limite di ricorsione</string>
diff --git a/android/lib/resource/src/main/res/values-ja/strings.xml b/android/lib/resource/src/main/res/values-ja/strings.xml
index 58ba7a369e..5c6a938215 100644
--- a/android/lib/resource/src/main/res/values-ja/strings.xml
+++ b/android/lib/resource/src/main/res/values-ja/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">APIアクセス</string>
<string name="settings_changes_effect_warning_content_blocker">結果がキャッシュされているため、DNS関連の設定の変更はすぐには適用されない可能性があります。</string>
<string name="settings_changes_effect_warning_short">DNS設定はすぐに適用されない可能性があります</string>
+ <string name="settings_notifications">通知</string>
<string name="settings_patch_error_failed_to_apply_patch">パッチを適用できませんでした</string>
<string name="settings_patch_error_invalid_or_missing_value">値「%1$s」は無効であるか、欠測しています</string>
<string name="settings_patch_error_recursion_limit">繰り返しの制限</string>
diff --git a/android/lib/resource/src/main/res/values-ko/strings.xml b/android/lib/resource/src/main/res/values-ko/strings.xml
index ac3146b5f4..b5cdef6266 100644
--- a/android/lib/resource/src/main/res/values-ko/strings.xml
+++ b/android/lib/resource/src/main/res/values-ko/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">API 액세스</string>
<string name="settings_changes_effect_warning_content_blocker">DNS 관련 설정에 대한 변경 사항은 캐시된 결과로 인해 즉시 적용되지 않을 수도 있습니다.</string>
<string name="settings_changes_effect_warning_short">DNS 설정이 즉시 적용되지 않을 수도 있습니다</string>
+ <string name="settings_notifications">알림</string>
<string name="settings_patch_error_failed_to_apply_patch">패치 적용 실패</string>
<string name="settings_patch_error_invalid_or_missing_value">\"%1$s\" 값이 유효하지 않거나 누락되었습니다</string>
<string name="settings_patch_error_recursion_limit">반복 제한</string>
diff --git a/android/lib/resource/src/main/res/values-my/strings.xml b/android/lib/resource/src/main/res/values-my/strings.xml
index 9909f1216b..a52c079435 100644
--- a/android/lib/resource/src/main/res/values-my/strings.xml
+++ b/android/lib/resource/src/main/res/values-my/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">API ရယူသုံးစွဲခွင့်</string>
<string name="settings_changes_effect_warning_content_blocker">DNS နှင့်ဆက်စပ်သော ဆက်တင်များ၌ ပြုလုပ်သည့် ပြောင်းလဲမှုများသည် ယာယီသိမ်းထားသော ရလဒ်များကြောင့် ချက်ချင်း အကျိုးမသက်ရောက်နိုင်ပါ။</string>
<string name="settings_changes_effect_warning_short">DNS ဆက်တင်ကို ချက်ချင်း အကျိုးမရောက်နိုင်ပါ။</string>
+ <string name="settings_notifications">အသိပေးချက်များ</string>
<string name="settings_patch_error_failed_to_apply_patch">ပတ်(ချ်) သုံးခြင်း မအောင်မြင်ပါ</string>
<string name="settings_patch_error_invalid_or_missing_value">မမှန်ကန်ပါ သို့မဟုတ် \"%1$s\" တန်ဖိုး ပျောက်နေသည်</string>
<string name="settings_patch_error_recursion_limit">ထပ်တလဲလဲ လုပ်ဆောင်မှု ကန့်သတ်ချက်</string>
diff --git a/android/lib/resource/src/main/res/values-nb/strings.xml b/android/lib/resource/src/main/res/values-nb/strings.xml
index fab24b9f77..63d550e048 100644
--- a/android/lib/resource/src/main/res/values-nb/strings.xml
+++ b/android/lib/resource/src/main/res/values-nb/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">API-tilgang</string>
<string name="settings_changes_effect_warning_content_blocker">Endringer til DNS-relaterte innstillinger vil kanskje ikke tre i kraft umiddelbart på grunn av bufrede resultater.</string>
<string name="settings_changes_effect_warning_short">DNS-innstillinger vil kanskje ikke tre i kraft umiddelbart</string>
+ <string name="settings_notifications">Meldinger</string>
<string name="settings_patch_error_failed_to_apply_patch">Kunne ikke bruke oppdatering</string>
<string name="settings_patch_error_invalid_or_missing_value">Ugyldig eller mangler verdien «%1$s»</string>
<string name="settings_patch_error_recursion_limit">Rekursjonsgrense</string>
diff --git a/android/lib/resource/src/main/res/values-nl/strings.xml b/android/lib/resource/src/main/res/values-nl/strings.xml
index fa5b5f0ba8..8570f48dd8 100644
--- a/android/lib/resource/src/main/res/values-nl/strings.xml
+++ b/android/lib/resource/src/main/res/values-nl/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">API-toegang</string>
<string name="settings_changes_effect_warning_content_blocker">Wijzigingen in DNS-gerelateerde instellingen worden mogelijk niet onmiddellijk van kracht vanwege gecachete resultaten.</string>
<string name="settings_changes_effect_warning_short">DNS-instellingen worden mogelijk niet onmiddellijk van kracht</string>
+ <string name="settings_notifications">Notificaties</string>
<string name="settings_patch_error_failed_to_apply_patch">Patch toepassen mislukt</string>
<string name="settings_patch_error_invalid_or_missing_value">Ongeldige of ontbrekende waarde \"%1$s\"</string>
<string name="settings_patch_error_recursion_limit">Recursielimiet</string>
diff --git a/android/lib/resource/src/main/res/values-pl/strings.xml b/android/lib/resource/src/main/res/values-pl/strings.xml
index 67189cdbea..1316905be4 100644
--- a/android/lib/resource/src/main/res/values-pl/strings.xml
+++ b/android/lib/resource/src/main/res/values-pl/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">Dostęp do API</string>
<string name="settings_changes_effect_warning_content_blocker">Zmiany w ustawieniach związanych z usługą DNS mogą nie zostać wprowadzone natychmiast ze względu na zbuforowane wyniki.</string>
<string name="settings_changes_effect_warning_short">Ustawienia usługi DNS mogą nie zostać zastosowane natychmiast</string>
+ <string name="settings_notifications">Powiadomienia</string>
<string name="settings_patch_error_failed_to_apply_patch">Nie udało się zastosować poprawki</string>
<string name="settings_patch_error_invalid_or_missing_value">Nieprawidłowa lub brakująca wartość „%1$s”</string>
<string name="settings_patch_error_recursion_limit">Limit rekursji</string>
diff --git a/android/lib/resource/src/main/res/values-pt/strings.xml b/android/lib/resource/src/main/res/values-pt/strings.xml
index 57f6290216..66accd8f2d 100644
--- a/android/lib/resource/src/main/res/values-pt/strings.xml
+++ b/android/lib/resource/src/main/res/values-pt/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">Acesso à API</string>
<string name="settings_changes_effect_warning_content_blocker">As alterações às definições relacionadas com o DNS podem não fazer efeito imediatamente devido aos resultados em cache.</string>
<string name="settings_changes_effect_warning_short">As definições de DNS podem não fazer efeito imediatamente</string>
+ <string name="settings_notifications">Notificações</string>
<string name="settings_patch_error_failed_to_apply_patch">Erro ao aplicar patch</string>
<string name="settings_patch_error_invalid_or_missing_value">Valor inválido ou em falta: \"%1$s\"</string>
<string name="settings_patch_error_recursion_limit">Limite de recursão</string>
diff --git a/android/lib/resource/src/main/res/values-ru/strings.xml b/android/lib/resource/src/main/res/values-ru/strings.xml
index 2db2a334f4..d4c7b9da86 100644
--- a/android/lib/resource/src/main/res/values-ru/strings.xml
+++ b/android/lib/resource/src/main/res/values-ru/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">Доступ к API</string>
<string name="settings_changes_effect_warning_content_blocker">Изменения в настройках, связанные с DNS, могут не сразу вступить в силу из-за кешированных результатов.</string>
<string name="settings_changes_effect_warning_short">Настройки DNS могут не сразу вступить в силу</string>
+ <string name="settings_notifications">Уведомления</string>
<string name="settings_patch_error_failed_to_apply_patch">Не удалось применить патч</string>
<string name="settings_patch_error_invalid_or_missing_value">Недопустимое или отсутствующее значение «%1$s»</string>
<string name="settings_patch_error_recursion_limit">Предел рекурсии</string>
diff --git a/android/lib/resource/src/main/res/values-sv/strings.xml b/android/lib/resource/src/main/res/values-sv/strings.xml
index f1f03205db..bd7d7585ba 100644
--- a/android/lib/resource/src/main/res/values-sv/strings.xml
+++ b/android/lib/resource/src/main/res/values-sv/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">API-åtkomst</string>
<string name="settings_changes_effect_warning_content_blocker">Ändringar i DNS-relaterade inställningar kanske inte börjar gälla direkt på grund av cachade resultat.</string>
<string name="settings_changes_effect_warning_short">DNS-inställningarna kanske inte börjar gälla direkt</string>
+ <string name="settings_notifications">Meddelanden</string>
<string name="settings_patch_error_failed_to_apply_patch">Konfigurationsfilen kunde inte tillämpas</string>
<string name="settings_patch_error_invalid_or_missing_value">Värdet \"%1$s\" är ogiltigt eller saknas</string>
<string name="settings_patch_error_recursion_limit">Rekursionsgräns</string>
diff --git a/android/lib/resource/src/main/res/values-th/strings.xml b/android/lib/resource/src/main/res/values-th/strings.xml
index 850007be38..e2f64843ff 100644
--- a/android/lib/resource/src/main/res/values-th/strings.xml
+++ b/android/lib/resource/src/main/res/values-th/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">การเข้าถึง API</string>
<string name="settings_changes_effect_warning_content_blocker">การเปลี่ยนแปลงการตั้งค่าที่เกี่ยวข้องกับ DNS อาจไม่มีผลทันที เนื่องจากผลลัพธ์ที่แคชไว้</string>
<string name="settings_changes_effect_warning_short">การตั้งค่า DNS อาจไม่มีผลทันที</string>
+ <string name="settings_notifications">การแจ้งเตือน</string>
<string name="settings_patch_error_failed_to_apply_patch">ล้มเหลวในการปรับใช้แพตช์</string>
<string name="settings_patch_error_invalid_or_missing_value">ค่า \"%1$s” ไม่ถูกต้องหรือขาดหายไป</string>
<string name="settings_patch_error_recursion_limit">ขีดจำกัดการเรียกซ้ำ</string>
diff --git a/android/lib/resource/src/main/res/values-tr/strings.xml b/android/lib/resource/src/main/res/values-tr/strings.xml
index d6b85efa06..e2258537ef 100644
--- a/android/lib/resource/src/main/res/values-tr/strings.xml
+++ b/android/lib/resource/src/main/res/values-tr/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">API erişimi</string>
<string name="settings_changes_effect_warning_content_blocker">DNS ile ilgili ayarlarda yapılan değişiklikler, önbelleğe alınan sonuçlar nedeniyle hemen etkili olmayabilir.</string>
<string name="settings_changes_effect_warning_short">DNS ayarları hemen etkili olmayabilir</string>
+ <string name="settings_notifications">Bildirimler</string>
<string name="settings_patch_error_failed_to_apply_patch">Yama uygulanamadı</string>
<string name="settings_patch_error_invalid_or_missing_value">Geçersiz veya eksik \"%1$s\" değeri</string>
<string name="settings_patch_error_recursion_limit">Yineleme sınırı</string>
diff --git a/android/lib/resource/src/main/res/values-zh-rCN/strings.xml b/android/lib/resource/src/main/res/values-zh-rCN/strings.xml
index 82681ab2a9..c4757f1561 100644
--- a/android/lib/resource/src/main/res/values-zh-rCN/strings.xml
+++ b/android/lib/resource/src/main/res/values-zh-rCN/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">API 访问</string>
<string name="settings_changes_effect_warning_content_blocker">由于缓存结果,对 DNS 相关设置的更改可能不会立即生效。</string>
<string name="settings_changes_effect_warning_short">DNS 设置可能不会立即生效</string>
+ <string name="settings_notifications">通知</string>
<string name="settings_patch_error_failed_to_apply_patch">无法应用补丁</string>
<string name="settings_patch_error_invalid_or_missing_value">值“%1$s”无效或者缺失</string>
<string name="settings_patch_error_recursion_limit">递归限制</string>
diff --git a/android/lib/resource/src/main/res/values-zh-rTW/strings.xml b/android/lib/resource/src/main/res/values-zh-rTW/strings.xml
index 13041d04fa..14158d905e 100644
--- a/android/lib/resource/src/main/res/values-zh-rTW/strings.xml
+++ b/android/lib/resource/src/main/res/values-zh-rTW/strings.xml
@@ -367,6 +367,7 @@
<string name="settings_api_access">API 存取</string>
<string name="settings_changes_effect_warning_content_blocker">由於快取的結果,對 DNS 相關設定所做的變更可能不會立即生效。</string>
<string name="settings_changes_effect_warning_short">DNS 設定可能不會立即生效</string>
+ <string name="settings_notifications">通知</string>
<string name="settings_patch_error_failed_to_apply_patch">無法套用修補檔</string>
<string name="settings_patch_error_invalid_or_missing_value">值「%1$s」無效或遺失</string>
<string name="settings_patch_error_recursion_limit">遞迴限制</string>
diff --git a/android/lib/resource/src/main/res/values/strings.xml b/android/lib/resource/src/main/res/values/strings.xml
index df89404424..147559f0c2 100644
--- a/android/lib/resource/src/main/res/values/strings.xml
+++ b/android/lib/resource/src/main/res/values/strings.xml
@@ -301,6 +301,7 @@
<string name="overrides_cleared">Overrides cleared</string>
<string name="disconnected_vpn_permission_error">Disconnected (No VPN permission)</string>
<string name="settings_api_access">API access</string>
+ <string name="settings_notifications">Notifications</string>
<string name="add">Add</string>
<string name="api_access_description">Manage and add custom methods to access the Mullvad API.</string>
<string name="current_method">Current: %s</string>
@@ -400,6 +401,7 @@
<string name="device_ip_version_title">Device IP version</string>
<string name="confirm_ipv6_dns">The IPv6 DNS server will not work unless you enable \"IPv6\" under VPN settings.</string>
<string name="enable_ipv6">In-tunnel IPv6</string>
+ <string name="enable_location_in_notification">Show location in notification</string>
<string name="uri_market_app_not_found">No Android app store installed, could not open link</string>
<string name="uri_browser_app_not_found">No browser app installed, could not open link</string>
<string name="ipv6_info">When this feature is enabled, IPv6 can be used alongside IPv4 in the VPN tunnel to communicate with internet services.</string>
diff --git a/android/lib/tv/build.gradle.kts b/android/lib/tv/build.gradle.kts
index 4b5ca98f95..2e614db7ea 100644
--- a/android/lib/tv/build.gradle.kts
+++ b/android/lib/tv/build.gradle.kts
@@ -42,7 +42,7 @@ dependencies {
implementation(libs.compose.ui)
implementation(projects.lib.model)
implementation(projects.lib.resource)
- implementation(projects.lib.shared)
+ implementation(projects.lib.repository)
implementation(projects.lib.theme)
implementation(projects.lib.ui.component)