mirror of
https://github.com/ProtonMail/android-mail.git
synced 2026-06-14 09:54:47 +00:00
Bump Rust to 0.160.5
NOJIRA
This commit is contained in:
committed by
Stefanija Boshkovska
parent
77ba8a317e
commit
c3a5dd7046
@@ -68,7 +68,7 @@ material = "1.13.0"
|
||||
mockk = "1.14.6"
|
||||
paparazzi = "1.3.5"
|
||||
proton-core = "34.1.0"
|
||||
proton-rust-core = "0.160.4"
|
||||
proton-rust-core = "0.160.5"
|
||||
robolectric = "4.15.1" # 4.16.0 requires Java 21
|
||||
kotlinpoet-ksp = "2.2.0"
|
||||
leakcanary = "2.14"
|
||||
|
||||
+2
-2
@@ -135,7 +135,7 @@ class RustConversationDetailQueryImpl @Inject constructor(
|
||||
conversationWithMessagesMutableFlow.value = conversationEither.map {
|
||||
LocalConversationWithMessages(
|
||||
conversation = it.conversation,
|
||||
messages = LocalConversationMessages(it.messageIdToOpen, it.messages)
|
||||
messages = LocalConversationMessages(it.focusedMessageId, it.messages)
|
||||
)
|
||||
}
|
||||
currentConversationId = conversationId
|
||||
@@ -175,7 +175,7 @@ class RustConversationDetailQueryImpl @Inject constructor(
|
||||
conversationWithMessagesMutableFlow.value = conversationEither.map {
|
||||
LocalConversationWithMessages(
|
||||
conversation = it.conversation,
|
||||
messages = LocalConversationMessages(it.messageIdToOpen, it.messages)
|
||||
messages = LocalConversationMessages(it.focusedMessageId, it.messages)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+2
-5
@@ -19,9 +19,7 @@
|
||||
package ch.protonmail.android.mailconversation.data.mapper
|
||||
|
||||
import arrow.core.Either
|
||||
import arrow.core.left
|
||||
import arrow.core.right
|
||||
import arrow.core.toNonEmptyListOrNull
|
||||
import ch.protonmail.android.mailattachments.data.mapper.getCalendarAttachmentCount
|
||||
import ch.protonmail.android.mailattachments.data.mapper.toAttachmentMetadata
|
||||
import ch.protonmail.android.mailattachments.domain.model.AttachmentCount
|
||||
@@ -75,12 +73,11 @@ private fun LocalConversationId.toConversationId(): ConversationId = Conversatio
|
||||
|
||||
fun LocalConversationMessages.toConversationMessagesWithMessageToOpen():
|
||||
Either<ConversationError, ConversationMessages> {
|
||||
val messages = messages.toNonEmptyListOrNull()?.map { it.toMessage() }
|
||||
?: return ConversationError.ConvoWithNoMessages.left()
|
||||
val messages = messages.toList().map { it.toMessage() }
|
||||
|
||||
return ConversationMessages(
|
||||
messages = messages,
|
||||
messageIdToOpen = messageIdToOpen.toMessageId()
|
||||
messageIdToOpen = messageIdToOpen?.toMessageId()
|
||||
).right()
|
||||
}
|
||||
|
||||
|
||||
+22
-22
@@ -87,7 +87,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
val watcherMock = mockk<WatchedConversation> {
|
||||
every { this@mockk.conversation } returns expectedConversation
|
||||
every { this@mockk.messages } returns expectedMessages.messages
|
||||
every { this@mockk.messageIdToOpen } returns messageToOpen
|
||||
every { this@mockk.focusedMessageId } returns messageToOpen
|
||||
every { this@mockk.handle } returns mockk {
|
||||
every { disconnect() } returns Unit
|
||||
}
|
||||
@@ -102,7 +102,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
} returns watcherMock.right()
|
||||
coEvery {
|
||||
getRustConversation(mailbox, conversationId, showAll)
|
||||
} returns ConversationAndMessages(expectedConversation, messageToOpen, expectedMessages.messages).right()
|
||||
} returns ConversationAndMessages(expectedConversation, expectedMessages.messages, messageToOpen).right()
|
||||
|
||||
// When
|
||||
rustConversationQuery.observeConversationWithMessages(userId, conversationId, localLabelId, entryPoint, showAll)
|
||||
@@ -130,7 +130,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
val watcherMock = mockk<WatchedConversation> {
|
||||
every { this@mockk.conversation } returns expectedConversation
|
||||
every { this@mockk.messages } returns expectedMessages.messages
|
||||
every { this@mockk.messageIdToOpen } returns messageToOpen
|
||||
every { this@mockk.focusedMessageId } returns messageToOpen
|
||||
every { this@mockk.handle } returns mockk {
|
||||
every { disconnect() } returns Unit
|
||||
}
|
||||
@@ -145,7 +145,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
} returns watcherMock.right()
|
||||
coEvery {
|
||||
getRustConversation(mailbox, conversationId, showAll)
|
||||
} returns ConversationAndMessages(expectedConversation, messageToOpen, messages).right()
|
||||
} returns ConversationAndMessages(expectedConversation, messages, messageToOpen).right()
|
||||
rustConversationQuery.observeConversationWithMessages(userId, conversationId, localLabelId, entryPoint, showAll)
|
||||
.test {
|
||||
skipItems(1)
|
||||
@@ -155,13 +155,13 @@ internal class RustConversationDetailQueryImplTest {
|
||||
val updatedMessages = expectedMessages.copy(messageIdToOpen = updatedMessageToOpen)
|
||||
every { watcherMock.conversation } returns updatedConversation
|
||||
every { watcherMock.messages } returns updatedMessages.messages
|
||||
every { watcherMock.messageIdToOpen } returns messageToOpen
|
||||
every { watcherMock.focusedMessageId } returns messageToOpen
|
||||
coEvery {
|
||||
getRustConversation(mailbox, conversationId, showAll)
|
||||
} returns ConversationAndMessages(
|
||||
updatedConversation,
|
||||
updatedMessageToOpen,
|
||||
updatedMessages.messages
|
||||
updatedMessages.messages,
|
||||
updatedMessageToOpen
|
||||
).right()
|
||||
|
||||
// When
|
||||
@@ -191,7 +191,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
val watcherMock = mockk<WatchedConversation> {
|
||||
every { conversation } returns expectedConversation
|
||||
every { messages } returns expectedMessages.messages
|
||||
every { messageIdToOpen } returns messageToOpen
|
||||
every { focusedMessageId } returns messageToOpen
|
||||
every { handle } returns mockk {
|
||||
every { disconnect() } returns Unit
|
||||
}
|
||||
@@ -205,7 +205,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
} returns watcherMock.right()
|
||||
coEvery {
|
||||
getRustConversation(mailbox, conversationId, showAll)
|
||||
} returns ConversationAndMessages(expectedConversation, messageToOpen, expectedMessages.messages).right()
|
||||
} returns ConversationAndMessages(expectedConversation, expectedMessages.messages, messageToOpen).right()
|
||||
|
||||
rustConversationQuery.observeConversationWithMessages(userId, conversationId, localLabelId, entryPoint, showAll)
|
||||
.test {
|
||||
@@ -249,7 +249,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
val watcherMock1 = mockk<WatchedConversation> {
|
||||
every { conversation } returns expectedConversation1
|
||||
every { messages } returns expectedMessages.messages
|
||||
every { messageIdToOpen } returns messageToOpen
|
||||
every { focusedMessageId } returns messageToOpen
|
||||
every { handle } returns mockk {
|
||||
every { disconnect() } returns Unit
|
||||
}
|
||||
@@ -257,7 +257,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
val watcherMock2 = mockk<WatchedConversation> {
|
||||
every { conversation } returns expectedConversation2
|
||||
every { messages } returns expectedMessages.messages
|
||||
every { messageIdToOpen } returns messageToOpen
|
||||
every { focusedMessageId } returns messageToOpen
|
||||
every { handle } returns mockk {
|
||||
every { disconnect() } returns Unit
|
||||
}
|
||||
@@ -276,10 +276,10 @@ internal class RustConversationDetailQueryImplTest {
|
||||
} returns watcherMock2.right()
|
||||
coEvery {
|
||||
getRustConversation(mailbox, conversationId1, showAll)
|
||||
} returns ConversationAndMessages(expectedConversation1, messageToOpen, expectedMessages.messages).right()
|
||||
} returns ConversationAndMessages(expectedConversation1, expectedMessages.messages, messageToOpen).right()
|
||||
coEvery {
|
||||
getRustConversation(newMailbox, conversationId2, showAll)
|
||||
} returns ConversationAndMessages(expectedConversation2, messageToOpen, expectedMessages.messages).right()
|
||||
} returns ConversationAndMessages(expectedConversation2, expectedMessages.messages, messageToOpen).right()
|
||||
|
||||
// When - First conversation
|
||||
val job1 = launch {
|
||||
@@ -339,7 +339,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
val watcherMock1 = mockk<WatchedConversation> {
|
||||
every { conversation } returns expectedConversation1
|
||||
every { messages } returns expectedMessages.messages
|
||||
every { messageIdToOpen } returns messageToOpen
|
||||
every { focusedMessageId } returns messageToOpen
|
||||
every { handle } returns mockk {
|
||||
every { disconnect() } returns Unit
|
||||
}
|
||||
@@ -347,7 +347,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
val watcherMock2 = mockk<WatchedConversation> {
|
||||
every { conversation } returns expectedConversation2
|
||||
every { messages } returns expectedMessages.messages
|
||||
every { messageIdToOpen } returns messageToOpen
|
||||
every { focusedMessageId } returns messageToOpen
|
||||
every { handle } returns mockk {
|
||||
every { disconnect() } returns Unit
|
||||
}
|
||||
@@ -365,10 +365,10 @@ internal class RustConversationDetailQueryImplTest {
|
||||
} returns watcherMock2.right()
|
||||
coEvery {
|
||||
getRustConversation(mailbox, conversationId1, showAll)
|
||||
} returns ConversationAndMessages(expectedConversation1, messageToOpen, expectedMessages.messages).right()
|
||||
} returns ConversationAndMessages(expectedConversation1, expectedMessages.messages, messageToOpen).right()
|
||||
coEvery {
|
||||
getRustConversation(mailbox, conversationId2, showAll)
|
||||
} returns ConversationAndMessages(expectedConversation2, messageToOpen, expectedMessages.messages).right()
|
||||
} returns ConversationAndMessages(expectedConversation2, expectedMessages.messages, messageToOpen).right()
|
||||
|
||||
// When - First conversation
|
||||
val job1 = launch {
|
||||
@@ -424,7 +424,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
val watcherMock = mockk<WatchedConversation> {
|
||||
every { conversation } returns expectedConversation
|
||||
every { messages } returns expectedMessages.messages
|
||||
every { messageIdToOpen } returns messageToOpen
|
||||
every { focusedMessageId } returns messageToOpen
|
||||
every { handle } returns mockk {
|
||||
every { disconnect() } returns Unit
|
||||
}
|
||||
@@ -443,10 +443,10 @@ internal class RustConversationDetailQueryImplTest {
|
||||
} returns watcherMock.right()
|
||||
coEvery {
|
||||
getRustConversation(mailbox, conversationId, showAll1)
|
||||
} returns ConversationAndMessages(expectedConversation, messageToOpen, expectedMessages.messages).right()
|
||||
} returns ConversationAndMessages(expectedConversation, expectedMessages.messages, messageToOpen).right()
|
||||
coEvery {
|
||||
getRustConversation(mailbox, conversationId, showAll2)
|
||||
} returns ConversationAndMessages(expectedConversation, messageToOpen, expectedMessages.messages).right()
|
||||
} returns ConversationAndMessages(expectedConversation, expectedMessages.messages, messageToOpen).right()
|
||||
|
||||
// When - First conversation
|
||||
val job1 = launch {
|
||||
@@ -500,7 +500,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
val watcherMock = mockk<WatchedConversation> {
|
||||
every { conversation } returns expectedConversation
|
||||
every { messages } returns expectedMessages.messages
|
||||
every { messageIdToOpen } returns messageToOpen
|
||||
every { focusedMessageId } returns messageToOpen
|
||||
every { handle } returns mockk {
|
||||
every { disconnect() } returns Unit
|
||||
}
|
||||
@@ -518,7 +518,7 @@ internal class RustConversationDetailQueryImplTest {
|
||||
}
|
||||
coEvery {
|
||||
getRustConversation(mailbox, conversationId, showAll)
|
||||
} returns ConversationAndMessages(expectedConversation, messageToOpen, expectedMessages.messages).right()
|
||||
} returns ConversationAndMessages(expectedConversation, expectedMessages.messages, messageToOpen).right()
|
||||
|
||||
// When
|
||||
val numberOfConcurrentCalls = 10
|
||||
|
||||
-48
@@ -230,54 +230,6 @@ internal class RustConversationRepositoryImplTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `observeConversationMessages should return DataError when no messages found`() = runTest {
|
||||
// Given
|
||||
val userId = UserIdTestData.userId
|
||||
val conversationId = LocalConversationIdSample.AugConversation.toConversationId()
|
||||
val expectedError = ConversationError.ConvoWithNoMessages.left()
|
||||
val labelId = LabelId("2")
|
||||
val entryPoint = ConversationDetailEntryPoint.Mailbox
|
||||
val showAll = false
|
||||
|
||||
coEvery {
|
||||
rustConversationDataSource.observeConversationWithMessages(
|
||||
userId,
|
||||
conversationId.toLocalConversationId(),
|
||||
labelId.toLocalLabelId(),
|
||||
entryPoint,
|
||||
showAll
|
||||
)
|
||||
} returns flowOf(
|
||||
LocalConversationWithMessages(
|
||||
conversation = mockk(),
|
||||
messages = LocalConversationMessages(
|
||||
messageIdToOpen = LocalMessageIdSample.AugWeatherForecast,
|
||||
messages = emptyList()
|
||||
)
|
||||
).right()
|
||||
)
|
||||
|
||||
// When
|
||||
rustConversationRepository.observeConversationMessages(userId, conversationId, labelId, entryPoint, showAll)
|
||||
.test {
|
||||
val result = awaitItem()
|
||||
|
||||
// Then
|
||||
assertEquals(expectedError, result)
|
||||
coVerify {
|
||||
rustConversationDataSource.observeConversationWithMessages(
|
||||
userId,
|
||||
conversationId.toLocalConversationId(),
|
||||
labelId.toLocalLabelId(),
|
||||
entryPoint,
|
||||
showAll
|
||||
)
|
||||
}
|
||||
awaitComplete()
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `when getConversationCursor returns a cursor with the first conversationId`() = runTest {
|
||||
// Given
|
||||
|
||||
-1
@@ -26,7 +26,6 @@ sealed interface ConversationError {
|
||||
data object UnknownMessage : ConversationError
|
||||
data object UnknownContentId : ConversationError
|
||||
data object NullValueReturned : ConversationError
|
||||
data object ConvoWithNoMessages : ConversationError
|
||||
|
||||
data class Other(val error: DataError) : ConversationError
|
||||
}
|
||||
|
||||
+6
-7
@@ -22,7 +22,6 @@ import android.content.Context
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import arrow.core.Either
|
||||
import arrow.core.NonEmptyList
|
||||
import arrow.core.getOrElse
|
||||
import arrow.core.left
|
||||
import arrow.core.right
|
||||
@@ -595,8 +594,7 @@ class ConversationDetailViewModel @AssistedInject constructor(
|
||||
)
|
||||
}
|
||||
|
||||
error is ConversationError.ConvoWithNoMessages ||
|
||||
error is ConversationError.NullValueReturned -> {
|
||||
error is ConversationError.NullValueReturned -> {
|
||||
ConversationDataLoadingResult.Exit
|
||||
}
|
||||
|
||||
@@ -645,7 +643,7 @@ class ConversationDetailViewModel @AssistedInject constructor(
|
||||
|
||||
val initialScrollTo = initialScrollToMessageId
|
||||
?: conversationWithMessages.messages.messageIdToOpen
|
||||
.let { messageIdUiModelMapper.toUiModel(it) }
|
||||
?.let { messageIdUiModelMapper.toUiModel(it) }
|
||||
|
||||
val messagesEvent =
|
||||
if (stateIsLoadingOrOffline() && allCollapsed(conversationViewState.messagesState)) {
|
||||
@@ -655,7 +653,8 @@ class ConversationDetailViewModel @AssistedInject constructor(
|
||||
openedFromLocation
|
||||
)
|
||||
} else {
|
||||
val requestScrollTo = requestScrollToMessageId(conversationViewState.messagesState)
|
||||
val requestScrollTo =
|
||||
requestScrollToMessageId(conversationViewState.messagesState) ?: initialScrollTo
|
||||
ConversationDetailEvent.MessagesData(
|
||||
messagesUiModels,
|
||||
requestScrollTo,
|
||||
@@ -736,11 +735,11 @@ class ConversationDetailViewModel @AssistedInject constructor(
|
||||
}
|
||||
|
||||
private suspend fun buildMessagesUiModels(
|
||||
messages: NonEmptyList<Message>,
|
||||
messages: List<Message>,
|
||||
primaryUserAddress: String?,
|
||||
currentViewState: InMemoryConversationStateRepository.MessagesState,
|
||||
avatarImageStates: AvatarImageStates
|
||||
): NonEmptyList<ConversationDetailMessageUiModel> {
|
||||
): List<ConversationDetailMessageUiModel> {
|
||||
val messagesList = messages.map { message ->
|
||||
val avatarImageState = avatarImageStates.getStateForAddress(message.sender.address)
|
||||
val attachmentListExpandCollapseMode = currentViewState.attachmentsListExpandCollapseMode[message.messageId]
|
||||
|
||||
+1
-1
@@ -22,6 +22,6 @@ import ch.protonmail.android.mailcommon.data.mapper.LocalMessageId
|
||||
import ch.protonmail.android.mailcommon.data.mapper.LocalMessageMetadata
|
||||
|
||||
data class LocalConversationMessages(
|
||||
val messageIdToOpen: LocalMessageId,
|
||||
val messageIdToOpen: LocalMessageId?,
|
||||
val messages: List<LocalMessageMetadata>
|
||||
)
|
||||
|
||||
+2
-4
@@ -18,9 +18,7 @@
|
||||
|
||||
package ch.protonmail.android.mailmessage.domain.model
|
||||
|
||||
import arrow.core.NonEmptyList
|
||||
|
||||
data class ConversationMessages(
|
||||
val messages: NonEmptyList<Message>,
|
||||
val messageIdToOpen: MessageId
|
||||
val messages: List<Message>,
|
||||
val messageIdToOpen: MessageId?
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user