From e915e51be2abb2895a4151620e6580c4c3c408b1 Mon Sep 17 00:00:00 2001 From: Nicolas Bourdin Date: Tue, 28 Jan 2025 13:23:54 +0100 Subject: [PATCH] feat: Manage error when one message failed --- .../mail/ui/main/folder/TwoPaneFragment.kt | 5 +- .../actions/DownloadMessagesProgressDialog.kt | 9 ++- .../actions/DownloadMessagesViewModel.kt | 60 +++++++++---------- .../utils/extensions/AttachmentExtensions.kt | 1 - 4 files changed, 34 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/folder/TwoPaneFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/main/folder/TwoPaneFragment.kt index e2d6c082c2..92d2644999 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/folder/TwoPaneFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/folder/TwoPaneFragment.kt @@ -126,10 +126,7 @@ abstract class TwoPaneFragment : Fragment() { private val resultActivityResultLauncher = registerForActivityResult(StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val fileDir: File = getEmlCacheDir(requireContext()) - - if (!fileDir.deleteRecursively()) { - // TODO: Manage error - } + fileDir.deleteRecursively() } } diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/DownloadMessagesProgressDialog.kt b/app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/DownloadMessagesProgressDialog.kt index 7bfc9c35f2..92584e2c46 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/DownloadMessagesProgressDialog.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/DownloadMessagesProgressDialog.kt @@ -22,7 +22,6 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle -import android.view.View import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.infomaniak.lib.core.utils.goToPlayStore @@ -34,7 +33,7 @@ import com.infomaniak.mail.utils.SaveOnKDriveUtils.canSaveOnKDrive class DownloadMessagesProgressDialog : DownloadProgressDialog() { private val downloadThreadsViewModel: DownloadMessagesViewModel by viewModels() - override val dialogTitle: String? by lazy { getDialogTitleFromArgs() } + override val dialogTitle: String? by lazy { getDialogName() } override fun onCreate(savedInstanceState: Bundle?) { observeDownload() @@ -42,7 +41,7 @@ class DownloadMessagesProgressDialog : DownloadProgressDialog() { } override fun download() { - downloadThreadsViewModel.downloadThreads(mainViewModel.currentMailbox.value) + downloadThreadsViewModel.downloadMessages(mainViewModel.currentMailbox.value) } private fun observeDownload() { @@ -57,11 +56,11 @@ class DownloadMessagesProgressDialog : DownloadProgressDialog() { } } - private fun getDialogTitleFromArgs(): String { + private fun getDialogName(): String { val numberOfMessagesToDownload = downloadThreadsViewModel.numberOfMessagesToDownloads() return if (numberOfMessagesToDownload == 1) { - downloadThreadsViewModel.getSubject() ?: requireContext().getString(R.string.noSubjectTitle) + downloadThreadsViewModel.getFirstMessageSubject() ?: requireContext().getString(R.string.noSubjectTitle) } else { requireContext().resources.getQuantityString( R.plurals.downloadingEmailsTitle, diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/DownloadMessagesViewModel.kt b/app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/DownloadMessagesViewModel.kt index 108864751c..94f9507ab8 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/DownloadMessagesViewModel.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/DownloadMessagesViewModel.kt @@ -73,10 +73,33 @@ class DownloadMessagesViewModel @Inject constructor( return messages } - fun downloadThreads(currentMailbox: Mailbox?) { + private fun createUniqueFileName(listFileName: HashMap, truncatedSubject: String): String { + val fileName = if (listFileName[truncatedSubject] == null) { + listFileName[truncatedSubject] = 0 + truncatedSubject + } else { + listFileName[truncatedSubject] = listFileName[truncatedSubject]!! + 1 + "$truncatedSubject (${listFileName[truncatedSubject]!! + 1})" + } + return fileName + } + + private fun saveEmlToFile(context: Context, emlByteArray: ByteArray, fileName: String): Uri? { + val fileNameWithExtension = "${fileName.removeIllegalFileNameCharacter()}.eml" + val fileDir = getEmlCacheDir(context) + + if (!fileDir.exists()) fileDir.mkdirs() + + return runCatching { + val file = File(fileDir, fileNameWithExtension) + file.outputStream().use { it.write(emlByteArray) } + return FileProvider.getUriForFile(context, context.getString(R.string.EML_AUTHORITY), file) + }.getOrNull() + } + + fun downloadMessages(currentMailbox: Mailbox?) { viewModelScope.launch(ioCoroutineContext) { val mailbox = currentMailbox ?: return@launch - val messages = getAllMessages() runCatching { coroutineScope { @@ -103,9 +126,8 @@ class DownloadMessagesViewModel @Inject constructor( deferredResponses.awaitAll().filterNotNull() } }.onSuccess { downloadedThreadUris -> - if (downloadedThreadUris.size != messages.size) { - // TODO: Manage error - } + if (downloadedThreadUris.size != numberOfMessagesToDownloads()) downloadMessagesLiveData.postValue(null) + downloadMessagesLiveData.postValue(downloadedThreadUris) }.onFailure { _ -> downloadMessagesLiveData.postValue(null) @@ -113,37 +135,13 @@ class DownloadMessagesViewModel @Inject constructor( } } - private fun createUniqueFileName(listFileName: HashMap, truncatedSubject: String): String { - val fileName = if (listFileName[truncatedSubject] == null) { - listFileName[truncatedSubject] = 0 - truncatedSubject - } else { - listFileName[truncatedSubject] = listFileName[truncatedSubject]!! + 1 - "$truncatedSubject (${listFileName[truncatedSubject]!! + 1})" - } - return fileName - } - - private fun saveEmlToFile(context: Context, emlByteArray: ByteArray, fileName: String): Uri? { - val fileNameWithExtension = "${fileName.removeIllegalFileNameCharacter()}.eml" - val fileDir = getEmlCacheDir(context) - - if (!fileDir.exists()) fileDir.mkdirs() - - return runCatching { - val file = File(fileDir, fileNameWithExtension) - file.outputStream().use { it.write(emlByteArray) } - return FileProvider.getUriForFile(context, context.getString(R.string.EML_AUTHORITY), file) - }.getOrNull() - } - - fun getSubject(): String? { + fun getFirstMessageSubject(): String? { val messages = getAllMessages() return messages.firstOrNull()?.subject } fun numberOfMessagesToDownloads(): Int { - return getAllMessages().size + return (messageLocalUids?.size ?: 0) + (threadLocalUids?.size ?: 0) } private fun String.removeIllegalFileNameCharacter(): String = this.replace(DownloadManagerUtils.regexInvalidSystemChar, "") diff --git a/app/src/main/java/com/infomaniak/mail/utils/extensions/AttachmentExtensions.kt b/app/src/main/java/com/infomaniak/mail/utils/extensions/AttachmentExtensions.kt index a85d348b6e..a484c9a087 100644 --- a/app/src/main/java/com/infomaniak/mail/utils/extensions/AttachmentExtensions.kt +++ b/app/src/main/java/com/infomaniak/mail/utils/extensions/AttachmentExtensions.kt @@ -40,7 +40,6 @@ import com.infomaniak.mail.ui.main.thread.actions.DownloadAttachmentProgressDial import com.infomaniak.mail.utils.AccountUtils import com.infomaniak.mail.utils.SaveOnKDriveUtils.DRIVE_PACKAGE import com.infomaniak.mail.utils.SaveOnKDriveUtils.SAVE_EXTERNAL_ACTIVITY_CLASS -import com.infomaniak.mail.utils.SaveOnKDriveUtils.canSaveOnKDrive import com.infomaniak.mail.utils.SentryDebug import com.infomaniak.mail.utils.WorkerUtils.UploadMissingLocalFileException import com.infomaniak.mail.utils.extensions.AttachmentExtensions.AttachmentIntentType.OPEN_WITH