Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions app/src/main/kotlin/com/wire/android/di/AppModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ import com.wire.android.ui.home.conversations.MessageSharedState
import com.wire.android.ui.home.messagecomposer.location.LocationPickerParameters
import com.wire.android.util.dispatchers.DefaultDispatcherProvider
import com.wire.android.util.dispatchers.DispatcherProvider
import com.wire.android.util.ui.AndroidUiTextResolver
import com.wire.android.util.ui.UiTextResolver
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand Down Expand Up @@ -68,6 +70,11 @@ object AppModule {
@Provides
fun provideMessageResourceProvider(): MessageResourceProvider = MessageResourceProvider()

@Singleton
@Provides
fun provideUiTextResolver(@ApplicationContext appContext: Context): UiTextResolver =
AndroidUiTextResolver(appContext)

@Provides
fun provideNotificationManagerCompat(appContext: Context): NotificationManagerCompat =
NotificationManagerCompat.from(appContext)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.wire.android.ui.home.conversationslist.model.ConversationItem
import com.wire.android.ui.home.conversationslist.model.PlayingAudioInConversation
import com.wire.android.ui.home.conversationslist.showLegalHoldIndicator
import com.wire.android.util.ui.UiTextResolver
import com.wire.kalium.logic.data.conversation.ConversationDetails
import com.wire.kalium.logic.data.conversation.ConversationDetails.Connection
import com.wire.kalium.logic.data.conversation.ConversationDetails.Group
Expand All @@ -45,6 +46,7 @@
@Suppress("LongMethod")
fun ConversationDetailsWithEvents.toConversationItem(
userTypeMapper: UserTypeMapper,
uiTextResolver: UiTextResolver,
searchQuery: String,
selfUserTeamId: TeamId?,
playingAudioMessage: PlayingAudioMessage
Expand All @@ -55,7 +57,7 @@
conversationId = conversationDetails.conversation.id,
mutedStatus = conversationDetails.conversation.mutedStatus,
showLegalHoldIndicator = conversationDetails.conversation.legalHoldStatus.showLegalHoldIndicator(),
lastMessageContent = lastMessage.toUIPreview(unreadEventCount),
lastMessageContent = lastMessage.toUIPreview(unreadEventCount, uiTextResolver),
badgeEventType = parseConversationEventType(
mutedStatus = conversationDetails.conversation.mutedStatus,
unreadEventCount = unreadEventCount
Expand All @@ -82,7 +84,7 @@
conversationId = conversationDetails.conversation.id,
mutedStatus = conversationDetails.conversation.mutedStatus,
showLegalHoldIndicator = conversationDetails.conversation.legalHoldStatus.showLegalHoldIndicator(),
lastMessageContent = lastMessage.toUIPreview(unreadEventCount),
lastMessageContent = lastMessage.toUIPreview(unreadEventCount, uiTextResolver),

Check warning on line 87 in app/src/main/kotlin/com/wire/android/mapper/ConversationMapper.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/mapper/ConversationMapper.kt#L87

Added line #L87 was not covered by tests
badgeEventType = parseConversationEventType(
mutedStatus = conversationDetails.conversation.mutedStatus,
unreadEventCount = unreadEventCount
Expand Down Expand Up @@ -120,7 +122,7 @@
conversationId = conversationDetails.conversation.id,
mutedStatus = conversationDetails.conversation.mutedStatus,
showLegalHoldIndicator = conversationDetails.conversation.legalHoldStatus.showLegalHoldIndicator(),
lastMessageContent = lastMessage.toUIPreview(unreadEventCount),
lastMessageContent = lastMessage.toUIPreview(unreadEventCount, uiTextResolver),
badgeEventType = parsePrivateConversationEventType(
conversationDetails.otherUser.connectionStatus,
conversationDetails.otherUser.deleted,
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import com.wire.android.ui.home.conversations.model.UIMessageContent
import com.wire.android.ui.home.conversations.model.UIQuotedMessage
import com.wire.android.ui.home.conversations.model.messagetypes.image.VisualMediaParams
import com.wire.android.ui.markdown.toMarkdownDocument
import com.wire.android.ui.markdown.toMarkdownTextWithMentions
import com.wire.android.ui.theme.Accent
import com.wire.android.util.getVideoMetaData
import com.wire.android.util.time.ISOFormatter
Expand Down Expand Up @@ -109,7 +111,11 @@

MessageBody(
message = UIText.DynamicString(textContent.value, content.textContent?.mentions.orEmpty()),
quotedMessage = quotedMessage
quotedMessage = quotedMessage,
markdownDocument = UIText.DynamicString(
textContent.value,

Check warning on line 116 in app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt#L114-L116

Added lines #L114 - L116 were not covered by tests
content.textContent?.mentions.orEmpty()
).toMarkdownTextWithMentions().second.toMarkdownDocument()

Check warning on line 118 in app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt#L118

Added line #L118 was not covered by tests
)
}

Expand Down Expand Up @@ -177,9 +183,8 @@
null
}

return MessageBody(
when (content) {
is MessageContent.Text -> UIText.DynamicString(content.value, content.mentions)
val uiText = when (content) {
is MessageContent.Text -> UIText.DynamicString(content.value, content.mentions)
is MessageContent.Unknown -> content.typeName?.let {
UIText.StringResource(
messageResourceProvider.sentAMessageWithContent, it
Expand All @@ -193,8 +198,18 @@
}

else -> UIText.StringResource(R.string.sent_a_message_with_unknown_content)
},
quotedMessage = quotedMessage
}

val markdownDocument = if (uiText is UIText.DynamicString) {
uiText.toMarkdownTextWithMentions().second.toMarkdownDocument()
} else {
null
}

return MessageBody(
message = uiText,
quotedMessage = quotedMessage,
markdownDocument = markdownDocument
).let { messageBody ->
UIMessageContent.TextMessage(
messageBody = messageBody,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,12 @@ import com.wire.android.ui.home.conversations.model.messagetypes.image.ImageMess
import com.wire.android.ui.home.conversations.model.messagetypes.image.VisualMediaParams
import com.wire.android.ui.home.conversations.model.messagetypes.image.size
import com.wire.android.ui.markdown.DisplayMention
import com.wire.android.ui.markdown.MarkdownConstants.MENTION_MARK
import com.wire.android.ui.markdown.MarkdownDocument
import com.wire.android.ui.markdown.MessageColors
import com.wire.android.ui.markdown.NodeActions
import com.wire.android.ui.markdown.NodeData
import com.wire.android.ui.markdown.toMarkdownDocument
import com.wire.android.ui.markdown.toMarkdownTextWithMentions
import com.wire.android.ui.theme.Accent
import com.wire.android.ui.theme.wireColorScheme
import com.wire.android.ui.theme.wireDimensions
Expand Down Expand Up @@ -138,9 +138,7 @@ internal fun MessageBody(
accent = accent
)

val markdownDocument = remember(text) {
text?.toMarkdownDocument()
}
val markdownDocument = messageBody?.markdownDocument ?: remember(text) { text?.toMarkdownDocument() }

markdownDocument?.also {
MarkdownDocument(
Expand Down Expand Up @@ -391,28 +389,7 @@ fun MediaAssetImage(
*/
fun mapToDisplayMentions(uiText: UIText, resources: Resources): Pair<List<DisplayMention>, String> {
return if (uiText is UIText.DynamicString) {
val stringBuilder: StringBuilder = StringBuilder(uiText.value)
val mentions = uiText.mentions
.filter { it.start >= 0 && it.length > 0 }
.sortedBy { it.start }
.reversed()
val mentionList = mentions.mapNotNull { mention ->
// secured crash for mentions caused by web when text without mentions contains mention data
if (mention.start + mention.length <= uiText.value.length && uiText.value.elementAt(mention.start) == '@') {
val mentionName = uiText.value.substring(mention.start, mention.start + mention.length)
stringBuilder.insert(mention.start + mention.length, MENTION_MARK)
stringBuilder.insert(mention.start, MENTION_MARK)
DisplayMention(
mention.userId,
mention.length,
mention.isSelfMention,
mentionName
)
} else {
null
}
}.reversed()
Pair(mentionList, stringBuilder.toString())
uiText.toMarkdownTextWithMentions()
} else {
Pair(listOf(), uiText.asString(resources))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import com.wire.android.ui.home.conversationslist.model.Membership
import com.wire.android.ui.home.messagecomposer.SelfDeletionDuration
import com.wire.android.ui.markdown.MarkdownConstants
import com.wire.android.ui.markdown.MarkdownNode
import com.wire.android.ui.markdown.MarkdownPreview
import com.wire.android.ui.theme.Accent
import com.wire.android.util.Copyable
Expand Down Expand Up @@ -290,7 +291,9 @@
data class TextMessage(
val messageBody: MessageBody,
@Transient
val markdownPreview: MarkdownPreview? = null
val markdownPreview: MarkdownPreview? = null,
@Transient
val markdownLocaleTag: String? = null
) : UILastMessageContent

@Serializable
Expand All @@ -299,7 +302,9 @@
val message: UIText,
val separator: String = MarkdownConstants.NON_BREAKING_SPACE,
@Transient
val markdownPreview: MarkdownPreview? = null
val markdownPreview: MarkdownPreview? = null,

Check warning on line 305 in app/src/main/kotlin/com/wire/android/ui/home/conversations/model/UIMessage.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/model/UIMessage.kt#L305

Added line #L305 was not covered by tests
@Transient
val markdownLocaleTag: String? = null

Check warning on line 307 in app/src/main/kotlin/com/wire/android/ui/home/conversations/model/UIMessage.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/model/UIMessage.kt#L307

Added line #L307 was not covered by tests
) : UILastMessageContent

@Serializable
Expand Down Expand Up @@ -627,7 +632,9 @@
@Serializable
data class MessageBody(
val message: UIText,
val quotedMessage: UIQuotedMessage? = null
val quotedMessage: UIQuotedMessage? = null,
@Transient
val markdownDocument: MarkdownNode.Document? = null
)

enum class MessageSource {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import com.wire.android.mapper.toConversationItem
import com.wire.android.media.audiomessage.PlayingAudioMessage
import com.wire.android.ui.home.conversationslist.model.ConversationItem
import com.wire.android.util.dispatchers.DispatcherProvider
import com.wire.android.util.ui.UiTextResolver
import com.wire.kalium.logic.data.conversation.ConversationDetailsWithEvents
import com.wire.kalium.logic.data.conversation.ConversationFilter
import com.wire.kalium.logic.data.conversation.ConversationQueryConfig
Expand All @@ -48,6 +49,7 @@ class GetConversationsFromSearchUseCase @Inject constructor(
private val userTypeMapper: UserTypeMapper,
private val dispatchers: DispatcherProvider,
private val getSelfUser: GetSelfUserUseCase,
private val uiTextResolver: UiTextResolver,
) {
@Suppress("LongParameterList")
suspend operator fun invoke(
Expand Down Expand Up @@ -100,6 +102,7 @@ class GetConversationsFromSearchUseCase @Inject constructor(
pagingData.map {
it.toConversationItem(
userTypeMapper = userTypeMapper,
uiTextResolver = uiTextResolver,
searchQuery = searchQuery,
selfUserTeamId = getSelfUser()?.teamId,
playingAudioMessage = playingAudioMessage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import com.wire.android.ui.home.conversationslist.model.ConversationSection
import com.wire.android.ui.home.conversationslist.model.ConversationsSource
import com.wire.android.util.dispatchers.DispatcherProvider
import com.wire.android.util.ui.UiTextResolver
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.conversation.ConversationFilter
import com.wire.kalium.logic.data.conversation.MutedConversationStatus
Expand Down Expand Up @@ -108,6 +109,7 @@
@CurrentAccount val currentAccount: UserId,
private val userTypeMapper: UserTypeMapper,
private val getSelfUser: GetSelfUserUseCase,
private val uiTextResolver: UiTextResolver,
) : ConversationListViewModel, ViewModel() {

@AssistedFactory
Expand Down Expand Up @@ -225,6 +227,7 @@
conversations.map { conversationDetails ->
conversationDetails.toConversationItem(
userTypeMapper = userTypeMapper,
uiTextResolver = uiTextResolver,

Check warning on line 230 in app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationListViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationListViewModel.kt#L230

Added line #L230 was not covered by tests
searchQuery = searchQuery,
selfUserTeamId = getSelfUser()?.teamId,
playingAudioMessage = playingAudioMessage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,15 +123,17 @@ fun ConversationItemFactory(
when (val messageContent = conversation.lastMessageContent) {
is UILastMessageContent.TextMessage -> LastMessageSubtitle(
messageContent.messageBody.message,
messageContent.markdownPreview
messageContent.markdownPreview,
messageContent.markdownLocaleTag
)

is UILastMessageContent.MultipleMessage -> LastMultipleMessages(messageContent.messages, messageContent.separator)
is UILastMessageContent.SenderWithMessage -> LastMessageSubtitleWithAuthor(
messageContent.sender,
messageContent.message,
messageContent.separator,
messageContent.markdownPreview
messageContent.markdownPreview,
messageContent.markdownLocaleTag
)

is UILastMessageContent.Connection -> ConnectionLabel(connectionInfo = messageContent)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,29 +21,39 @@ package com.wire.android.ui.home.conversationslist.common
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.text.style.TextOverflow
import com.wire.android.ui.markdown.MarkdownConstants
import com.wire.android.ui.markdown.MarkdownInline
import com.wire.android.ui.markdown.MarkdownPreview
import com.wire.android.ui.markdown.MarkdownNode
import com.wire.android.ui.markdown.MessageColors
import com.wire.android.ui.markdown.NodeData
import com.wire.android.ui.markdown.getFirstInlines
import com.wire.android.ui.markdown.toMarkdownDocument
import com.wire.android.ui.theme.Accent
import com.wire.android.ui.theme.wireColorScheme
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.ui.UIText
import kotlinx.collections.immutable.persistentListOf

@Composable
fun LastMessageSubtitle(text: UIText, markdownPreview: MarkdownPreview? = null) {
LastMessageMarkdown(text = text.asString(), markdownPreview = markdownPreview)
fun LastMessageSubtitle(text: UIText, markdownPreview: MarkdownPreview? = null, markdownLocaleTag: String? = null) {
LastMessageMarkdown(text = text.asString(), markdownPreview = markdownPreview, markdownLocaleTag = markdownLocaleTag)
}

@Composable
fun LastMessageSubtitleWithAuthor(author: UIText, text: UIText, separator: String, markdownPreview: MarkdownPreview? = null) {
LastMessageMarkdown(text = text.asString(), leadingText = "${author.asString()}$separator", markdownPreview = markdownPreview)
fun LastMessageSubtitleWithAuthor(
author: UIText,
text: UIText,
separator: String,
markdownPreview: MarkdownPreview? = null,
markdownLocaleTag: String? = null
) {
LastMessageMarkdown(
text = text.asString(),
leadingText = "${author.asString()}$separator",
markdownPreview = markdownPreview,
markdownLocaleTag = markdownLocaleTag
)
}

@Composable
Expand All @@ -55,7 +65,8 @@ fun LastMultipleMessages(messages: List<UIText>, separator: String) {
private fun LastMessageMarkdown(
text: String,
leadingText: String = "",
markdownPreview: MarkdownPreview? = null
markdownPreview: MarkdownPreview? = null,
markdownLocaleTag: String? = null
) {
val nodeData = NodeData(
color = MaterialTheme.wireColorScheme.secondaryText,
Expand All @@ -69,22 +80,28 @@ private fun LastMessageMarkdown(
accent = Accent.Unknown
)

val effectivePreview = remember(text, markdownPreview) {
markdownPreview ?: text.toMarkdownDocument().getFirstInlines()
}

val leadingInlines = remember(leadingText) {
leadingText.toMarkdownDocument().getFirstInlines()?.children ?: persistentListOf()
}
val locales = LocalConfiguration.current.locales
val currentLocaleTag = if (locales.isEmpty) "" else locales[0].toLanguageTag()
val shouldUsePreview = markdownPreview != null && (markdownLocaleTag == null || markdownLocaleTag == currentLocaleTag)

if (effectivePreview != null) {
if (shouldUsePreview) {
val leadingInlines = if (leadingText.isBlank()) {
persistentListOf()
} else {
persistentListOf(
MarkdownNode.Inline.Text(
leadingText.replace(MarkdownConstants.NON_BREAKING_SPACE, " ")
)
)
}
MarkdownInline(
inlines = leadingInlines.plus(effectivePreview.children),
inlines = leadingInlines.plus(markdownPreview.children),
nodeData = nodeData
)
} else {
Text(
text = leadingText.replace(MarkdownConstants.NON_BREAKING_SPACE, " ") + text,
text = leadingText.replace(MarkdownConstants.NON_BREAKING_SPACE, " ") +
text.replace(MarkdownConstants.NON_BREAKING_SPACE, " "),
style = nodeData.style,
color = nodeData.color,
maxLines = 1,
Expand Down
Loading