diff options
| author | Kalle Lindström <karl.lindstrom@mullvad.net> | 2025-08-11 11:53:42 +0200 |
|---|---|---|
| committer | Kalle Lindström <karl.lindstrom@mullvad.net> | 2025-08-12 11:22:24 +0200 |
| commit | f4013bb3bfc158caa078898074ac29f6a922f1b3 (patch) | |
| tree | 1953120eccafa961567448d05627a6a1cf4e7085 /android | |
| parent | 26344906cae68001efbbca9186e84de18e2c8a80 (diff) | |
| download | mullvadvpn-f4013bb3bfc158caa078898074ac29f6a922f1b3.tar.xz mullvadvpn-f4013bb3bfc158caa078898074ac29f6a922f1b3.zip | |
Move expiry notification handling to application
Diffstat (limited to 'android')
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) { |
