Skip to content

Commit 5ba686d

Browse files
committed
Merge branch 'remove-jodatime-droid-898'
2 parents 5025db7 + 38c4791 commit 5ba686d

File tree

64 files changed

+244
-233
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+244
-233
lines changed

android/app/build.gradle.kts

-1
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,6 @@ dependencies {
399399
implementation(libs.compose.destinations)
400400
ksp(libs.compose.destinations.ksp)
401401

402-
implementation(libs.jodatime)
403402
implementation(libs.kermit)
404403
implementation(libs.koin)
405404
implementation(libs.koin.android)

android/app/proguard-rules.pro

-6
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@
1313
-keep class java.net.InetSocketAddress { *; }
1414
-keep class java.util.ArrayList { *; }
1515

16-
# Joda Time
17-
-dontwarn org.joda.convert.**
18-
-dontwarn org.joda.time.**
19-
-keep class org.joda.time.** { *; }
20-
-keep interface org.joda.time.** { *; }
21-
2216
# grpc
2317
-keep class io.grpc.okhttp.OkHttpChannelBuilder { *; }
2418
-keep class mullvad_daemon.management_interface.** { *; }

android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreenTest.kt

+11-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import io.mockk.every
1010
import io.mockk.mockk
1111
import io.mockk.unmockkAll
1212
import io.mockk.verify
13+
import java.time.Duration
14+
import java.time.Instant
15+
import java.time.ZonedDateTime
1316
import net.mullvad.mullvadvpn.compose.createEdgeToEdgeComposeExtension
1417
import net.mullvad.mullvadvpn.compose.setContentWithTheme
1518
import net.mullvad.mullvadvpn.compose.state.ConnectUiState
@@ -30,8 +33,6 @@ import net.mullvad.mullvadvpn.lib.model.TunnelEndpoint
3033
import net.mullvad.mullvadvpn.lib.model.TunnelState
3134
import net.mullvad.mullvadvpn.repository.InAppNotification
3235
import net.mullvad.mullvadvpn.ui.VersionInfo
33-
import org.joda.time.DateTime
34-
import org.joda.time.Duration
3536
import org.junit.jupiter.api.AfterEach
3637
import org.junit.jupiter.api.BeforeEach
3738
import org.junit.jupiter.api.Test
@@ -556,7 +557,7 @@ class ConnectScreenTest {
556557
fun testAccountExpiredNotification() {
557558
composeExtension.use {
558559
// Arrange
559-
val expiryDate = DateTime(2020, 11, 11, 10, 10)
560+
val expiryDate = ZonedDateTime.parse("2020-11-11T10:10Z")
560561
initScreen(
561562
state =
562563
ConnectUiState(
@@ -567,7 +568,9 @@ class ConnectScreenTest {
567568
deviceName = "",
568569
daysLeftUntilExpiry = null,
569570
inAppNotification =
570-
InAppNotification.AccountExpiry(Duration(DateTime.now(), expiryDate)),
571+
InAppNotification.AccountExpiry(
572+
Duration.between(Instant.now(), expiryDate)
573+
),
571574
isPlayBuild = false,
572575
)
573576
)
@@ -612,7 +615,7 @@ class ConnectScreenTest {
612615
composeExtension.use {
613616
// Arrange
614617
val mockedClickHandler: () -> Unit = mockk(relaxed = true)
615-
val expiryDate = DateTime(2020, 11, 11, 10, 10)
618+
val expiryDate = ZonedDateTime.parse("2020-11-11T10:10Z")
616619
initScreen(
617620
onManageAccountClick = mockedClickHandler,
618621
state =
@@ -624,7 +627,9 @@ class ConnectScreenTest {
624627
deviceName = "",
625628
daysLeftUntilExpiry = null,
626629
inAppNotification =
627-
InAppNotification.AccountExpiry(Duration(DateTime.now(), expiryDate)),
630+
InAppNotification.AccountExpiry(
631+
Duration.between(Instant.now(), expiryDate)
632+
),
628633
isPlayBuild = false,
629634
),
630635
)

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/Scaffolding.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ fun ScaffoldWithTopBarAndDeviceName(
7878
isIconAndLogoVisible: Boolean = true,
7979
snackbarHostState: SnackbarHostState = remember { SnackbarHostState() },
8080
deviceName: String?,
81-
timeLeft: Int?,
81+
timeLeft: Long?,
8282
content: @Composable (PaddingValues) -> Unit,
8383
) {
8484
Scaffold(

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/TopBar.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ fun MullvadTopBarWithDeviceName(
332332
iconTintColor: Color,
333333
isIconAndLogoVisible: Boolean = true,
334334
deviceName: String?,
335-
daysLeftUntilExpiry: Int?,
335+
daysLeftUntilExpiry: Long?,
336336
) {
337337
Column {
338338
MullvadTopBar(
@@ -383,8 +383,8 @@ fun MullvadTopBarWithDeviceName(
383383
if (daysLeftUntilExpiry >= 0) {
384384
pluralStringResource(
385385
id = R.plurals.days,
386-
daysLeftUntilExpiry,
387-
daysLeftUntilExpiry,
386+
daysLeftUntilExpiry.toInt(),
387+
daysLeftUntilExpiry.toInt(),
388388
)
389389
} else {
390390
stringResource(id = R.string.out_of_time)

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/notificationbanner/NotificationBanner.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import androidx.compose.ui.tooling.preview.Preview
3030
import androidx.compose.ui.unit.dp
3131
import androidx.constraintlayout.compose.ConstraintLayout
3232
import androidx.constraintlayout.compose.Dimension
33+
import java.time.Duration
3334
import net.mullvad.mullvadvpn.compose.component.MullvadTopBar
3435
import net.mullvad.mullvadvpn.compose.test.NOTIFICATION_BANNER
3536
import net.mullvad.mullvadvpn.compose.test.NOTIFICATION_BANNER_ACTION
@@ -43,7 +44,6 @@ import net.mullvad.mullvadvpn.lib.theme.color.warning
4344
import net.mullvad.mullvadvpn.repository.InAppNotification
4445
import net.mullvad.mullvadvpn.ui.VersionInfo
4546
import net.mullvad.mullvadvpn.ui.notification.StatusLevel
46-
import org.joda.time.Duration
4747

4848
@Preview
4949
@Composable

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import com.ramcosta.composedestinations.annotation.Destination
2929
import com.ramcosta.composedestinations.annotation.RootGraph
3030
import com.ramcosta.composedestinations.result.ResultBackNavigator
3131
import com.ramcosta.composedestinations.spec.DestinationStyle
32+
import java.util.concurrent.TimeUnit
3233
import net.mullvad.mullvadvpn.BuildConfig
3334
import net.mullvad.mullvadvpn.R
3435
import net.mullvad.mullvadvpn.compose.button.PrimaryButton
@@ -46,7 +47,6 @@ import net.mullvad.mullvadvpn.lib.model.RedeemVoucherError
4647
import net.mullvad.mullvadvpn.lib.theme.AppTheme
4748
import net.mullvad.mullvadvpn.lib.theme.Dimens
4849
import net.mullvad.mullvadvpn.viewmodel.VoucherDialogViewModel
49-
import org.joda.time.DateTimeConstants
5050
import org.koin.androidx.compose.koinViewModel
5151

5252
@Preview(device = Devices.TV_720p)
@@ -157,9 +157,10 @@ fun RedeemVoucherDialog(
157157
modifier = Modifier.fillMaxWidth(),
158158
horizontalAlignment = Alignment.CenterHorizontally,
159159
) {
160+
TimeUnit.DAYS.toSeconds(1)
160161
if (state.voucherState is VoucherDialogState.Success) {
161162
val days: Int =
162-
(state.voucherState.addedTime / DateTimeConstants.SECONDS_PER_DAY).toInt()
163+
(state.voucherState.addedTime / TimeUnit.DAYS.toSeconds(1)).toInt()
163164
val message =
164165
stringResource(
165166
R.string.added_to_your_account,

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/ResourcesExtensions.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package net.mullvad.mullvadvpn.compose.extensions
22

33
import android.content.res.Resources
4+
import java.time.Duration
45
import net.mullvad.mullvadvpn.R
5-
import org.joda.time.Duration
66

77
private const val DAYS_IN_STANDARD_YEAR = 365
88

99
fun Resources.getExpiryQuantityString(accountExpiry: Duration): String {
10-
val days = accountExpiry.standardDays.toInt()
11-
val years = (accountExpiry.standardDays / DAYS_IN_STANDARD_YEAR).toInt()
10+
val days = accountExpiry.toDays().toInt()
11+
val years = (accountExpiry.toDays() / DAYS_IN_STANDARD_YEAR).toInt()
1212

13-
return if (accountExpiry.millis <= 0) {
13+
return if (accountExpiry.toMillis() <= 0) {
1414
getString(R.string.out_of_time)
1515
} else if (years > 1) {
1616
getRemainingText(this, R.plurals.years_left, years)

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/AccountUiStatePreviewParameterProvider.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
package net.mullvad.mullvadvpn.compose.preview
22

33
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
4+
import java.time.ZonedDateTime
5+
import java.time.format.DateTimeFormatter
46
import net.mullvad.mullvadvpn.compose.state.PaymentState
57
import net.mullvad.mullvadvpn.lib.model.AccountNumber
68
import net.mullvad.mullvadvpn.lib.payment.model.PaymentProduct
79
import net.mullvad.mullvadvpn.lib.payment.model.PaymentStatus
810
import net.mullvad.mullvadvpn.lib.payment.model.ProductId
911
import net.mullvad.mullvadvpn.lib.payment.model.ProductPrice
1012
import net.mullvad.mullvadvpn.viewmodel.AccountUiState
11-
import org.joda.time.DateTime
1213

1314
class AccountUiStatePreviewParameterProvider : PreviewParameterProvider<AccountUiState> {
1415
override val values =
1516
sequenceOf(
1617
AccountUiState(
1718
deviceName = "Test Name",
1819
accountNumber = AccountNumber("1234123412341234"),
19-
accountExpiry = DateTime.parse("2050-12-01"),
20+
accountExpiry =
21+
ZonedDateTime.parse(
22+
"2050-12-01T00:00:00.000Z",
23+
DateTimeFormatter.ISO_ZONED_DATE_TIME,
24+
),
2025
showSitePayment = true,
2126
billingPaymentState =
2227
PaymentState.PaymentAvailable(

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/DevicePreviewData.kt

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package net.mullvad.mullvadvpn.compose.preview
22

3+
import java.time.ZonedDateTime
4+
import java.time.format.DateTimeFormatter
35
import net.mullvad.mullvadvpn.compose.state.DeviceItemUiState
46
import net.mullvad.mullvadvpn.lib.model.Device
57
import net.mullvad.mullvadvpn.lib.model.DeviceId
6-
import org.joda.time.DateTime
78

89
internal object DevicePreviewData {
910
fun generateDevices(count: Int) =
@@ -16,10 +17,11 @@ internal object DevicePreviewData {
1617
Device(
1718
id = DeviceId.fromString(id),
1819
name = name ?: "Device $index-${id.take(DEVICE_SUFFIX_LENGTH)}",
19-
creationDate = DEVICE_CREATION_DATE.plusMonths(index),
20+
creationDate = DEVICE_CREATION_DATE.plusMonths(index.toLong()),
2021
)
2122
}
2223

2324
private const val DEVICE_SUFFIX_LENGTH = 4
2425
private const val UUID = "12345678-1234-5678-1234-567812345678"
25-
private val DEVICE_CREATION_DATE = DateTime.parse("2024-05-27")
26+
private val DEVICE_CREATION_DATE =
27+
ZonedDateTime.parse("2024-05-27T00:00+00:00", DateTimeFormatter.ISO_ZONED_DATE_TIME)

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import com.ramcosta.composedestinations.generated.destinations.VerificationPendi
3838
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
3939
import com.ramcosta.composedestinations.result.NavResult
4040
import com.ramcosta.composedestinations.result.ResultRecipient
41+
import java.time.ZonedDateTime
4142
import kotlinx.coroutines.launch
4243
import net.mullvad.mullvadvpn.R
4344
import net.mullvad.mullvadvpn.compose.button.ExternalButton
@@ -57,13 +58,12 @@ import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle
5758
import net.mullvad.mullvadvpn.compose.util.SecureScreenWhileInView
5859
import net.mullvad.mullvadvpn.compose.util.createCopyToClipboardHandle
5960
import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately
61+
import net.mullvad.mullvadvpn.lib.common.util.toExpiryDateString
6062
import net.mullvad.mullvadvpn.lib.payment.model.ProductId
6163
import net.mullvad.mullvadvpn.lib.theme.AppTheme
6264
import net.mullvad.mullvadvpn.lib.theme.Dimens
63-
import net.mullvad.mullvadvpn.util.toExpiryDateString
6465
import net.mullvad.mullvadvpn.viewmodel.AccountUiState
6566
import net.mullvad.mullvadvpn.viewmodel.AccountViewModel
66-
import org.joda.time.DateTime
6767
import org.koin.androidx.compose.koinViewModel
6868

6969
@OptIn(ExperimentalMaterial3Api::class)
@@ -256,7 +256,7 @@ private fun AccountNumberRow(accountNumber: String, onCopyAccountNumber: (String
256256
}
257257

258258
@Composable
259-
private fun PaidUntilRow(accountExpiry: DateTime?) {
259+
private fun PaidUntilRow(accountExpiry: ZonedDateTime?) {
260260
Column(modifier = Modifier.fillMaxWidth()) {
261261
Text(
262262
style = MaterialTheme.typography.labelMedium,

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import net.mullvad.mullvadvpn.compose.state.DeviceListUiState
5656
import net.mullvad.mullvadvpn.compose.transitions.DefaultTransition
5757
import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle
5858
import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately
59+
import net.mullvad.mullvadvpn.lib.common.util.formatDate
5960
import net.mullvad.mullvadvpn.lib.model.AccountNumber
6061
import net.mullvad.mullvadvpn.lib.model.Device
6162
import net.mullvad.mullvadvpn.lib.model.DeviceId
@@ -64,7 +65,6 @@ import net.mullvad.mullvadvpn.lib.theme.Dimens
6465
import net.mullvad.mullvadvpn.lib.theme.color.selected
6566
import net.mullvad.mullvadvpn.lib.theme.typeface.listItemSubText
6667
import net.mullvad.mullvadvpn.lib.theme.typeface.listItemText
67-
import net.mullvad.mullvadvpn.util.formatDate
6868
import net.mullvad.mullvadvpn.viewmodel.DeviceListSideEffect
6969
import net.mullvad.mullvadvpn.viewmodel.DeviceListViewModel
7070
import org.koin.androidx.compose.koinViewModel

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/ConnectUiState.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ data class ConnectUiState(
1111
val showLocation: Boolean,
1212
val inAppNotification: InAppNotification?,
1313
val deviceName: String?,
14-
val daysLeftUntilExpiry: Int?,
14+
val daysLeftUntilExpiry: Long?,
1515
val isPlayBuild: Boolean,
1616
) {
1717

android/app/src/main/kotlin/net/mullvad/mullvadvpn/provider/MullvadFileProvider.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import android.content.Intent
55
import android.net.Uri
66
import androidx.core.content.FileProvider
77
import java.io.File
8+
import java.time.ZonedDateTime
9+
import java.time.format.DateTimeFormatter
810
import net.mullvad.mullvadvpn.R
9-
import org.joda.time.DateTime
10-
import org.joda.time.format.ISODateTimeFormat
1111

1212
// https://developer.android.com/reference/androidx/core/content/FileProvider
1313
// 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)
5151
}
5252

5353
fun createShareLogFileName(): String {
54-
val datetime = ISODateTimeFormat.basicOrdinalDateTimeNoMillis().print(DateTime.now())
54+
val datetime = DateTimeFormatter.ofPattern("yyyyDDD'T'HHmmssZ").format(ZonedDateTime.now())
5555
return "mullvad_log-${datetime}.txt"
5656
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/InAppNotificationController.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.mullvad.mullvadvpn.repository
22

3+
import java.time.Duration
34
import kotlinx.coroutines.CoroutineScope
45
import kotlinx.coroutines.flow.SharingStarted
56
import kotlinx.coroutines.flow.combine
@@ -12,7 +13,6 @@ import net.mullvad.mullvadvpn.usecase.NewChangelogNotificationUseCase
1213
import net.mullvad.mullvadvpn.usecase.NewDeviceNotificationUseCase
1314
import net.mullvad.mullvadvpn.usecase.TunnelStateNotificationUseCase
1415
import net.mullvad.mullvadvpn.usecase.VersionNotificationUseCase
15-
import org.joda.time.Duration
1616

1717
enum class StatusLevel {
1818
Error,

android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCase.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ import kotlinx.coroutines.flow.flowOf
1414
import kotlinx.coroutines.flow.map
1515
import kotlinx.coroutines.flow.onStart
1616
import kotlinx.coroutines.flow.stateIn
17+
import net.mullvad.mullvadvpn.lib.common.util.millisFromNow
1718
import net.mullvad.mullvadvpn.lib.model.ErrorStateCause
1819
import net.mullvad.mullvadvpn.lib.model.TunnelState
1920
import net.mullvad.mullvadvpn.lib.shared.AccountRepository
2021
import net.mullvad.mullvadvpn.lib.shared.ConnectionProxy
21-
import org.joda.time.DateTime
2222

2323
class OutOfTimeUseCase(
2424
private val connectionProxy: ConnectionProxy,
@@ -60,7 +60,7 @@ class OutOfTimeUseCase(
6060
.flatMapLatest {
6161
if (it != null) {
6262
flow {
63-
val millisUntilExpiry = it.expiryDate.millis - DateTime.now().millis
63+
val millisUntilExpiry = it.expiryDate.millisFromNow()
6464
if (millisUntilExpiry > 0) {
6565
emit(false)
6666
delay(millisUntilExpiry)

android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/DateExtensions.kt

-15
This file was deleted.

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.viewmodel
33
import android.app.Activity
44
import androidx.lifecycle.ViewModel
55
import androidx.lifecycle.viewModelScope
6+
import java.time.ZonedDateTime
67
import kotlinx.coroutines.channels.Channel
78
import kotlinx.coroutines.flow.Flow
89
import kotlinx.coroutines.flow.MutableStateFlow
@@ -27,7 +28,6 @@ import net.mullvad.mullvadvpn.lib.shared.DeviceRepository
2728
import net.mullvad.mullvadvpn.usecase.PaymentUseCase
2829
import net.mullvad.mullvadvpn.util.isSuccess
2930
import net.mullvad.mullvadvpn.util.toPaymentState
30-
import org.joda.time.DateTime
3131

3232
class AccountViewModel(
3333
private val accountRepository: AccountRepository,
@@ -155,7 +155,7 @@ class AccountViewModel(
155155
data class AccountUiState(
156156
val deviceName: String?,
157157
val accountNumber: AccountNumber?,
158-
val accountExpiry: DateTime?,
158+
val accountExpiry: ZonedDateTime?,
159159
val showSitePayment: Boolean,
160160
val billingPaymentState: PaymentState? = null,
161161
val showLogoutLoading: Boolean = false,

0 commit comments

Comments
 (0)