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 7c815acef..c7afbf606 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 @@ -93,7 +93,7 @@ fun TransferItem( Column(modifier = Modifier.weight(1.0f)) { Text( - text = createdDate, + text = transfer.title ?: createdDate, style = SwissTransferTheme.typography.bodyMedium, color = SwissTransferTheme.colors.primaryTextColor, maxLines = 1, 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 13c5cc523..b78c834f3 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 @@ -43,6 +43,7 @@ val transfersPreviewData = listOf( sizeUploaded = 237_866_728L, downloadLimit = 250, downloadLeft = 123, + title = "Transfer title", message = "3ème transfert. RAS.", password = "my password", files = filesPreviewData, @@ -56,6 +57,7 @@ val transfersPreviewData = listOf( sizeUploaded = 237_866_728L, downloadLimit = 250, downloadLeft = 123, + title = null, message = null, password = "my password", files = filesPreviewData, @@ -69,6 +71,7 @@ val transfersPreviewData = listOf( sizeUploaded = 89_723_143L, downloadLimit = 20, downloadLeft = 0, + title = null, message = null, password = null, files = filesPreviewData, @@ -82,6 +85,7 @@ val transfersPreviewData = listOf( sizeUploaded = 57_689_032L, downloadLimit = 1, downloadLeft = 1, + title = null, message = "Coucou c'est moi le message de description du transfert.", password = "password", files = filesPreviewData, 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 3d87a10c4..79ad8af95 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 @@ -245,10 +245,12 @@ private fun TransferDetailsScreen( } } + val title = getTransfer().title ?: getTransfer().createdDateTimestamp.toDateFromSeconds().format(FORMAT_DATE_FULL) + SwissTransferScaffold( topBar = { SwissTransferTopAppBar( - title = getTransfer().createdDateTimestamp.toDateFromSeconds().format(FORMAT_DATE_FULL), + title = title, navigationIcon = { if (windowAdaptiveInfo.isWindowSmall()) TopAppBarButtons.Back(onClick = navigateBack ?: {}) }, actions = { when (direction) { diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt index 8250e99a1..dd84b8a1c 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt @@ -38,6 +38,7 @@ import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue @@ -56,13 +57,14 @@ 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.common.mapSync import com.infomaniak.core.ui.compose.bottomstickybuttonscaffolds.BottomStickyButtonScaffold import com.infomaniak.core.ui.compose.margin.Margin import com.infomaniak.core.ui.compose.preview.PreviewAllWindows -import com.infomaniak.core.common.mapSync import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.FileUi import com.infomaniak.multiplatform_swisstransfer.common.matomo.MatomoScreen import com.infomaniak.swisstransfer.R +import com.infomaniak.swisstransfer.ui.LocalUser import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer import com.infomaniak.swisstransfer.ui.components.ButtonType import com.infomaniak.swisstransfer.ui.components.LargeButton @@ -84,6 +86,7 @@ import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.components.T import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.components.TransferTypeUi import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.GetSetCallbacks +import com.infomaniak.swisstransfer.ui.utils.isApiV2 import com.infomaniak.swisstransfer.upload.UploadForegroundService import kotlinx.coroutines.channels.ReceiveChannel import kotlinx.coroutines.channels.consumeEach @@ -178,6 +181,7 @@ fun PickFilesScreen( PickFilesScreen( files = { files }, canSendStatus = { canSendStatus }, + transferTitleState = pickFilesViewModel.transferTitleState, emailTextFieldCallbacks = emailTextFieldCallbacks, transferMessageCallbacks = pickFilesViewModel.transferMessageCallbacks, selectedTransferType = GetSetCallbacks( @@ -213,6 +217,7 @@ private fun HandleStartupFilePick(openFilePickerEvent: ReceiveChannel, pic private fun PickFilesScreen( files: () -> List, canSendStatus: () -> CanSendStatus, + transferTitleState: MutableState, emailTextFieldCallbacks: EmailTextFieldCallbacks, transferMessageCallbacks: GetSetCallbacks, selectedTransferType: GetSetCallbacks, @@ -251,6 +256,7 @@ private fun PickFilesScreen( Spacer(Modifier.height(Margin.Medium)) ImportTextFields( horizontalPaddingModifier = modifier, + transferTitleState = transferTitleState, emailTextFieldCallbacks = emailTextFieldCallbacks, transferMessageCallbacks = transferMessageCallbacks, shouldShowEmailAddressesFields = { shouldShowEmailAddressesFields }, @@ -283,11 +289,21 @@ private fun FilesToImport( @Composable private fun ColumnScope.ImportTextFields( horizontalPaddingModifier: Modifier, + transferTitleState: MutableState, emailTextFieldCallbacks: EmailTextFieldCallbacks, transferMessageCallbacks: GetSetCallbacks, shouldShowEmailAddressesFields: () -> Boolean, ) { val modifier = horizontalPaddingModifier.fillMaxWidth() + if (LocalUser.current.isApiV2()) { + SwissTransferTextField( + modifier = modifier, + label = stringResource(R.string.transferTitlePlaceholder), + isRequired = false, + maxLineNumber = 1, + onValueChange = { transferTitleState.value = it } + ) + } EmailAddressesTextFields(modifier, emailTextFieldCallbacks, shouldShowEmailAddressesFields) SwissTransferTextField( modifier = modifier, @@ -318,6 +334,7 @@ private fun ColumnScope.EmailAddressesTextFields( maxLineNumber = 1, imeAction = ImeAction.Next, isError = isAuthorError, + isReadOnly = LocalUser.current.isApiV2(), supportingText = getEmailError(isAuthorError), onValueChange = transferAuthorEmail.set, ) @@ -511,6 +528,7 @@ private fun Preview(@PreviewParameter(FileUiListPreviewParameter::class) files: PickFilesScreen( files = { files }, canSendStatus = { CanSendStatus.Yes }, + transferTitleState = remember { mutableStateOf("") }, emailTextFieldCallbacks = emailTextFieldCallbacks, transferMessageCallbacks = GetSetCallbacks(get = { "" }, set = {}), selectedTransferType = GetSetCallbacks(get = { TransferTypeUi.Mail }, set = {}), diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesViewModel.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesViewModel.kt index bd398962a..1256171f3 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesViewModel.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesViewModel.kt @@ -54,6 +54,7 @@ import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.PickFilesVie import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.PickFilesViewModel.CanSendStatus.Issue import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.components.TransferTypeUi import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.components.TransferTypeUi.Companion.toTransferTypeUi +import com.infomaniak.swisstransfer.ui.utils.AccountUtils import com.infomaniak.swisstransfer.ui.utils.GetSetCallbacks import com.infomaniak.swisstransfer.upload.NewTransferParams import com.infomaniak.swisstransfer.upload.UploadForegroundService @@ -66,8 +67,10 @@ import kotlinx.coroutines.channels.ReceiveChannel import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import splitties.coroutines.repeatWhileActive @@ -76,6 +79,7 @@ import javax.inject.Inject @HiltViewModel class PickFilesViewModel @Inject constructor( + private val accountUtils: AccountUtils, private val appSettingsManager: AppSettingsManager, private val newTransferOpenManager: NewTransferOpenManager, private val savedStateHandle: SavedStateHandle, @@ -147,7 +151,7 @@ class PickFilesViewModel @Inject constructor( private var validatedRecipientsEmails by mutableStateOf>(emptySet()) //endregion - //region Transfer title TODO[ST-v2]: Add title text input for users connected via v2 API. + //region Transfer title val transferTitleState = mutableStateOf("") private var transferTitle by transferTitleState //endregion @@ -193,6 +197,11 @@ class PickFilesViewModel @Inject constructor( initialValue = emptyList(), ) + viewModelScope.launch { + accountUtils.currentUserFlow.mapNotNull { it?.email }.distinctUntilChanged().collect { userEmail -> + transferAuthorEmail = userEmail + } + } viewModelScope.launch { handleSessionStart() } viewModelScope.launch(ioDispatcher) { if (isFirstViewModelCreation) { diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/UserExt.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/UserExt.kt new file mode 100644 index 000000000..f866f666c --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/UserExt.kt @@ -0,0 +1,22 @@ +/* + * Infomaniak SwissTransfer - Android + * Copyright (C) 2026 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.ui.utils + +import com.infomaniak.core.auth.models.user.User + +fun User?.isApiV2() = this != null diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index ce06fa621..b6f960d1c 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -185,6 +185,7 @@ %s tilbage %s tilbage + Giv din overførsel en titel E-mail Link QR-kode diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 762da0c74..df5684410 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -185,6 +185,7 @@ %s übrig %s übrig + Gib deinem Transfer einen Titel E-Mail Link QR Code diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 6d04f54d0..295ef3fcc 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -185,6 +185,7 @@ %s απομένει %s απομένουν + Δώσε έναν τίτλο στη μεταφορά σου Email Σύνδεσμος Κωδικός QR diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index e3fdeb013..edc0c9b6b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -185,6 +185,7 @@ Queda %s Quedan %s + Pon un título a tu transferencia Correo electrónico Enlace QR Code diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 049e6182f..9609b95d2 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -185,6 +185,7 @@ %s jäljellä %s jäljellä + Anna siirrollesi otsikko Sähköposti Linkki QR-koodi diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 581364eb5..12b31c0dc 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -185,6 +185,7 @@ %s restant %s restants + Donne un titre à ton transfert E-mail Lien QR Code diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7a8734d43..08a583d11 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -185,6 +185,7 @@ %s rimasto %s rimasti + Dai un titolo al tuo trasferimento Email Link QR Code diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index edd2c8e60..446d4fed3 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -185,6 +185,7 @@ %s igjen %s igjen + Gi overføringen din en tittel E-post Lenke QR-kode diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 711bd2fba..13db06fbe 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -185,6 +185,7 @@ %s over %s over + Geef je transfer een titel E-mail Link QR-code diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ac8017f0d..35e047b3f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -195,6 +195,7 @@ %s pozostało %s pozostało + Nadaj tytuł swojemu transferowi E-mail Link Kod QR diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e5e8d6671..686735ca7 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -185,6 +185,7 @@ %s restante %s restantes + Dê um título à sua transferência E-mail Ligação Código QR diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9728e80fe..8a98e2f50 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -185,6 +185,7 @@ %s kvar %s kvar + Ge din överföring en titel E-post Länk QR-kod diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 291fe2810..e218287fa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -190,6 +190,7 @@ %s left %s left + Give a title to your transfer Email Link QR Code