diff options
| author | Kalle Lindström <karl.lindstrom@mullvad.net> | 2025-02-25 10:48:50 +0100 |
|---|---|---|
| committer | Kalle Lindström <karl.lindstrom@mullvad.net> | 2025-02-26 09:25:17 +0100 |
| commit | da304ffedf8f8d98600f31f737cf92768c0323fa (patch) | |
| tree | e8da9b9a861f3d3efbbbc39fb5160ec1cfeb67fa /android/app/src/main | |
| parent | 5025db74b34cfb3536c43f89f3407ffc0d97ae73 (diff) | |
| download | mullvadvpn-da304ffedf8f8d98600f31f737cf92768c0323fa.tar.xz mullvadvpn-da304ffedf8f8d98600f31f737cf92768c0323fa.zip | |
Remove Joda Time and use java.time package instead
Joda Time has been superseded by the Java 8 java.time package
which has more or less the same API. This commit removes all
usage of Joda Time and replaces it with the java.time classes.
This is done so that we can remove the dependency on Joda Time.
Diffstat (limited to 'android/app/src/main')
19 files changed, 47 insertions, 49 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/Scaffolding.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/Scaffolding.kt index 3d591bafba..29fa7415bb 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/Scaffolding.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/Scaffolding.kt @@ -78,7 +78,7 @@ fun ScaffoldWithTopBarAndDeviceName( isIconAndLogoVisible: Boolean = true, snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }, deviceName: String?, - timeLeft: Int?, + timeLeft: Long?, content: @Composable (PaddingValues) -> Unit, ) { Scaffold( diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/TopBar.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/TopBar.kt index 91cb49ae53..e7a58d998b 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/TopBar.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/TopBar.kt @@ -332,7 +332,7 @@ fun MullvadTopBarWithDeviceName( iconTintColor: Color, isIconAndLogoVisible: Boolean = true, deviceName: String?, - daysLeftUntilExpiry: Int?, + daysLeftUntilExpiry: Long?, ) { Column { MullvadTopBar( @@ -383,8 +383,8 @@ fun MullvadTopBarWithDeviceName( if (daysLeftUntilExpiry >= 0) { pluralStringResource( id = R.plurals.days, - daysLeftUntilExpiry, - daysLeftUntilExpiry, + daysLeftUntilExpiry.toInt(), + daysLeftUntilExpiry.toInt(), ) } else { stringResource(id = R.string.out_of_time) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/notificationbanner/NotificationBanner.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/notificationbanner/NotificationBanner.kt index f15a054b7d..4f527a94c5 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/notificationbanner/NotificationBanner.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/notificationbanner/NotificationBanner.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension +import java.time.Duration import net.mullvad.mullvadvpn.compose.component.MullvadTopBar import net.mullvad.mullvadvpn.compose.test.NOTIFICATION_BANNER import net.mullvad.mullvadvpn.compose.test.NOTIFICATION_BANNER_ACTION @@ -43,7 +44,6 @@ import net.mullvad.mullvadvpn.lib.theme.color.warning import net.mullvad.mullvadvpn.repository.InAppNotification import net.mullvad.mullvadvpn.ui.VersionInfo import net.mullvad.mullvadvpn.ui.notification.StatusLevel -import org.joda.time.Duration @Preview @Composable diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt index a9859c318a..93b29e5185 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt @@ -29,6 +29,7 @@ import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle +import java.util.concurrent.TimeUnit import net.mullvad.mullvadvpn.BuildConfig import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.PrimaryButton @@ -46,7 +47,6 @@ import net.mullvad.mullvadvpn.lib.model.RedeemVoucherError import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.viewmodel.VoucherDialogViewModel -import org.joda.time.DateTimeConstants import org.koin.androidx.compose.koinViewModel @Preview(device = Devices.TV_720p) @@ -157,9 +157,10 @@ fun RedeemVoucherDialog( modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { + TimeUnit.DAYS.toSeconds(1) if (state.voucherState is VoucherDialogState.Success) { val days: Int = - (state.voucherState.addedTime / DateTimeConstants.SECONDS_PER_DAY).toInt() + (state.voucherState.addedTime / TimeUnit.DAYS.toSeconds(1)).toInt() val message = stringResource( R.string.added_to_your_account, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/ResourcesExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/ResourcesExtensions.kt index 9611897e76..28459c9a5d 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/ResourcesExtensions.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/ResourcesExtensions.kt @@ -1,16 +1,16 @@ package net.mullvad.mullvadvpn.compose.extensions import android.content.res.Resources +import java.time.Duration import net.mullvad.mullvadvpn.R -import org.joda.time.Duration private const val DAYS_IN_STANDARD_YEAR = 365 fun Resources.getExpiryQuantityString(accountExpiry: Duration): String { - val days = accountExpiry.standardDays.toInt() - val years = (accountExpiry.standardDays / DAYS_IN_STANDARD_YEAR).toInt() + val days = accountExpiry.toDays().toInt() + val years = (accountExpiry.toDays() / DAYS_IN_STANDARD_YEAR).toInt() - return if (accountExpiry.millis <= 0) { + return if (accountExpiry.toMillis() <= 0) { getString(R.string.out_of_time) } else if (years > 1) { getRemainingText(this, R.plurals.years_left, years) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/AccountUiStatePreviewParameterProvider.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/AccountUiStatePreviewParameterProvider.kt index c15e8b2a53..f40d0697ab 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/AccountUiStatePreviewParameterProvider.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/AccountUiStatePreviewParameterProvider.kt @@ -1,6 +1,8 @@ package net.mullvad.mullvadvpn.compose.preview import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter import net.mullvad.mullvadvpn.compose.state.PaymentState import net.mullvad.mullvadvpn.lib.model.AccountNumber import net.mullvad.mullvadvpn.lib.payment.model.PaymentProduct @@ -8,7 +10,6 @@ import net.mullvad.mullvadvpn.lib.payment.model.PaymentStatus import net.mullvad.mullvadvpn.lib.payment.model.ProductId import net.mullvad.mullvadvpn.lib.payment.model.ProductPrice import net.mullvad.mullvadvpn.viewmodel.AccountUiState -import org.joda.time.DateTime class AccountUiStatePreviewParameterProvider : PreviewParameterProvider<AccountUiState> { override val values = @@ -16,7 +17,11 @@ class AccountUiStatePreviewParameterProvider : PreviewParameterProvider<AccountU AccountUiState( deviceName = "Test Name", accountNumber = AccountNumber("1234123412341234"), - accountExpiry = DateTime.parse("2050-12-01"), + accountExpiry = + ZonedDateTime.parse( + "2050-12-01T00:00:00.000Z", + DateTimeFormatter.ISO_ZONED_DATE_TIME, + ), showSitePayment = true, billingPaymentState = PaymentState.PaymentAvailable( diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/DevicePreviewData.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/DevicePreviewData.kt index b87974d18b..82bf05ba64 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/DevicePreviewData.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/DevicePreviewData.kt @@ -1,9 +1,10 @@ package net.mullvad.mullvadvpn.compose.preview +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter import net.mullvad.mullvadvpn.compose.state.DeviceItemUiState import net.mullvad.mullvadvpn.lib.model.Device import net.mullvad.mullvadvpn.lib.model.DeviceId -import org.joda.time.DateTime internal object DevicePreviewData { fun generateDevices(count: Int) = @@ -16,10 +17,11 @@ internal object DevicePreviewData { Device( id = DeviceId.fromString(id), name = name ?: "Device $index-${id.take(DEVICE_SUFFIX_LENGTH)}", - creationDate = DEVICE_CREATION_DATE.plusMonths(index), + creationDate = DEVICE_CREATION_DATE.plusMonths(index.toLong()), ) } private const val DEVICE_SUFFIX_LENGTH = 4 private const val UUID = "12345678-1234-5678-1234-567812345678" -private val DEVICE_CREATION_DATE = DateTime.parse("2024-05-27") +private val DEVICE_CREATION_DATE = + ZonedDateTime.parse("2024-05-27T00:00+00:00", DateTimeFormatter.ISO_ZONED_DATE_TIME) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt index ddfb535faf..bd3d8b8bc5 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt @@ -38,6 +38,7 @@ import com.ramcosta.composedestinations.generated.destinations.VerificationPendi import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultRecipient +import java.time.ZonedDateTime import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.ExternalButton @@ -57,13 +58,12 @@ import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle import net.mullvad.mullvadvpn.compose.util.SecureScreenWhileInView import net.mullvad.mullvadvpn.compose.util.createCopyToClipboardHandle import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately +import net.mullvad.mullvadvpn.lib.common.util.toExpiryDateString import net.mullvad.mullvadvpn.lib.payment.model.ProductId import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens -import net.mullvad.mullvadvpn.util.toExpiryDateString import net.mullvad.mullvadvpn.viewmodel.AccountUiState import net.mullvad.mullvadvpn.viewmodel.AccountViewModel -import org.joda.time.DateTime import org.koin.androidx.compose.koinViewModel @OptIn(ExperimentalMaterial3Api::class) @@ -256,7 +256,7 @@ private fun AccountNumberRow(accountNumber: String, onCopyAccountNumber: (String } @Composable -private fun PaidUntilRow(accountExpiry: DateTime?) { +private fun PaidUntilRow(accountExpiry: ZonedDateTime?) { Column(modifier = Modifier.fillMaxWidth()) { Text( style = MaterialTheme.typography.labelMedium, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt index 34ac8d98b7..0a9504f46c 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt @@ -56,6 +56,7 @@ import net.mullvad.mullvadvpn.compose.state.DeviceListUiState import net.mullvad.mullvadvpn.compose.transitions.DefaultTransition import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately +import net.mullvad.mullvadvpn.lib.common.util.formatDate import net.mullvad.mullvadvpn.lib.model.AccountNumber import net.mullvad.mullvadvpn.lib.model.Device import net.mullvad.mullvadvpn.lib.model.DeviceId @@ -64,7 +65,6 @@ import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.lib.theme.color.selected import net.mullvad.mullvadvpn.lib.theme.typeface.listItemSubText import net.mullvad.mullvadvpn.lib.theme.typeface.listItemText -import net.mullvad.mullvadvpn.util.formatDate import net.mullvad.mullvadvpn.viewmodel.DeviceListSideEffect import net.mullvad.mullvadvpn.viewmodel.DeviceListViewModel import org.koin.androidx.compose.koinViewModel diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/ConnectUiState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/ConnectUiState.kt index 98b5219785..4e17b6918b 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/ConnectUiState.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/ConnectUiState.kt @@ -11,7 +11,7 @@ data class ConnectUiState( val showLocation: Boolean, val inAppNotification: InAppNotification?, val deviceName: String?, - val daysLeftUntilExpiry: Int?, + val daysLeftUntilExpiry: Long?, val isPlayBuild: Boolean, ) { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/provider/MullvadFileProvider.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/provider/MullvadFileProvider.kt index 729fe5f2c2..b070f7c646 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/provider/MullvadFileProvider.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/provider/MullvadFileProvider.kt @@ -5,9 +5,9 @@ import android.content.Intent import android.net.Uri import androidx.core.content.FileProvider import java.io.File +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter import net.mullvad.mullvadvpn.R -import org.joda.time.DateTime -import org.joda.time.format.ISODateTimeFormat // https://developer.android.com/reference/androidx/core/content/FileProvider // From link: It is possible to use FileProvider directly instead of extending it. However, this is @@ -51,6 +51,6 @@ fun Context.createCacheFile(directory: ProviderCacheDirectory, fileName: String) } fun createShareLogFileName(): String { - val datetime = ISODateTimeFormat.basicOrdinalDateTimeNoMillis().print(DateTime.now()) + val datetime = DateTimeFormatter.ofPattern("yyyyDDD'T'HHmmssZ").format(ZonedDateTime.now()) return "mullvad_log-${datetime}.txt" } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/InAppNotificationController.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/InAppNotificationController.kt index 0fcee60bed..0e3e004f0b 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/InAppNotificationController.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/InAppNotificationController.kt @@ -1,5 +1,6 @@ package net.mullvad.mullvadvpn.repository +import java.time.Duration import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.combine @@ -12,7 +13,6 @@ import net.mullvad.mullvadvpn.usecase.NewChangelogNotificationUseCase import net.mullvad.mullvadvpn.usecase.NewDeviceNotificationUseCase import net.mullvad.mullvadvpn.usecase.TunnelStateNotificationUseCase import net.mullvad.mullvadvpn.usecase.VersionNotificationUseCase -import org.joda.time.Duration enum class StatusLevel { Error, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCase.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCase.kt index 8fd97dc63d..081c632255 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCase.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCase.kt @@ -14,11 +14,11 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn +import net.mullvad.mullvadvpn.lib.common.util.millisFromNow import net.mullvad.mullvadvpn.lib.model.ErrorStateCause import net.mullvad.mullvadvpn.lib.model.TunnelState import net.mullvad.mullvadvpn.lib.shared.AccountRepository import net.mullvad.mullvadvpn.lib.shared.ConnectionProxy -import org.joda.time.DateTime class OutOfTimeUseCase( private val connectionProxy: ConnectionProxy, @@ -60,7 +60,7 @@ class OutOfTimeUseCase( .flatMapLatest { if (it != null) { flow { - val millisUntilExpiry = it.expiryDate.millis - DateTime.now().millis + val millisUntilExpiry = it.expiryDate.millisFromNow() if (millisUntilExpiry > 0) { emit(false) delay(millisUntilExpiry) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/DateExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/DateExtensions.kt deleted file mode 100644 index e11434257a..0000000000 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/DateExtensions.kt +++ /dev/null @@ -1,15 +0,0 @@ -package net.mullvad.mullvadvpn.util - -import java.text.DateFormat -import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.DurationUnit -import org.joda.time.DateTime -import org.joda.time.format.ISODateTimeFormat - -fun DateTime.formatDate(): String = ISODateTimeFormat.date().print(this) - -fun DateTime.toExpiryDateString(): String = - DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(this.toDate()) - -fun DateTime.daysFromNow() = - (toInstant().millis - DateTime.now().toInstant().millis).milliseconds.toInt(DurationUnit.DAYS) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt index 8297375ee3..8dd4253553 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt @@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.viewmodel import android.app.Activity import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import java.time.ZonedDateTime import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -27,7 +28,6 @@ import net.mullvad.mullvadvpn.lib.shared.DeviceRepository import net.mullvad.mullvadvpn.usecase.PaymentUseCase import net.mullvad.mullvadvpn.util.isSuccess import net.mullvad.mullvadvpn.util.toPaymentState -import org.joda.time.DateTime class AccountViewModel( private val accountRepository: AccountRepository, @@ -155,7 +155,7 @@ class AccountViewModel( data class AccountUiState( val deviceName: String?, val accountNumber: AccountNumber?, - val accountExpiry: DateTime?, + val accountExpiry: ZonedDateTime?, val showSitePayment: Boolean, val billingPaymentState: PaymentState? = null, val showLogoutLoading: Boolean = false, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt index 6e8b3f9009..d505c44179 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.state.ConnectUiState +import net.mullvad.mullvadvpn.lib.common.util.daysFromNow import net.mullvad.mullvadvpn.lib.model.ActionAfterDisconnect import net.mullvad.mullvadvpn.lib.model.ConnectError import net.mullvad.mullvadvpn.lib.model.DeviceState @@ -34,7 +35,6 @@ import net.mullvad.mullvadvpn.usecase.OutOfTimeUseCase import net.mullvad.mullvadvpn.usecase.PaymentUseCase import net.mullvad.mullvadvpn.usecase.SelectedLocationTitleUseCase import net.mullvad.mullvadvpn.util.combine -import net.mullvad.mullvadvpn.util.daysFromNow import net.mullvad.mullvadvpn.util.isSuccess import net.mullvad.mullvadvpn.util.withPrev diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt index 25a8a47da3..088b5f3ae2 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt @@ -24,6 +24,7 @@ import net.mullvad.mullvadvpn.compose.state.LoginState.Idle import net.mullvad.mullvadvpn.compose.state.LoginState.Loading import net.mullvad.mullvadvpn.compose.state.LoginState.Success import net.mullvad.mullvadvpn.compose.state.LoginUiState +import net.mullvad.mullvadvpn.lib.common.util.isBeforeNowInstant import net.mullvad.mullvadvpn.lib.model.AccountNumber import net.mullvad.mullvadvpn.lib.model.LoginAccountError import net.mullvad.mullvadvpn.lib.shared.AccountRepository @@ -137,7 +138,9 @@ class LoginViewModel( viewModelScope.launch(dispatcher) { // Find if user is out of time val isOutOfTimeDeferred = async { - accountRepository.accountData.mapNotNull { it?.expiryDate?.isBeforeNow }.first() + accountRepository.accountData + .mapNotNull { it?.expiryDate?.isBeforeNowInstant() } + .first() } // Always show successful login for some time. diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplashViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplashViewModel.kt index 0ed85c94cd..fe0acd83c1 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplashViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplashViewModel.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.selects.onTimeout import kotlinx.coroutines.selects.select import net.mullvad.mullvadvpn.constant.ACCOUNT_EXPIRY_TIMEOUT_MS +import net.mullvad.mullvadvpn.lib.common.util.isBeforeNowInstant import net.mullvad.mullvadvpn.lib.model.DeviceState import net.mullvad.mullvadvpn.lib.shared.AccountRepository import net.mullvad.mullvadvpn.lib.shared.DeviceRepository @@ -72,7 +73,7 @@ class SplashViewModel( onTimeout(ACCOUNT_EXPIRY_TIMEOUT_MS) { null } } - return if (accountData != null && accountData.expiryDate.isBeforeNow) { + return if (accountData != null && accountData.expiryDate.isBeforeNowInstant()) { SplashUiSideEffect.NavigateToOutOfTime } else { SplashUiSideEffect.NavigateToConnect diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt index 67e0f7a54d..0e91390262 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt @@ -15,6 +15,7 @@ import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.compose.state.WelcomeUiState +import net.mullvad.mullvadvpn.lib.common.util.isAfterNowInstant import net.mullvad.mullvadvpn.lib.model.WebsiteAuthToken import net.mullvad.mullvadvpn.lib.shared.AccountRepository import net.mullvad.mullvadvpn.lib.shared.ConnectionProxy @@ -66,7 +67,7 @@ class WelcomeViewModel( private fun hasAddedTimeEffect() = accountRepository.accountData .filterNotNull() - .filter { it.expiryDate.minusHours(MIN_HOURS_PAST_ACCOUNT_EXPIRY).isAfterNow } + .filter { it.expiryDate.minusHours(MIN_HOURS_PAST_ACCOUNT_EXPIRY).isAfterNowInstant() } .onEach { paymentUseCase.resetPurchaseResult() } .map { UiSideEffect.OpenConnectScreen } @@ -125,6 +126,6 @@ class WelcomeViewModel( } companion object { - private const val MIN_HOURS_PAST_ACCOUNT_EXPIRY = 20 + private const val MIN_HOURS_PAST_ACCOUNT_EXPIRY: Long = 20 } } |
