diff --git a/app/src/main/java/com/infomaniak/mail/data/api/ApiRepository.kt b/app/src/main/java/com/infomaniak/mail/data/api/ApiRepository.kt index 1ae8542884..eb16ba2045 100644 --- a/app/src/main/java/com/infomaniak/mail/data/api/ApiRepository.kt +++ b/app/src/main/java/com/infomaniak/mail/data/api/ApiRepository.kt @@ -58,6 +58,7 @@ import com.infomaniak.mail.data.models.signature.SignaturesResult import com.infomaniak.mail.data.models.thread.ThreadResult import com.infomaniak.mail.ui.newMessage.AiViewModel.Shortcut import com.infomaniak.mail.utils.Utils +import com.infomaniak.mail.utils.Utils.EML_CONTENT_TYPE import io.realm.kotlin.ext.copyFromRealm import kotlinx.serialization.json.Json import okhttp3.MultipartBody @@ -451,8 +452,13 @@ object ApiRepository : ApiRepositoryCore() { return callApi(url = ApiRoutes.shareLink(mailboxUuid, folderId, mailId), method = POST) } - fun getDownloadedMessage(mailboxUuid: String, folderId: String, shortUid: Int): ApiResponse { - return ApiController.callApi(url = ApiRoutes.downloadMessage(mailboxUuid, folderId, shortUid), method = GET) + fun getDownloadedMessage(mailboxUuid: String, folderId: String, shortUid: Int): Response { + val request = Request.Builder().url(ApiRoutes.downloadMessage(mailboxUuid, folderId, shortUid)) + .headers(HttpUtils.getHeaders(EML_CONTENT_TYPE)) + .get() + .build() + + return HttpClient.okHttpClient.newCall(request).execute() } fun getMyKSuiteData(okHttpClient: OkHttpClient): ApiResponse { diff --git a/app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt b/app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt index d653146a9b..eac639afde 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt @@ -1021,7 +1021,7 @@ class MainViewModel @Inject constructor( val apiResponse = ApiRepository.getDownloadedMessage(mailbox.uuid, message.folderId, message.shortUid) - if (apiResponse.data == null || !apiResponse.isSuccess()) { + if (apiResponse.body == null || !apiResponse.isSuccessful) { reportDisplayProblemTrigger.postValue(Unit) snackbarManager.postValue(appContext.getString(RCore.string.anErrorHasOccurred)) @@ -1029,7 +1029,7 @@ class MainViewModel @Inject constructor( } val filename = UUID.randomUUID().toString() - val emlAttachment = Attachment(apiResponse.data, filename, EML_CONTENT_TYPE) + val emlAttachment = Attachment(apiResponse.body?.bytes(), filename, EML_CONTENT_TYPE) Sentry.captureMessage("Message display problem reported", SentryLevel.ERROR) { scope -> scope.addAttachment(emlAttachment) } 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 b6bae83907..3a5bf7b005 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 @@ -17,7 +17,6 @@ */ package com.infomaniak.mail.ui.main.thread.actions -import android.accounts.NetworkErrorException import android.app.Application import android.content.Context import android.net.Uri @@ -26,13 +25,11 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope -import com.infomaniak.lib.core.api.ApiController import com.infomaniak.lib.core.utils.DownloadManagerUtils import com.infomaniak.lib.core.utils.SentryLog import com.infomaniak.mail.R import com.infomaniak.mail.data.api.ApiRepository import com.infomaniak.mail.data.cache.mailboxContent.MessageController -import com.infomaniak.mail.data.cache.mailboxContent.ThreadController import com.infomaniak.mail.data.models.mailbox.Mailbox import com.infomaniak.mail.data.models.message.Message import com.infomaniak.mail.di.IoDispatcher @@ -107,13 +104,15 @@ class DownloadMessagesViewModel @Inject constructor( shortUid = message.shortUid, ) - if (apiResponse.data == null || !apiResponse.isSuccess()) throw apiResponse.error?.exception!! + if (apiResponse.body == null || !apiResponse.isSuccessful) { + throw ByteArrayNetworkException(apiResponse.body.toString(), apiResponse.code) + } val messageSubject = message.subject ?: NO_SUBJECT_FILE val truncatedSubject = messageSubject.take(MAX_FILE_NAME_LENGTH) val fileName = createUniqueFileName(listFileName, truncatedSubject) - saveEmlToFile(appContext, apiResponse.data!!, fileName) + saveEmlToFile(appContext, apiResponse.body?.bytes()!!, fileName) } } @@ -121,7 +120,7 @@ class DownloadMessagesViewModel @Inject constructor( }.onSuccess { downloadedThreadUris -> downloadMessagesLiveData.postValue(downloadedThreadUris) }.onFailure { - if (it is ApiController.ByteArrayException){ + if (it is ByteArrayNetworkException) { SentryLog.e(TAG, "Error while sharing messages to kDrive:", it) } clearEmlDir() @@ -150,5 +149,8 @@ class DownloadMessagesViewModel @Inject constructor( private const val NO_SUBJECT_FILE = "message" private const val MAX_FILE_NAME_LENGTH = 256 private val TAG = DownloadMessagesViewModel::class.simpleName.toString() + + private data class ByteArrayNetworkException(val responseBody: String, val responseCode: Int) : + Exception("Failed to get EML $responseCode: $responseBody") } }