summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorKalle Lindström <karl.lindstrom@mullvad.net>2025-08-11 11:53:42 +0200
committerKalle Lindström <karl.lindstrom@mullvad.net>2025-08-12 11:22:24 +0200
commitf4013bb3bfc158caa078898074ac29f6a922f1b3 (patch)
tree1953120eccafa961567448d05627a6a1cf4e7085 /android
parent26344906cae68001efbbca9186e84de18e2c8a80 (diff)
downloadmullvadvpn-f4013bb3bfc158caa078898074ac29f6a922f1b3.tar.xz
mullvadvpn-f4013bb3bfc158caa078898074ac29f6a922f1b3.zip
Move expiry notification handling to application
Diffstat (limited to 'android')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/MullvadApplication.kt41
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/AppModule.kt8
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt30
3 files changed, 49 insertions, 30 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/MullvadApplication.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/MullvadApplication.kt
index 3af04a9b6c..458ab784cd 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/MullvadApplication.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/MullvadApplication.kt
@@ -3,9 +3,16 @@ package net.mullvad.mullvadvpn
import android.app.Application
import co.touchlab.kermit.Logger
import co.touchlab.kermit.Severity
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+import net.mullvad.mullvadvpn.di.ApplicationScope
import net.mullvad.mullvadvpn.di.appModule
import net.mullvad.mullvadvpn.service.notifications.NotificationChannelFactory
import net.mullvad.mullvadvpn.service.notifications.NotificationManager
+import net.mullvad.mullvadvpn.service.notifications.accountexpiry.AccountExpiryNotificationProvider
+import net.mullvad.mullvadvpn.usecase.AccountExpiryNotificationActionUseCase
+import net.mullvad.mullvadvpn.usecase.NotificationAction
+import net.mullvad.mullvadvpn.usecase.ScheduleNotificationAlarmUseCase
import org.koin.android.ext.android.getKoin
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.loadKoinModules
@@ -25,6 +32,40 @@ class MullvadApplication : Application() {
with(getKoin()) {
get<NotificationChannelFactory>()
get<NotificationManager>()
+
+ handleAccountExpiry(
+ scope = get<ApplicationScope>(),
+ accountExpiryUseCase = get<AccountExpiryNotificationActionUseCase>(),
+ scheduleNotificationAlarmUseCase = get<ScheduleNotificationAlarmUseCase>(),
+ accountExpiryNotificationProvider = get<AccountExpiryNotificationProvider>(),
+ )
+ }
+ }
+
+ private fun handleAccountExpiry(
+ scope: CoroutineScope,
+ accountExpiryUseCase: AccountExpiryNotificationActionUseCase,
+ scheduleNotificationAlarmUseCase: ScheduleNotificationAlarmUseCase,
+ accountExpiryNotificationProvider: AccountExpiryNotificationProvider,
+ ) {
+ scope.launch {
+ accountExpiryUseCase().collect { action ->
+ when (action) {
+ NotificationAction.CancelExisting -> {
+ accountExpiryNotificationProvider.cancelNotification()
+ scheduleNotificationAlarmUseCase(
+ context = this@MullvadApplication,
+ accountExpiry = null,
+ )
+ }
+
+ is NotificationAction.ScheduleAlarm ->
+ scheduleNotificationAlarmUseCase(
+ context = this@MullvadApplication,
+ accountExpiry = action.alarmTime,
+ )
+ }
+ }
}
}
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/AppModule.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/AppModule.kt
index f9627cdcae..980efa10d2 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/AppModule.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/AppModule.kt
@@ -5,6 +5,7 @@ import androidx.core.app.NotificationManagerCompat
import androidx.datastore.core.DataStore
import androidx.datastore.dataStore
import java.io.File
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.MainScope
import net.mullvad.mullvadvpn.BuildConfig
import net.mullvad.mullvadvpn.lib.common.constant.GRPC_SOCKET_FILE_NAME
@@ -48,6 +49,7 @@ val appModule = module {
scope = MainScope(),
)
}
+ single { ApplicationScope.createDoNotCallUseDiInstead() }
single { PrepareVpnUseCase(androidContext()) }
@@ -91,3 +93,9 @@ private val Context.userPreferencesStore: DataStore<UserPreferences> by
serializer = UserPreferencesSerializer,
produceMigrations = UserPreferencesMigration::migrations,
)
+
+class ApplicationScope private constructor(private val cs: CoroutineScope) : CoroutineScope by cs {
+ companion object {
+ fun createDoNotCallUseDiInstead(): ApplicationScope = ApplicationScope(MainScope())
+ }
+}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
index e10f71af95..de4fc2d046 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
@@ -36,12 +36,8 @@ import net.mullvad.mullvadvpn.lib.model.Prepared
import net.mullvad.mullvadvpn.lib.theme.AppTheme
import net.mullvad.mullvadvpn.repository.SplashCompleteRepository
import net.mullvad.mullvadvpn.repository.UserPreferencesRepository
-import net.mullvad.mullvadvpn.service.notifications.accountexpiry.AccountExpiryNotificationProvider
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionState
-import net.mullvad.mullvadvpn.usecase.AccountExpiryNotificationActionUseCase
-import net.mullvad.mullvadvpn.usecase.NotificationAction
-import net.mullvad.mullvadvpn.usecase.ScheduleNotificationAlarmUseCase
import net.mullvad.mullvadvpn.viewmodel.MullvadAppViewModel
import org.koin.android.ext.android.inject
import org.koin.android.scope.AndroidScopeComponent
@@ -65,10 +61,6 @@ class MainActivity : ComponentActivity(), AndroidScopeComponent {
private val serviceConnectionManager by inject<ServiceConnectionManager>()
private val splashCompleteRepository by inject<SplashCompleteRepository>()
private val managementService by inject<ManagementService>()
- private val scheduleNotificationAlarmUseCase by inject<ScheduleNotificationAlarmUseCase>()
- private val accountExpiryNotificationActionUseCase by
- inject<AccountExpiryNotificationActionUseCase>()
- private val accountExpiryNotificationProvider by inject<AccountExpiryNotificationProvider>()
private var isReadyNextDraw: Boolean = false
@@ -108,28 +100,6 @@ class MainActivity : ComponentActivity(), AndroidScopeComponent {
}
}
}
-
- lifecycleScope.launch {
- repeatOnLifecycle(Lifecycle.State.STARTED) {
- accountExpiryNotificationActionUseCase().collect { action ->
- when (action) {
- NotificationAction.CancelExisting -> {
- accountExpiryNotificationProvider.cancelNotification()
- scheduleNotificationAlarmUseCase(
- context = this@MainActivity,
- accountExpiry = null,
- )
- }
-
- is NotificationAction.ScheduleAlarm ->
- scheduleNotificationAlarmUseCase(
- context = this@MainActivity,
- accountExpiry = action.alarmTime,
- )
- }
- }
- }
- }
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {