diff --git a/Core b/Core index db5fda307..6723178e3 160000 --- a/Core +++ b/Core @@ -1 +1 @@ -Subproject commit db5fda30761a107866ae933a3b624ed3184a75f1 +Subproject commit 6723178e35e49d1a7e9462dceb821605bd1eef8e diff --git a/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt b/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt index fd388d845..d8a53b58c 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt @@ -22,7 +22,7 @@ import android.content.Context import androidx.core.app.NotificationManagerCompat import androidx.work.WorkManager import com.infomaniak.core.appintegrity.AppIntegrityManager -import com.infomaniak.core.buildUserAgent +import com.infomaniak.core.utils.buildUserAgent import com.infomaniak.swisstransfer.BuildConfig import com.infomaniak.swisstransfer.ui.MainApplication import dagger.Module diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/NewTransferActivity.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/NewTransferActivity.kt index af5c670b5..ac95a304f 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/NewTransferActivity.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/NewTransferActivity.kt @@ -27,7 +27,7 @@ import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.core.os.BundleCompat import androidx.lifecycle.lifecycleScope -import com.infomaniak.core.enumValueOfOrNull +import com.infomaniak.core.utils.enumValueOfOrNull import com.infomaniak.swisstransfer.ui.navigation.* import com.infomaniak.swisstransfer.ui.screen.newtransfer.NewTransferOpenManager import com.infomaniak.swisstransfer.ui.screen.newtransfer.NewTransferScreen diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/transfer/TransferExpiredBottomSheet.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/transfer/TransferExpiredBottomSheet.kt index 68f8b8887..d5dcc1367 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/transfer/TransferExpiredBottomSheet.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/transfer/TransferExpiredBottomSheet.kt @@ -22,8 +22,8 @@ import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter -import com.infomaniak.core.FORMAT_DATE_SIMPLE -import com.infomaniak.core.format +import com.infomaniak.core.utils.FORMAT_DATE_SIMPLE +import com.infomaniak.core.utils.format import com.infomaniak.multiplatform_swisstransfer.common.ext.toDateFromSeconds import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.TransferUi import com.infomaniak.swisstransfer.R @@ -36,6 +36,7 @@ import com.infomaniak.swisstransfer.ui.images.illus.mascotDead.MascotDead import com.infomaniak.swisstransfer.ui.previewparameter.TransferUiListPreviewParameter import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewAllWindows +import com.infomaniak.swisstransfer.ui.utils.daysBeforeExpiry @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -47,7 +48,7 @@ fun TransferExpiredBottomSheet( val transfer = expiredTransfer() ?: return - val descriptionText = if (transfer.expiresInDays < 0) { + val descriptionText = if (transfer.daysBeforeExpiry < 0) { stringResource( R.string.transferExpiredDateReachedDescription, transfer.expirationDateTimestamp.toDateFromSeconds().format(FORMAT_DATE_SIMPLE), diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/transfer/TransferItem.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/transfer/TransferItem.kt index bbcc14643..7b2f0df4b 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/transfer/TransferItem.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/transfer/TransferItem.kt @@ -25,14 +25,12 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Shape import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewParameter -import com.infomaniak.core.FORMAT_DATE_TITLE -import com.infomaniak.core.format +import com.infomaniak.core.utils.FORMAT_DATE_TITLE +import com.infomaniak.core.utils.format import com.infomaniak.multiplatform_swisstransfer.common.ext.toDateFromSeconds import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.TransferUi -import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.ui.components.TextDotText import com.infomaniak.swisstransfer.ui.images.AppImages.AppIcons import com.infomaniak.swisstransfer.ui.images.icons.ChevronRightThick @@ -44,7 +42,6 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.HumanReadableSizeUtils import com.infomaniak.swisstransfer.ui.utils.PreviewLightAndDark import com.infomaniak.swisstransfer.ui.utils.getFormattedExpiry -import com.infomaniak.swisstransfer.ui.utils.isExpired @OptIn(ExperimentalLayoutApi::class) @Composable @@ -61,11 +58,8 @@ fun TransferItem( if (transfer.files.isEmpty()) return val files = transfer.files - val (expiryText, expiryColor) = if (transfer.isExpired) { - stringResource(R.string.transferExpired) to SwissTransferTheme.materialColors.error - } else { - transfer.getFormattedExpiry() to SwissTransferTheme.colors.secondaryTextColor - } + // TODO: Also handle the "Expire demain" in red when there is no more downloads available + val (expiryText, expiryColor) = transfer.getFormattedExpiry() val border = if (isSelected()) { BorderStroke(width = Dimens.BorderWidth, color = SwissTransferTheme.colors.transferListStroke) } else { diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/previewparameter/GroupedTransfersPreviewParameterProvider.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/previewparameter/GroupedTransfersPreviewParameterProvider.kt index 68e5ba54b..f68fb566c 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/previewparameter/GroupedTransfersPreviewParameterProvider.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/previewparameter/GroupedTransfersPreviewParameterProvider.kt @@ -19,22 +19,24 @@ package com.infomaniak.swisstransfer.ui.previewparameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.TransferUi +import com.infomaniak.multiplatform_swisstransfer.common.utils.DateUtils.SECONDS_IN_A_DAY import com.infomaniak.swisstransfer.ui.screen.main.transfers.GroupedTransfers import com.infomaniak.swisstransfer.ui.screen.main.transfers.TransfersGroupingManager.groupBySection import com.infomaniak.swisstransfer.ui.screen.main.transfers.TransfersGroupingManager.toLocalDate +import kotlinx.datetime.Clock import java.util.UUID class GroupedTransfersPreviewParameterProvider : PreviewParameterProvider { - override val values: Sequence = sequenceOf(transfersPreviewData.groupBySection(today.toLocalDate())) + override val values: Sequence = sequenceOf(transfersPreviewData.groupBySection(now.toLocalDate())) } -private const val today = 1736411401L +private val now get() = Clock.System.now().epochSeconds val transfersPreviewData = listOf( TransferUi( uuid = UUID.randomUUID().toString(), - createdDateTimestamp = today - 0.5f.toLong() * 86_400L, - expirationDateTimestamp = today + 3 * 86_400L, + createdDateTimestamp = now - (0.5f * SECONDS_IN_A_DAY).toLong(), + expirationDateTimestamp = now + 3 * SECONDS_IN_A_DAY, sizeUploaded = 237_866_728L, downloadLimit = 250, downloadLeft = 123, @@ -44,8 +46,8 @@ val transfersPreviewData = listOf( ), TransferUi( uuid = UUID.randomUUID().toString(), - createdDateTimestamp = today - 0.6f.toLong() * 86_400L, - expirationDateTimestamp = today + 3 * 86_400L, + createdDateTimestamp = now - (0.6f * SECONDS_IN_A_DAY).toLong(), + expirationDateTimestamp = now + 3 * SECONDS_IN_A_DAY, sizeUploaded = 237_866_728L, downloadLimit = 250, downloadLeft = 123, @@ -55,8 +57,8 @@ val transfersPreviewData = listOf( ), TransferUi( uuid = UUID.randomUUID().toString(), - createdDateTimestamp = today - 5L * 86_400L, - expirationDateTimestamp = today + 5 * 86_400L, + createdDateTimestamp = now - 5L * SECONDS_IN_A_DAY, + expirationDateTimestamp = now + 5L * SECONDS_IN_A_DAY, sizeUploaded = 89_723_143L, downloadLimit = 20, downloadLeft = 0, @@ -66,8 +68,8 @@ val transfersPreviewData = listOf( ), TransferUi( uuid = UUID.randomUUID().toString(), - createdDateTimestamp = today - 30L * 86_400L, - expirationDateTimestamp = today - 4 * 86_400L, + createdDateTimestamp = now - 30L * SECONDS_IN_A_DAY, + expirationDateTimestamp = now - 4L * SECONDS_IN_A_DAY, sizeUploaded = 57_689_032L, downloadLimit = 1, downloadLeft = 1, diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/TransferDetailsScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/TransferDetailsScreen.kt index 5836be72d..8f788e847 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/TransferDetailsScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/TransferDetailsScreen.kt @@ -41,8 +41,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionState import com.google.accompanist.permissions.rememberPermissionState -import com.infomaniak.core.FORMAT_DATE_FULL -import com.infomaniak.core.format +import com.infomaniak.core.utils.FORMAT_DATE_FULL +import com.infomaniak.core.utils.format import com.infomaniak.multiplatform_swisstransfer.common.ext.toDateFromSeconds import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.FileUi import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.TransferUi diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/TransferDownload.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/TransferDownload.kt index bf290150d..f1782a041 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/TransferDownload.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/TransferDownload.kt @@ -25,6 +25,7 @@ import android.net.Uri import androidx.lifecycle.Lifecycle import com.infomaniak.core.* import com.infomaniak.core.filetypes.FileType +import com.infomaniak.core.utils.DownloadManagerUtils import com.infomaniak.multiplatform_swisstransfer.SharedApiUrlCreator import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.FileUi import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.TransferUi diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/components/TransferInfo.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/components/TransferInfo.kt index b22628f4c..a53bcf4e3 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/components/TransferInfo.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transferdetails/components/TransferInfo.kt @@ -46,7 +46,7 @@ import com.infomaniak.swisstransfer.ui.theme.Margin import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.HumanReadableSizeUtils import com.infomaniak.swisstransfer.ui.utils.PreviewLightAndDark -import com.infomaniak.swisstransfer.ui.utils.getFormattedExpiry +import com.infomaniak.swisstransfer.ui.utils.getWholeDate @Composable fun TransferInfo(getTransfer: () -> TransferUi) { @@ -74,7 +74,7 @@ fun TransferInfo(getTransfer: () -> TransferUi) { IconText( icon = AppIcons.Clock, - text = getTransfer().getFormattedExpiry(), + text = getTransfer().getWholeDate(), ) HorizontalDivider(modifier = Modifier.padding(vertical = Margin.Medium)) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/ImportFilesViewModel.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/ImportFilesViewModel.kt index 02c969ca1..3cc37f08e 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/ImportFilesViewModel.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/ImportFilesViewModel.kt @@ -25,8 +25,8 @@ import androidx.compose.runtime.setValue import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.infomaniak.core.isValidEmail import com.infomaniak.core.sentry.SentryLog +import com.infomaniak.core.utils.isValidEmail import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.FileUi import com.infomaniak.multiplatform_swisstransfer.common.interfaces.upload.RemoteUploadFile import com.infomaniak.multiplatform_swisstransfer.common.interfaces.upload.UploadFileSession diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/components/EmailAddressTextField.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/components/EmailAddressTextField.kt index 387090234..164630a21 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/components/EmailAddressTextField.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/components/EmailAddressTextField.kt @@ -36,7 +36,7 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.input.* import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp -import com.infomaniak.core.isValidEmail +import com.infomaniak.core.utils.isValidEmail import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.ui.components.SwissTransferInputChip import com.infomaniak.swisstransfer.ui.components.SwissTransferTextFieldDefaults diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/components/Progress.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/components/Progress.kt index 7cf11bd7e..55d92514c 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/components/Progress.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/components/Progress.kt @@ -28,7 +28,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import com.infomaniak.core.percent +import com.infomaniak.core.utils.percent import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.HumanReadableSizeUtils import com.infomaniak.swisstransfer.ui.utils.PreviewLightAndDark diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/TransferUiExt.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/TransferUiExt.kt index bf62aada2..0a35fb3c0 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/TransferUiExt.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/TransferUiExt.kt @@ -17,16 +17,82 @@ */ package com.infomaniak.swisstransfer.ui.utils +import androidx.annotation.StringRes import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource +import com.infomaniak.core.utils.* +import com.infomaniak.multiplatform_swisstransfer.common.ext.toDateFromSeconds import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.TransferUi +import com.infomaniak.multiplatform_swisstransfer.common.utils.DateUtils.SECONDS_IN_A_DAY import com.infomaniak.swisstransfer.R +import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme +import kotlinx.datetime.Clock -val TransferUi.isExpired: Boolean get() = expiresInDays < 0 || downloadLeft <= 0 +enum class ExpiryStatus(@StringRes val stringId: Int) { + EXPIRED(R.string.expiredThe), // Has expired before today + EXPIRED_TODAY(R.string.expiredAt), // Has expired today + EXPIRES_TODAY(R.string.expiresAt), // Will expire today + EXPIRES_TOMORROW(R.string.expiresTomorrow), // Will expire tomorrow + NOT_EXPIRED(R.string.expiresIn); // Will expire someday after tomorrow + + @Composable + fun getText(transfer: TransferUi): String { + val expiry = transfer.expirationDateTimestamp.toDateFromSeconds() + return when (this) { + EXPIRED -> stringResource(R.string.expiredThe, expiry.format()) + EXPIRED_TODAY -> stringResource(R.string.expiredAt, expiry.format(FORMAT_HOUR_MINUTES)) + EXPIRES_TODAY -> stringResource(R.string.expiresAt, expiry.format(FORMAT_HOUR_MINUTES)) + EXPIRES_TOMORROW -> stringResource(R.string.expiresTomorrow) + NOT_EXPIRED -> stringResource(R.string.expiresIn, transfer.daysBeforeExpiry) + } + } +} + +fun TransferUi.expiryStatus(): ExpiryStatus { + val expiry = expirationDateTimestamp.toDateFromSeconds() + val now = Clock.System.now().epochSeconds.toDateFromSeconds() + val tomorrow = now.tomorrow() + return when { + expiry.before(now.startOfTheDay()) -> ExpiryStatus.EXPIRED + expiry in now.startOfTheDay()..now -> ExpiryStatus.EXPIRED_TODAY + expiry in now..now.endOfTheDay() -> ExpiryStatus.EXPIRES_TODAY + expiry in tomorrow.startOfTheDay()..tomorrow.endOfTheDay() -> ExpiryStatus.EXPIRES_TOMORROW + else -> ExpiryStatus.NOT_EXPIRED + } +} + +val TransferUi.daysBeforeExpiry: Int + get() { + + fun Long.epochSecondsToDays(): Int = (toDateFromSeconds().startOfTheDay().time / 1_000L / SECONDS_IN_A_DAY).toInt() + + val expiry = expirationDateTimestamp.epochSecondsToDays() + val now = Clock.System.now().epochSeconds.epochSecondsToDays() + + return expiry - now + } + +val TransferUi.isExpired: Boolean + get() { + val expiry = expirationDateTimestamp.toDateFromSeconds() + val now = Clock.System.now().epochSeconds.toDateFromSeconds() + return expiry.before(now) || downloadLeft <= 0 + } + +@Composable +fun TransferUi.getFormattedExpiry(): Pair { + val text = expiryStatus().getText(transfer = this) + val color = if (isExpired) SwissTransferTheme.materialColors.error else SwissTransferTheme.colors.secondaryTextColor + return text to color +} @Composable -fun TransferUi.getFormattedExpiry(): String = when (expiresInDays) { - 0 -> stringResource(R.string.expiresToday) - 1 -> stringResource(R.string.expiresTomorrow) - else -> stringResource(R.string.expiresIn, expiresInDays) +fun TransferUi.getWholeDate(): String { + val expiry = expirationDateTimestamp.toDateFromSeconds() + return stringResource( + R.string.expiresThe, + expiry.format(), + expiry.format(FORMAT_HOUR_MINUTES), + ) } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/workers/UploadWorker.kt b/app/src/main/java/com/infomaniak/swisstransfer/workers/UploadWorker.kt index 4389ad41f..d613d750b 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/workers/UploadWorker.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/workers/UploadWorker.kt @@ -25,8 +25,8 @@ import androidx.compose.runtime.Immutable import androidx.hilt.work.HiltWorker import androidx.work.* import androidx.work.WorkInfo.State -import com.infomaniak.core.percent import com.infomaniak.core.sentry.SentryLog +import com.infomaniak.core.utils.percent import com.infomaniak.multiplatform_swisstransfer.SharedApiUrlCreator import com.infomaniak.multiplatform_swisstransfer.common.interfaces.upload.UploadSession import com.infomaniak.multiplatform_swisstransfer.managers.AppSettingsManager diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 417a64083..7c238f324 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -47,8 +47,11 @@ Ihr Gerät wird nicht als sicher erkannt Falsches Kennwort Das Passwort muss zwischen 6 und 25 Zeichen lang sein + Abgelaufen bei %s + Abgelaufen am %s + Läuft ab bei %s Verfällt in %d Tagen - Läuft heute ab + Läuft am %s um %s Läuft morgen ab %d Datei diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index e7fa3b4ac..4b4dddf30 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -47,8 +47,11 @@ Su dispositivo no es reconocido como seguro Contraseña incorrecta La contraseña debe tener entre 6 y 25 caracteres + Expirado a %s + Expirado el %s + Expira a %s Caduca en %d días - Caduca hoy + Expira el %s a las %s Expira mañana %d archivo diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 8286089c5..39b23c5e5 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -43,12 +43,15 @@ Saisis le mot de passe qui t’a été fourni pour télécharger ces fichiers. Ce transfert a expiré Ce transfert n’existe pas - Transfert téléchargé : %d/%d\u0020 + Transfert téléchargé : %d/%d Votre appareil n’est pas reconnu comme sûr Mot de passe incorrect Le mot de passe doit comporter entre 6 et 25 caractères + Expiré à %s + Expiré le %s + Expire à %s Expire dans %d jours - Expire aujourd’hui + Expire le %s à %s Expire demain %d fichier diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 46391220a..f87ce71be 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -47,8 +47,11 @@ Il dispositivo non è riconosciuto come sicuro Password errata La password deve essere compresa tra 6 e 24 caratteri + Scaduto al %s + Scaduto il %s + Scade al %s Scade tra %d giorni - Scade oggi + Scade il %s alle %s Scade domani %d file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5aec50975..a83b6d779 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -48,12 +48,15 @@ Enter the password you have been given to download these files. This transfer has expired This transfer does not exist - Downloaded transfer: %d/%d\u0020 + Downloaded transfer: %d/%d Your device is not recognized as safe Incorrect password The password must be between 6 and 25 characters + Expired at %s + Expired on %s + Expires at %s Expires in %d days - Expires today + Expires on %s at %s Expires tomorrow %d file diff --git a/app/src/test/java/com/infomaniak/swisstransfer/ExampleUnitTest.kt b/app/src/test/java/com/infomaniak/swisstransfer/ExampleUnitTest.kt deleted file mode 100644 index 6ba34e352..000000000 --- a/app/src/test/java/com/infomaniak/swisstransfer/ExampleUnitTest.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Infomaniak SwissTransfer - Android - * Copyright (C) 2024 Infomaniak Network SA - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.infomaniak.swisstransfer - -import org.junit.Assert.assertEquals -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/app/src/test/java/com/infomaniak/swisstransfer/TransferDatesUnitTest.kt b/app/src/test/java/com/infomaniak/swisstransfer/TransferDatesUnitTest.kt new file mode 100644 index 000000000..77aaccf60 --- /dev/null +++ b/app/src/test/java/com/infomaniak/swisstransfer/TransferDatesUnitTest.kt @@ -0,0 +1,57 @@ +/* + * Infomaniak SwissTransfer - Android + * Copyright (C) 2024 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.swisstransfer + +import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.TransferUi +import com.infomaniak.swisstransfer.dataset.DummyTransfer +import com.infomaniak.swisstransfer.ui.utils.ExpiryStatus +import com.infomaniak.swisstransfer.ui.utils.daysBeforeExpiry +import com.infomaniak.swisstransfer.ui.utils.expiryStatus +import com.infomaniak.swisstransfer.ui.utils.isExpired +import org.junit.Test + +class TransferDatesUnitTest { + + @Test + fun check_expiryStatus_are_correct() { + assert(TransferUi(DummyTransfer.expired).expiryStatus() == ExpiryStatus.EXPIRED) + assert(TransferUi(DummyTransfer.expiredToday).expiryStatus() == ExpiryStatus.EXPIRED_TODAY) + assert(TransferUi(DummyTransfer.expiresToday).expiryStatus() == ExpiryStatus.EXPIRES_TODAY) + assert(TransferUi(DummyTransfer.expiresTomorrow).expiryStatus() == ExpiryStatus.EXPIRES_TOMORROW) + assert(TransferUi(DummyTransfer.notExpired).expiryStatus() == ExpiryStatus.NOT_EXPIRED) + } + + @Test + fun check_daysBeforeExpiry_are_correct() { + assert(TransferUi(DummyTransfer.expired).daysBeforeExpiry == -5) + assert(TransferUi(DummyTransfer.expiredToday).daysBeforeExpiry == 0) + assert(TransferUi(DummyTransfer.expiresToday).daysBeforeExpiry == 0) + assert(TransferUi(DummyTransfer.expiresTomorrow).daysBeforeExpiry == 1) + assert(TransferUi(DummyTransfer.notExpired).daysBeforeExpiry == 5) + } + + @Test + fun check_isExpired_are_correct() { + assert(TransferUi(DummyTransfer.expired).isExpired) + assert(TransferUi(DummyTransfer.expiredToday).isExpired) + assert(TransferUi(DummyTransfer.expiresToday).isExpired.not()) + assert(TransferUi(DummyTransfer.expiresTomorrow).isExpired.not()) + assert(TransferUi(DummyTransfer.notExpired).isExpired.not()) + assert(TransferUi(DummyTransfer.downloaded).isExpired) + } +} diff --git a/app/src/test/java/com/infomaniak/swisstransfer/dataset/DummyTransfer.kt b/app/src/test/java/com/infomaniak/swisstransfer/dataset/DummyTransfer.kt new file mode 100644 index 000000000..61fa42530 --- /dev/null +++ b/app/src/test/java/com/infomaniak/swisstransfer/dataset/DummyTransfer.kt @@ -0,0 +1,169 @@ +/* + * Infomaniak SwissTransfer - Android + * Copyright (C) 2025 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.swisstransfer.dataset + +import com.infomaniak.core.endOfTheDay +import com.infomaniak.core.startOfTheDay +import com.infomaniak.core.tomorrow +import com.infomaniak.multiplatform_swisstransfer.common.ext.toDateFromSeconds +import com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.Container +import com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.File +import com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.Transfer +import com.infomaniak.multiplatform_swisstransfer.common.models.TransferStatus +import com.infomaniak.multiplatform_swisstransfer.common.utils.DateUtils.SECONDS_IN_A_DAY +import kotlinx.datetime.Clock +import kotlin.time.Duration.Companion.days +import kotlin.time.Duration.Companion.hours + +object DummyTransfer { + + private val nowSeconds get() = Clock.System.now().epochSeconds + private val nowDate = nowSeconds.toDateFromSeconds() + + private val container1 = object : Container { + override var uuid: String = "transfer1Container" + override var duration: Long = 0L + override var createdDateTimestamp: Long = 0L + override var expiredDateTimestamp: Long = 0L + override var numberOfFiles: Int = 0 + override var message: String? = null + override var needPassword: Boolean = false + override var language: String = "language" + override var sizeUploaded: Long = 0L + override var deletedDateTimestamp: Long? = null + override var swiftVersion: Int = 0 + override var downloadLimit: Int = 20 + override var source: String = "source" + override var files: List = listOf( + createDummyFile(containerUUID = uuid, fileName = "cat no no.gif", mimeType = "image/gif"), + createDummyFile(containerUUID = uuid, fileName = "cat vibe.gif", mimeType = "image/gif"), + ) + } + + val container2 = object : Container by container1 { + override val uuid: String = "transfer2container" + } + + val container3 = object : Container by container1 { + override val uuid: String = "transfer3container" + } + + val container4 = object : Container by container1 { + override val uuid: String = "transfer4container" + } + + val container5 = object : Container by container1 { + override val uuid: String = "transfer5container" + } + + val container6 = object : Container by container1 { + override val uuid: String = "transfer6container" + } + + val transfer1 = object : Transfer { + override var linkUUID: String = "transferLinkUUID1" + override var containerUUID: String = "containerUUID" + override var downloadCounterCredit: Int = 12 + override var createdDateTimestamp: Long = 0L + override var expiredDateTimestamp: Long = nowSeconds - 5L * SECONDS_IN_A_DAY + override var hasBeenDownloadedOneTime: Boolean = false + override var isMailSent: Boolean = true + override var downloadHost: String = "url" + override var container: Container = this@DummyTransfer.container1 + override val transferStatus: TransferStatus = TransferStatus.READY + } + + val transfer2 = object : Transfer by transfer1 { + override val linkUUID: String = "transfer2" + override val containerUUID: String = "container2" + override var expiredDateTimestamp: Long = nowDate.startOfTheDay().time / 1_000L + override val container: Container = container2 + override val transferStatus: TransferStatus = TransferStatus.WAIT_VIRUS_CHECK + } + + val transfer3 = object : Transfer by transfer1 { + override val linkUUID: String = "transfer3" + override val containerUUID: String = "container3" + override var expiredDateTimestamp: Long = nowDate.endOfTheDay().time / 1_000L + override val container: Container = container3 + override val transferStatus: TransferStatus = TransferStatus.WAIT_VIRUS_CHECK + } + + val transfer4 = object : Transfer by transfer1 { + override val linkUUID: String = "transfer4" + override val containerUUID: String = "container4" + override var expiredDateTimestamp: Long = nowDate.tomorrow().startOfTheDay().time / 1_000L + override val container: Container = container4 + override val transferStatus: TransferStatus = TransferStatus.WAIT_VIRUS_CHECK + } + + val transfer5 = object : Transfer by transfer1 { + override val linkUUID: String = "transfer5" + override val containerUUID: String = "container5" + override var expiredDateTimestamp: Long = nowSeconds + 5L * SECONDS_IN_A_DAY + override val container: Container = container5 + override val transferStatus: TransferStatus = TransferStatus.WAIT_VIRUS_CHECK + } + + val transfer6 = object : Transfer by transfer1 { + override val linkUUID: String = "transfer6" + override val containerUUID: String = "container6" + override var downloadCounterCredit: Int = 0 + override var expiredDateTimestamp: Long = nowSeconds + 10L * SECONDS_IN_A_DAY + override val container: Container = container6 + override val transferStatus: TransferStatus = TransferStatus.WAIT_VIRUS_CHECK + } + + val expired: Transfer + val expiredToday: Transfer + val expiresToday: Transfer + val expiresTomorrow: Transfer + val notExpired: Transfer + val downloaded: Transfer + + init { + expired = transfer1 + expiredToday = transfer2 + expiresToday = transfer3 + expiresTomorrow = transfer4 + notExpired = transfer5 + downloaded = transfer6 + } + + val transfers = listOf(transfer1, transfer2, transfer3, transfer4, transfer5, transfer6) + + private fun createDummyFile( + containerUUID: String, + fileName: String, + mimeType: String? = null, + ): File = object : File { + override val containerUUID: String = containerUUID + override val uuid: String = "$fileName|whatever" + override val fileName: String = fileName + override val fileSizeInBytes: Long = 10_000_000L + override val downloadCounter: Int = 0 + override val createdDateTimestamp: Long = (Clock.System.now() - 1.hours).epochSeconds + override val expiredDateTimestamp: Long = (Clock.System.now() + 7.days).epochSeconds + override val eVirus: String = "" + override val deletedDate: String? = null + override val mimeType: String? = mimeType + override val receivedSizeInBytes: Long = fileSizeInBytes + override val path: String? = null + override val thumbnailPath: String? = null + } +}